ZGlmZiAtLWdpdCBhL05GRC8uZ2l0aWdub3JlIGIvTkZELy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyOWMzNAotLS0gL2Rldi9udWxsCisrKyBiL05GRC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsOCBAQAorLkRTKgorLndhZi0xKgorLndhZjMtKgorLmxvY2sqCisqKi8qLnB5YworYnVpbGQvCitWRVJTSU9OCit1bml0LXRlc3RzLmNvbmYKZGlmZiAtLWdpdCBhL05GRC8uZ2l0bW9kdWxlcyBiL05GRC8uZ2l0bW9kdWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjhmMmVlCi0tLSAvZGV2L251bGwKKysrIGIvTkZELy5naXRtb2R1bGVzCkBAIC0wLDAgKzEsMyBAQAorW3N1Ym1vZHVsZSAid2Vic29ja2V0cHAiXQorICAgIHBhdGggPSB3ZWJzb2NrZXRwcAorICAgIHVybCA9IGh0dHBzOi8vZ2l0aHViLmNvbS96YXBob3lkL3dlYnNvY2tldHBwLmdpdApkaWZmIC0tZ2l0IGEvTkZELy5qZW5raW5zIGIvTkZELy5qZW5raW5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3NGQ3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvLmplbmtpbnMKQEAgLTAsMCArMSwxMCBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorc2V0IC1lCisKK0RJUj0kKCBjZCAiJCggZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iICkiICYmIHB3ZCApCisKK2ZvciBmaWxlIGluICIkRElSIi8uamVua2lucy5kLyo7IGRvCisgICAgW1sgLWYgJGZpbGUgJiYgLXggJGZpbGUgXV0gfHwgY29udGludWUKKyAgICBlY2hvICJSdW46ICRmaWxlIgorICAgICIkZmlsZSIKK2RvbmUKZGlmZiAtLWdpdCBhL05GRC8uamVua2lucy5kLzAwLWRlcHMtbmRuLWN4eC5zaCBiL05GRC8uamVua2lucy5kLzAwLWRlcHMtbmRuLWN4eC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTFlM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZELy5qZW5raW5zLmQvMDAtZGVwcy1uZG4tY3h4LnNoCkBAIC0wLDAgKzEsMzkgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKK3NldCAteAorc2V0IC1lCisKK2NkIC90bXAKK0JVSUxEPSJubyIKK2lmIFsgISAtZCBuZG4tY3h4IF07IHRoZW4KKyAgICBnaXQgY2xvbmUgLS1kZXB0aCAxIGdpdDovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG4tY3h4CisgICAgY2QgbmRuLWN4eAorICAgIEJVSUxEPSJ5ZXMiCitlbHNlCisgICAgY2QgbmRuLWN4eAorICAgIElOU1RBTExFRF9WRVJTSU9OPWBnaXQgcmV2LXBhcnNlIEhFQUQgfHwgZWNobyBOT05FYAorICAgIHN1ZG8gcm0gLVJmIGxhdGVzdC12ZXJzaW9uCisgICAgZ2l0IGNsb25lIC0tZGVwdGggMSBnaXQ6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvbmRuLWN4eCBsYXRlc3QtdmVyc2lvbgorICAgIGNkIGxhdGVzdC12ZXJzaW9uCisgICAgTEFURVNUX1ZFUlNJT049YGdpdCByZXYtcGFyc2UgSEVBRCB8fCBlY2hvIFVOS05PV05gCisgICAgY2QgLi4KKyAgICBybSAtUmYgbGF0ZXN0LXZlcnNpb24KKyAgICBpZiBbICIkSU5TVEFMTEVEX1ZFUlNJT04iICE9ICIkTEFURVNUX1ZFUlNJT04iIF07IHRoZW4KKyAgICAgICAgY2QgLi4KKyAgICAgICAgc3VkbyBybSAtUmYgbmRuLWN4eAorICAgICAgICBnaXQgY2xvbmUgLS1kZXB0aCAxIGdpdDovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG4tY3h4CisgICAgICAgIGNkIG5kbi1jeHgKKyAgICAgICAgQlVJTEQ9InllcyIKKyAgICBmaQorZmkKKworc3VkbyBybSAtUmYgL3Vzci9sb2NhbC9pbmNsdWRlL25kbi1jeHgKK3N1ZG8gcm0gLWYgL3Vzci9sb2NhbC9saWIvbGlibmRuLWN4eCoKK3N1ZG8gcm0gLWYgL3Vzci9sb2NhbC9saWIvcGtnY29uZmlnL2xpYm5kbi1jeHgqCisKK2lmIFsgIiRCVUlMRCIgPSAieWVzIiBdOyB0aGVuCisgICAgc3VkbyAuL3dhZiBkaXN0Y2xlYW4gLWoxIC0tY29sb3I9eWVzCitmaQorCisuL3dhZiBjb25maWd1cmUgLWoxIC0tY29sb3I9eWVzIC0td2l0aG91dC1vc3gta2V5Y2hhaW4KKy4vd2FmIC1qMSAtLWNvbG9yPXllcworc3VkbyAuL3dhZiBpbnN0YWxsIC1qMSAtLWNvbG9yPXllcwpkaWZmIC0tZ2l0IGEvTkZELy5qZW5raW5zLmQvMTAtYnVpbGQuc2ggYi9ORkQvLmplbmtpbnMuZC8xMC1idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzRmZGYyCi0tLSAvZGV2L251bGwKKysrIGIvTkZELy5qZW5raW5zLmQvMTAtYnVpbGQuc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorc2V0IC14CitzZXQgLWUKKworZ2l0IHN1Ym1vZHVsZSBpbml0CitnaXQgc3VibW9kdWxlIHN5bmMKK2dpdCBzdWJtb2R1bGUgdXBkYXRlCisKK0NPVkVSQUdFPSQoIHB5dGhvbiAtYyAicHJpbnQgJy0td2l0aC1jb3ZlcmFnZScgaWYgJ2NvZGUtY292ZXJhZ2UnIGluICckSk9CX05BTUUnIGVsc2UgJyciICkKKworIyBDbGVhbnVwCitzdWRvIC4vd2FmIC1qMSAtLWNvbG9yPXllcyBkaXN0Y2xlYW4KKworIyBDb25maWd1cmUvYnVpbGQgaW4gZGVidWcgbW9kZQorLi93YWYgLWoxIC0tY29sb3I9eWVzIGNvbmZpZ3VyZSAtLXdpdGgtdGVzdHMgLS1kZWJ1ZworLi93YWYgLWoxIC0tY29sb3I9eWVzIGJ1aWxkCisKKyMgQ2xlYW51cAorc3VkbyAuL3dhZiAtajEgLS1jb2xvcj15ZXMgZGlzdGNsZWFuCisKKyMgQ29uZmlndXJlL2J1aWxkIGluIG9wdGltaXplZCBtb2RlIHdpdGhvdXQgdGVzdHMgd2l0aCBwcmVjb21waWxlZCBoZWFkZXJzCisuL3dhZiAtajEgLS1jb2xvcj15ZXMgY29uZmlndXJlCisuL3dhZiAtajEgLS1jb2xvcj15ZXMgYnVpbGQKKworIyBDbGVhbnVwCitzdWRvIC4vd2FmIC1qMSAtLWNvbG9yPXllcyBkaXN0Y2xlYW4KKworIyBDb25maWd1cmUvYnVpbGQgaW4gb3B0aW1pemVkIG1vZGUKKy4vd2FmIC1qMSAtLWNvbG9yPXllcyBjb25maWd1cmUgLS13aXRoLXRlc3RzIC0td2l0aG91dC1wY2ggJENPVkVSQUdFCisuL3dhZiAtajEgLS1jb2xvcj15ZXMgYnVpbGQKKworIyAodGVzdHMgd2lsbCBiZSBydW4gYWdhaW5zdCBvcHRpbWl6ZWQgdmVyc2lvbikKKworIyBJbnN0YWxsCitzdWRvIC4vd2FmIC1qMSAtLWNvbG9yPXllcyBpbnN0YWxsCmRpZmYgLS1naXQgYS9ORkQvLmplbmtpbnMuZC8yMC10ZXN0cy5zaCBiL05GRC8uamVua2lucy5kLzIwLXRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzODVmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvLmplbmtpbnMuZC8yMC10ZXN0cy5zaApAQCAtMCwwICsxLDMzIEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLXgKK3NldCAtZQorCisjIFByZXBhcmUgZW52aXJvbm1lbnQKK3JtIC1SZiB+Ly5uZG54IH4vLm5kbgorCitlY2hvICROT0RFX0xBQkVMUworSVNfT1NYPSQoIHB5dGhvbiAtYyAicHJpbnQgJ3llcycgaWYgJ09TWCcgaW4gJyROT0RFX0xBQkVMUycuc3RyaXAoKS5zcGxpdCgnICcpIGVsc2UgJ25vJyIgKQorSVNfTElOVVg9JCggcHl0aG9uIC1jICJwcmludCAneWVzJyBpZiAnTGludXgnIGluICckTk9ERV9MQUJFTFMnLnN0cmlwKCkuc3BsaXQoJyAnKSBlbHNlICdubyciICkKKworaWYgW1sgJElTX09TWCA9PSAieWVzIiBdXTsgdGhlbgorICBzZWN1cml0eSB1bmxvY2sta2V5Y2hhaW4gLXAgIm5hbWVkLWRhdGEiCisgIHN1ZG8gY2hncnAgYWRtaW4gL2Rldi9icGYqCisgIHN1ZG8gY2htb2QgZytydyAvZGV2L2JwZioKK2ZpCitpZiBbWyAkSVNfTElOVVggPSAieWVzIiBdXTsgdGhlbgorICBzdWRvIHNldGNhcCBjYXBfbmV0X3JhdyxjYXBfbmV0X2FkbWluPWVpcCBgcHdkYC9idWlsZC91bml0LXRlc3RzLWNvcmUgfHwgdHJ1ZQorICBzdWRvIHNldGNhcCBjYXBfbmV0X3JhdyxjYXBfbmV0X2FkbWluPWVpcCBgcHdkYC9idWlsZC91bml0LXRlc3RzLWRhZW1vbiB8fCB0cnVlCisgIHN1ZG8gc2V0Y2FwIGNhcF9uZXRfcmF3LGNhcF9uZXRfYWRtaW49ZWlwIGBwd2RgL2J1aWxkL3VuaXQtdGVzdHMtcmliIHx8IHRydWUKK2ZpCisKK25kbnNlYy1rZXlnZW4gIi90bXAvamVua2lucy8kTk9ERV9OQU1FIiB8IG5kbnNlYy1pbnN0YWxsLWNlcnQgLQorCisjIFJ1biB1bml0IHRlc3RzCisjIENvcmUKKy4vYnVpbGQvdW5pdC10ZXN0cy1jb3JlIC1sIHRlc3Rfc3VpdGUKKworIyBEYWVtb24KKy4vYnVpbGQvdW5pdC10ZXN0cy1kYWVtb24gLWwgdGVzdF9zdWl0ZQorCisjIFJJQgorLi9idWlsZC91bml0LXRlc3RzLXJpYiAtbCB0ZXN0X3N1aXRlCmRpZmYgLS1naXQgYS9ORkQvLmplbmtpbnMuZC8zMC1jb3ZlcmFnZS5zaCBiL05GRC8uamVua2lucy5kLzMwLWNvdmVyYWdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NjI4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvLmplbmtpbnMuZC8zMC1jb3ZlcmFnZS5zaApAQCAtMCwwICsxLDEwIEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLXgKK3NldCAtZQorCitJU19DT1ZSPSQoIHB5dGhvbiAtYyAicHJpbnQgJ3llcycgaWYgJ2NvZGUtY292ZXJhZ2UnIGluICckSk9CX05BTUUnIGVsc2UgJ25vJyIgKQorCitpZiBbWyAkSVNfQ09WUiA9PSAieWVzIiBdXTsgdGhlbgorICBCQVNFPSJgcHdkIHwgc2VkIC1lICdzfC98XFxcL3xnJ2BcXCIKKyAgKGNkIGJ1aWxkICYmIGdjb3ZyIC14IC1mICRCQVNFL2NvcmUgLWYgJEJBU0UvZGFlbW9uIC1mICRCQVNFL3JpYiAtciAuLi8gLW8gY292ZXJhZ2UueG1sIC4vKQorZmkKZGlmZiAtLWdpdCBhL05GRC8udHJhdmlzLnltbCBiL05GRC8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU0YjJjCi0tLSAvZGV2L251bGwKKysrIGIvTkZELy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMTUgQEAKKyMgRm9yIFVidW50dSBvbmx5CitsYW5ndWFnZTogY3BwCitvczoKKyAgLSBsaW51eAorY29tcGlsZXI6CisgIC0gZ2NjCitub3RpZmljYXRpb25zOgorICBlbWFpbDoKKyAgICBvbl9zdWNjZXNzOiBhbHdheXMKKyAgICBvbl9mYWlsdXJlOiBhbHdheXMKK2JlZm9yZV9pbnN0YWxsOgorICAtIHRyYXZpc19yZXRyeSBzdWRvIGFwdC1nZXQgdXBkYXRlCisgIC0gdHJhdmlzX3JldHJ5IHN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJzc2wtZGV2IGxpYnBjYXAtZGV2IGxpYmJvb3N0MS40OC1hbGwtZGV2IGxpYmNyeXB0bysrLWRldiBsaWJzcWxpdGUzLWRldgorc2NyaXB0OgorICAtIC4vLmplbmtpbnMKZGlmZiAtLWdpdCBhL05GRC8ud2FmLXRvb2xzL2Jvb3N0LWtxdWV1ZS5weSBiL05GRC8ud2FmLXRvb2xzL2Jvb3N0LWtxdWV1ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQ1MTM5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZELy53YWYtdG9vbHMvYm9vc3Qta3F1ZXVlLnB5CkBAIC0wLDAgKzEsMjMgQEAKKyMgLSotIE1vZGU6IHB5dGhvbjsgcHktaW5kZW50LW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjb2Rpbmc6IHV0Zi04OyAtKi0KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyMKKyMgR1BMIDMuMCBsaWNlbnNlLCBzZWUgdGhlIENPUFlJTkcubWQgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorCitmcm9tIHdhZmxpYiBpbXBvcnQgQ29uZmlndXJlCisKK0JPT1NUX0FTSU9fSEFTX0tRVUVVRV9DSEVDSyA9ICcnJworI2luY2x1ZGUgPGJvb3N0L2FzaW8uaHBwPgorI2lmIGRlZmluZWQoQk9PU1RfQVNJT19IQVNfS1FVRVVFKSBhbmQgQk9PU1RfVkVSU0lPTiA9PSAxMDU2MDAKKyNlcnJvciAiRXRoZXJuZXQgZmFjZSBzdXBwb3J0IGNhbm5vdCBiZSBlbmFibGVkIG9uIHRoaXMgcGxhdGZvcm0gd2l0aCBib29zdCAxLjU2IgorI2VuZGlmCisnJycKKworQENvbmZpZ3VyZS5jb25mCitkZWYgY2hlY2tfYXNpb19wY2FwX3N1cHBvcnQoY29uZik6CisgICAgIyBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYy9ib29zdC90aWNrZXQvMTAzNjcKKyAgICBpZiBjb25mLmNoZWNrX2N4eChtc2c9J0NoZWNraW5nIGlmIEV0aGVybmV0IGZhY2Ugc3VwcG9ydCBjYW4gYmUgZW5hYmxlZCcsCisgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQ9Qk9PU1RfQVNJT19IQVNfS1FVRVVFX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzPSdjeHgnLCB1c2U9J0JPT1NUJywgbWFuZGF0b3J5PUZhbHNlKToKKyAgICAgICAgY29uZi5kZWZpbmUoJ0hBVkVfQVNJT19QQ0FQX1NVUFBPUlQnLCAxKQorICAgICAgICBjb25mLmVudlsnSEFWRV9BU0lPX1BDQVBfU1VQUE9SVCddID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvTkZELy53YWYtdG9vbHMvYm9vc3QucHkgYi9ORkQvLndhZi10b29scy9ib29zdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU5NDVhCi0tLSAvZGV2L251bGwKKysrIGIvTkZELy53YWYtdG9vbHMvYm9vc3QucHkKQEAgLTAsMCArMSwzNzggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgcGFydGlhbGx5IGJhc2VkIG9uIGJvb3N0LnB5IHdyaXR0ZW4gYnkgR2Vybm90IFZvcm1heXIKKyMgd3JpdHRlbiBieSBSdWVkaWdlciBTb25kZXJmZWxkIDxydWVkaWdlckBjLXBsdXNwbHVzLmRlPiwgMjAwOAorIyBtb2RpZmllZCBieSBCam9lcm4gTWljaGFlbHNlbiwgMjAwOAorIyBtb2RpZmllZCBieSBMdWNhIEZvc3NhdGksIDIwMDgKKyMgcmV3cml0dGVuIGZvciB3YWYgMS41LjEsIFRob21hcyBOYWd5LCAyMDA4CisjIHJld3JpdHRlbiBmb3Igd2FmIDEuNi4yLCBTeWx2YWluIFJvdXF1ZXR0ZSwgMjAxMQorCisnJycKKworVGhpcyBpcyBhbiBleHRyYSB0b29sLCBub3QgYnVuZGxlZCB3aXRoIHRoZSBkZWZhdWx0IHdhZiBiaW5hcnkuCitUbyBhZGQgdGhlIGJvb3N0IHRvb2wgdG8gdGhlIHdhZiBmaWxlOgorJCAuL3dhZi1saWdodCAtLXRvb2xzPWNvbXBhdDE1LGJvb3N0CisJb3IsIGlmIHlvdSBoYXZlIHdhZiA+PSAxLjYuMgorJCAuL3dhZiB1cGRhdGUgLS1maWxlcz1ib29zdAorCitXaGVuIHVzaW5nIHRoaXMgdG9vbCwgdGhlIHdzY3JpcHQgd2lsbCBsb29rIGxpa2U6CisKKwlkZWYgb3B0aW9ucyhvcHQpOgorCQlvcHQubG9hZCgnY29tcGlsZXJfY3h4IGJvb3N0JykKKworCWRlZiBjb25maWd1cmUoY29uZik6CisJCWNvbmYubG9hZCgnY29tcGlsZXJfY3h4IGJvb3N0JykKKwkJY29uZi5jaGVja19ib29zdChsaWI9J3N5c3RlbSBmaWxlc3lzdGVtJykKKworCWRlZiBidWlsZChibGQpOgorCQlibGQoc291cmNlPSdtYWluLmNwcCcsIHRhcmdldD0nYXBwJywgdXNlPSdCT09TVCcpCisKK09wdGlvbnMgYXJlIGdlbmVyYXRlZCwgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgYm9vc3QgaW5jbHVkZXMvbGlicmFyaWVzLgorVGhlIGBjaGVja19ib29zdGAgY29uZmlndXJhdGlvbiBmdW5jdGlvbiBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgdXNlZCBib29zdCBsaWJyYXJpZXMuCitJdCBjYW4gYWxzbyBwcm92aWRlIGRlZmF1bHQgYXJndW1lbnRzIHRvIHRoZSAtLWJvb3N0LXN0YXRpYyBhbmQgLS1ib29zdC1tdCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorRXZlcnl0aGluZyB3aWxsIGJlIHBhY2thZ2VkIHRvZ2V0aGVyIGluIGEgQk9PU1QgY29tcG9uZW50IHRoYXQgeW91IGNhbiB1c2UuCisKK1doZW4gdXNpbmcgTVNWQywgYSBsb3Qgb2YgY29tcGlsYXRpb24gZmxhZ3MgbmVlZCB0byBtYXRjaCB5b3VyIEJPT1NUIGJ1aWxkIGNvbmZpZ3VyYXRpb246CisgLSB5b3UgbWF5IGhhdmUgdG8gYWRkIC9FSHNjIHRvIHlvdXIgQ1hYRkxBR1Mgb3IgZGVmaW5lIGJvb3N0Ojp0aHJvd19leGNlcHRpb24gaWYgQk9PU1RfTk9fRVhDRVBUSU9OUyBpcyBkZWZpbmVkLgorICAgRXJyb3JzOiBDNDUzMAorIC0gYm9vc3QgbGlicmFyaWVzIHdpbGwgdHJ5IHRvIGJlIHNtYXJ0IGFuZCB1c2UgdGhlIChwcmV0dHkgYnV0IG9mdGVuIG5vdCB1c2VmdWwpIGF1dG8tbGlua2luZyBmZWF0dXJlIG9mIE1TVkMKKyAgIFNvIGJlZm9yZSBjYWxsaW5nIGBjb25mLmNoZWNrX2Jvb3N0YCB5b3UgbWlnaHQgd2FudCB0byBkaXNhYmxpbmcgYnkgYWRkaW5nOgorICAgCWNvbmYuZW52LkRFRklORVNfQk9PU1QgKz0gWydCT09TVF9BTExfTk9fTElCJ10KKyAgIEVycm9yczoKKyAtIGJvb3N0IG1pZ2h0IGFsc28gYmUgY29tcGlsZWQgd2l0aCAvTVQsIHdoaWNoIGxpbmtzIHRoZSBydW50aW1lIHN0YXRpY2FsbHkuCisgICBJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHJlZGVmaW5lZCBzeW1ib2xzLAorCQlzZWxmLmVudlsnREVGSU5FU18lcycgJSB2YXJdICs9IFsnQk9PU1RfQUxMX05PX0xJQiddCisJCXNlbGYuZW52WydDWFhGTEFHU18lcycgJSB2YXJdICs9IFsnL01EJywgJy9FSHNjJ10KK1Bhc3NpbmcgYC0tYm9vc3QtbGlua2FnZV9hdXRvZGV0ZWN0YCBtaWdodCBoZWxwIGVuc3VyaW5nIGhhdmluZyBhIGNvcnJlY3QgbGlua2FnZSBpbiBzb21lIGJhc2ljIGNhc2VzLgorCisnJycKKworaW1wb3J0IHN5cworaW1wb3J0IHJlCitmcm9tIHdhZmxpYiBpbXBvcnQgVXRpbHMsIExvZ3MsIEVycm9ycworZnJvbSB3YWZsaWIuQ29uZmlndXJlIGltcG9ydCBjb25mCisKK0JPT1NUX0xJQlMgPSBbJy91c3IvbGliJywgJy91c3IvbG9jYWwvbGliJywgJy9vcHQvbG9jYWwvbGliJywgJy9zdy9saWInLCAnL2xpYicsICcvdXNyL2xpYi94ODZfNjQtbGludXgtZ251JywgJy91c3IvbGliL2kzODYtbGludXgtZ251JywgJy91c3IvbG9jYWwvbmRuL2xpYiddCitCT09TVF9JTkNMVURFUyA9IFsnL3Vzci9pbmNsdWRlJywgJy91c3IvbG9jYWwvaW5jbHVkZScsICcvb3B0L2xvY2FsL2luY2x1ZGUnLCAnL3N3L2luY2x1ZGUnLCAnL3Vzci9sb2NhbC9uZG4vaW5jbHVkZSddCitCT09TVF9WRVJTSU9OX0ZJTEUgPSAnYm9vc3QvdmVyc2lvbi5ocHAnCitCT09TVF9WRVJTSU9OX0NPREUgPSAnJycKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KK2ludCBtYWluKCkgeyBzdGQ6OmNvdXQgPDwgQk9PU1RfTElCX1ZFUlNJT04gPDwgIjoiIDw8IEJPT1NUX1ZFUlNJT04gPDwgc3RkOjplbmRsOyB9CisnJycKK0JPT1NUX1NZU1RFTV9DT0RFID0gJycnCisjaW5jbHVkZSA8Ym9vc3Qvc3lzdGVtL2Vycm9yX2NvZGUuaHBwPgoraW50IG1haW4oKSB7IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgYzsgfQorJycnCitCT09TVF9USFJFQURfQ09ERSA9ICcnJworI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CitpbnQgbWFpbigpIHsgYm9vc3Q6OnRocmVhZCB0OyB9CisnJycKKworIyB0b29sc2V0cyBmcm9tIHtib29zdF9kaXJ9L3Rvb2xzL2J1aWxkL3YyL3Rvb2xzL2NvbW1vbi5qYW0KK1BMQVRGT1JNID0gVXRpbHMudW52ZXJzaW9uZWRfc3lzX3BsYXRmb3JtKCkKK2RldGVjdF9pbnRlbCA9IGxhbWJkYSBlbnY6IChQTEFURk9STSA9PSAnd2luMzInKSBhbmQgJ2l3JyBvciAnaWwnCitkZXRlY3RfY2xhbmcgPSBsYW1iZGEgZW52OiAoUExBVEZPUk0gPT0gJ2RhcndpbicpIGFuZCAnY2xhbmctZGFyd2luJyBvciAnY2xhbmcnCitkZXRlY3RfbWluZ3cgPSBsYW1iZGEgZW52OiAocmUuc2VhcmNoKCdNaW5HVycsIGVudi5DWFhbMF0pKSBhbmQgJ21ndycgb3IgJ2djYycKK0JPT1NUX1RPT0xTRVRTID0geworCSdib3JsYW5kJzogICdiY2InLAorCSdjbGFuZyc6CWRldGVjdF9jbGFuZywKKwknY29tbyc6CSAnY29tbycsCisJJ2N3JzoJICAgJ2N3JywKKwknZGFyd2luJzogICAneGdjYycsCisJJ2VkZyc6CSAgJ2VkZycsCisJJ2crKyc6CSAgZGV0ZWN0X21pbmd3LAorCSdnY2MnOgkgIGRldGVjdF9taW5ndywKKwknaWNwYyc6CSBkZXRlY3RfaW50ZWwsCisJJ2ludGVsJzoJZGV0ZWN0X2ludGVsLAorCSdrY2MnOgkgICdrY2MnLAorCSdreWxpeCc6CSdiY2snLAorCSdtaXBzcHJvJzogICdtcCcsCisJJ21pbmd3JzoJJ21ndycsCisJJ21zdmMnOgkgJ3ZjJywKKwkncWNjJzoJICAncWNjJywKKwknc3VuJzoJICAnc3cnLAorCSdzdW5jKysnOiAgICdzdycsCisJJ3RydTY0Y3h4JzogJ3RydScsCisJJ3ZhY3BwJzoJJ3hsYycKK30KKworCitkZWYgb3B0aW9ucyhvcHQpOgorCW9wdCA9IG9wdC5hZGRfb3B0aW9uX2dyb3VwKCdCb29zdCBPcHRpb25zJykKKworCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LWluY2x1ZGVzJywgdHlwZT0nc3RyaW5nJywKKwkJCQkgICBkZWZhdWx0PScnLCBkZXN0PSdib29zdF9pbmNsdWRlcycsCisJCQkJICAgaGVscD0nJydwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGJvb3N0IGluY2x1ZGVzIGFyZSwgZS5nLiwgL3BhdGgvdG8vYm9vc3RfMV81NV8wL3N0YWdlL2luY2x1ZGUnJycpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtbGlicycsIHR5cGU9J3N0cmluZycsCisJCQkJICAgZGVmYXVsdD0nJywgZGVzdD0nYm9vc3RfbGlicycsCisJCQkJICAgaGVscD0nJydwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGJvb3N0IGxpYnMgYXJlLCBlLmcuLCAvcGF0aC90by9ib29zdF8xXzU1XzAvc3RhZ2UvbGliJycnKQorCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LXN0YXRpYycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisJCQkJICAgZGVmYXVsdD1GYWxzZSwgZGVzdD0nYm9vc3Rfc3RhdGljJywKKwkJCQkgICBoZWxwPSdsaW5rIHdpdGggc3RhdGljIGJvb3N0IGxpYnJhcmllcyAoLmxpYi8uYSknKQorCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LW10JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKwkJCQkgICBkZWZhdWx0PUZhbHNlLCBkZXN0PSdib29zdF9tdCcsCisJCQkJICAgaGVscD0nc2VsZWN0IG11bHRpLXRocmVhZGVkIGxpYnJhcmllcycpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtYWJpJywgdHlwZT0nc3RyaW5nJywgZGVmYXVsdD0nJywgZGVzdD0nYm9vc3RfYWJpJywKKwkJCQkgICBoZWxwPScnJ3NlbGVjdCBsaWJyYXJpZXMgd2l0aCB0YWdzIChkZ3N5cCwgZCBmb3IgZGVidWcpLCBzZWUgZG9jIEJvb3N0LCBHZXR0aW5nIFN0YXJ0ZWQsIGNoYXB0ZXIgNi4xJycnKQorCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LWxpbmthZ2VfYXV0b2RldGVjdCcsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9J2Jvb3N0X2xpbmthZ2VfYXV0b2RldGVjdCcsCisJCQkJICAgaGVscD0iYXV0by1kZXRlY3QgYm9vc3QgbGlua2FnZSBvcHRpb25zIChkb24ndCBnZXQgdXNlZCB0byBpdCAvIG1pZ2h0IGJyZWFrIG90aGVyIHN0dWZmKSIpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtdG9vbHNldCcsIHR5cGU9J3N0cmluZycsCisJCQkJICAgZGVmYXVsdD0nJywgZGVzdD0nYm9vc3RfdG9vbHNldCcsCisJCQkJICAgaGVscD0nZm9yY2UgYSB0b29sc2V0IGUuZy4gbXN2YywgdmM5MCwgZ2NjLCBtaW5ndywgbWd3NDUgKGRlZmF1bHQ6IGF1dG8pJykKKwlweV92ZXJzaW9uID0gJyVkJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtcHl0aG9uJywgdHlwZT0nc3RyaW5nJywKKwkJCQkgICBkZWZhdWx0PXB5X3ZlcnNpb24sIGRlc3Q9J2Jvb3N0X3B5dGhvbicsCisJCQkJICAgaGVscD0nc2VsZWN0IHRoZSBsaWIgcHl0aG9uIHdpdGggdGhpcyB2ZXJzaW9uIChkZWZhdWx0OiAlcyknICUgcHlfdmVyc2lvbikKKworCitAY29uZgorZGVmIF9fYm9vc3RfZ2V0X3ZlcnNpb25fZmlsZShzZWxmLCBkKToKKwlkbm9kZSA9IHNlbGYucm9vdC5maW5kX2RpcihkKQorCWlmIGRub2RlOgorCQlyZXR1cm4gZG5vZGUuZmluZF9ub2RlKEJPT1NUX1ZFUlNJT05fRklMRSkKKwlyZXR1cm4gTm9uZQorCitAY29uZgorZGVmIGJvb3N0X2dldF92ZXJzaW9uKHNlbGYsIGQpOgorCSIiInNpbGVudGx5IHJldHJpZXZlIHRoZSBib29zdCB2ZXJzaW9uIG51bWJlciIiIgorCW5vZGUgPSBzZWxmLl9fYm9vc3RfZ2V0X3ZlcnNpb25fZmlsZShkKQorCWlmIG5vZGU6CisJCXRyeToKKwkJCXR4dCA9IG5vZGUucmVhZCgpCisJCWV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CisJCQlMb2dzLmVycm9yKCJDb3VsZCBub3QgcmVhZCB0aGUgZmlsZSAlciIgJSBub2RlLmFic3BhdGgoKSkKKwkJZWxzZToKKwkJCXJlX2J1dDEgPSByZS5jb21waWxlKCdeI2RlZmluZVxccytCT09TVF9MSUJfVkVSU0lPTlxccysiKC4rKSInLCByZS5NKQorCQkJbTEgPSByZV9idXQxLnNlYXJjaCh0eHQpCisKKwkJCXJlX2J1dDIgPSByZS5jb21waWxlKCdeI2RlZmluZVxccytCT09TVF9WRVJTSU9OXFxzKyhcXGQrKScsIHJlLk0pCisJCQltMiA9IHJlX2J1dDIuc2VhcmNoKHR4dCkKKworCQkJaWYgbTEgYW5kIG0yOgorCQkJCXJldHVybiAobTEuZ3JvdXAoMSksIG0yLmdyb3VwKDEpKQorCisJcmV0dXJuIHNlbGYuY2hlY2tfY3h4KGZyYWdtZW50PUJPT1NUX1ZFUlNJT05fQ09ERSwgaW5jbHVkZXM9W2RdLCBleGVjdXRlPVRydWUsIGRlZmluZV9yZXQ9VHJ1ZSkuc3BsaXQoIjoiKQorCitAY29uZgorZGVmIGJvb3N0X2dldF9pbmNsdWRlcyhzZWxmLCAqaywgKiprdyk6CisJaW5jbHVkZXMgPSBrIGFuZCBrWzBdIG9yIGt3LmdldCgnaW5jbHVkZXMnLCBOb25lKQorCWlmIGluY2x1ZGVzIGFuZCBzZWxmLl9fYm9vc3RfZ2V0X3ZlcnNpb25fZmlsZShpbmNsdWRlcyk6CisJCXJldHVybiBpbmNsdWRlcworCWZvciBkIGluIFV0aWxzLnRvX2xpc3Qoc2VsZi5lbnZpcm9uLmdldCgnSU5DTFVERScsICcnKSkgKyBCT09TVF9JTkNMVURFUzoKKwkJaWYgc2VsZi5fX2Jvb3N0X2dldF92ZXJzaW9uX2ZpbGUoZCk6CisJCQlyZXR1cm4gZAorCWlmIGluY2x1ZGVzOgorCQlzZWxmLmVuZF9tc2coJ2hlYWRlcnMgbm90IGZvdW5kIGluICVzJyAlIGluY2x1ZGVzKQorCQlzZWxmLmZhdGFsKCdUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQnKQorCWVsc2U6CisJCXNlbGYuZW5kX21zZygnaGVhZGVycyBub3QgZm91bmQsIHBsZWFzZSBwcm92aWRlIGEgLS1ib29zdC1pbmNsdWRlcyBhcmd1bWVudCAoc2VlIGhlbHApJykKKwkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKworCitAY29uZgorZGVmIGJvb3N0X2dldF90b29sc2V0KHNlbGYsIGNjKToKKwl0b29sc2V0ID0gY2MKKwlpZiBub3QgY2M6CisJCWJ1aWxkX3BsYXRmb3JtID0gVXRpbHMudW52ZXJzaW9uZWRfc3lzX3BsYXRmb3JtKCkKKwkJaWYgYnVpbGRfcGxhdGZvcm0gaW4gQk9PU1RfVE9PTFNFVFM6CisJCQljYyA9IGJ1aWxkX3BsYXRmb3JtCisJCWVsc2U6CisJCQljYyA9IHNlbGYuZW52LkNYWF9OQU1FCisJaWYgY2MgaW4gQk9PU1RfVE9PTFNFVFM6CisJCXRvb2xzZXQgPSBCT09TVF9UT09MU0VUU1tjY10KKwlyZXR1cm4gaXNpbnN0YW5jZSh0b29sc2V0LCBzdHIpIGFuZCB0b29sc2V0IG9yIHRvb2xzZXQoc2VsZi5lbnYpCisKKworQGNvbmYKK2RlZiBfX2Jvb3N0X2dldF9saWJzX3BhdGgoc2VsZiwgKmssICoqa3cpOgorCScnJyByZXR1cm4gdGhlIGxpYiBwYXRoIGFuZCBhbGwgdGhlIGZpbGVzIGluIGl0ICcnJworCWlmICdmaWxlcycgaW4ga3c6CisJCXJldHVybiBzZWxmLnJvb3QuZmluZF9kaXIoJy4nKSwgVXRpbHMudG9fbGlzdChrd1snZmlsZXMnXSkKKwlsaWJzID0gayBhbmQga1swXSBvciBrdy5nZXQoJ2xpYnMnLCBOb25lKQorCWlmIGxpYnM6CisJCXBhdGggPSBzZWxmLnJvb3QuZmluZF9kaXIobGlicykKKwkJZmlsZXMgPSBwYXRoLmFudF9nbG9iKCcqYm9vc3RfKicpCisJaWYgbm90IGxpYnMgb3Igbm90IGZpbGVzOgorCQlmb3IgZCBpbiBVdGlscy50b19saXN0KHNlbGYuZW52aXJvbi5nZXQoJ0xJQicsIFtdKSkgKyBCT09TVF9MSUJTOgorCQkJcGF0aCA9IHNlbGYucm9vdC5maW5kX2RpcihkKQorCQkJaWYgcGF0aDoKKwkJCQlmaWxlcyA9IHBhdGguYW50X2dsb2IoJypib29zdF8qJykKKwkJCQlpZiBmaWxlczoKKwkJCQkJYnJlYWsKKwkJCXBhdGggPSBzZWxmLnJvb3QuZmluZF9kaXIoZCArICc2NCcpCisJCQlpZiBwYXRoOgorCQkJCWZpbGVzID0gcGF0aC5hbnRfZ2xvYignKmJvb3N0XyonKQorCQkJCWlmIGZpbGVzOgorCQkJCQlicmVhaworCWlmIG5vdCBwYXRoOgorCQlpZiBsaWJzOgorCQkJc2VsZi5lbmRfbXNnKCdsaWJzIG5vdCBmb3VuZCBpbiAlcycgJSBsaWJzKQorCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwkJZWxzZToKKwkJCXNlbGYuZW5kX21zZygnbGlicyBub3QgZm91bmQsIHBsZWFzZSBwcm92aWRlIGEgLS1ib29zdC1saWJzIGFyZ3VtZW50IChzZWUgaGVscCknKQorCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKworCXNlbGYudG9fbG9nKCdGb3VuZCB0aGUgYm9vc3QgcGF0aCBpbiAlciB3aXRoIHRoZSBsaWJyYXJpZXM6JyAlIHBhdGgpCisJZm9yIHggaW4gZmlsZXM6CisJCXNlbGYudG9fbG9nKCcgICAgJXInICUgeCkKKwlyZXR1cm4gcGF0aCwgZmlsZXMKKworQGNvbmYKK2RlZiBib29zdF9nZXRfbGlicyhzZWxmLCAqaywgKiprdyk6CisJJycnCisJcmV0dXJuIHRoZSBsaWIgcGF0aCBhbmQgdGhlIHJlcXVpcmVkIGxpYnMKKwlhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMKKwknJycKKwlwYXRoLCBmaWxlcyA9IHNlbGYuX19ib29zdF9nZXRfbGlic19wYXRoKCoqa3cpCisJdCA9IFtdCisJaWYga3cuZ2V0KCdtdCcsIEZhbHNlKToKKwkJdC5hcHBlbmQoJ210JykKKwlpZiBrdy5nZXQoJ2FiaScsIE5vbmUpOgorCQl0LmFwcGVuZChrd1snYWJpJ10pCisJdGFncyA9IHQgYW5kICcoLSVzKSsnICUgJy0nLmpvaW4odCkgb3IgJycKKwl0b29sc2V0ID0gc2VsZi5ib29zdF9nZXRfdG9vbHNldChrdy5nZXQoJ3Rvb2xzZXQnLCAnJykpCisJdG9vbHNldF9wYXQgPSAnKC0lc1swLTldezAsM30pKycgJSB0b29sc2V0CisJdmVyc2lvbiA9ICcoLSVzKSsnICUgc2VsZi5lbnYuQk9PU1RfVkVSU0lPTgorCisJZGVmIGZpbmRfbGliKHJlX2xpYiwgZmlsZXMpOgorCQlmb3IgZmlsZSBpbiBmaWxlczoKKwkJCWlmIHJlX2xpYi5zZWFyY2goZmlsZS5uYW1lKToKKwkJCQlzZWxmLnRvX2xvZygnRm91bmQgYm9vc3QgbGliICVzJyAlIGZpbGUpCisJCQkJcmV0dXJuIGZpbGUKKwkJcmV0dXJuIE5vbmUKKworCWRlZiBmb3JtYXRfbGliX25hbWUobmFtZSk6CisJCWlmIG5hbWUuc3RhcnRzd2l0aCgnbGliJykgYW5kIHNlbGYuZW52LkNDX05BTUUgIT0gJ21zdmMnOgorCQkJbmFtZSA9IG5hbWVbMzpdCisJCXJldHVybiBuYW1lWzpuYW1lLnJmaW5kKCcuJyldCisKKwlsaWJzID0gW10KKwlmb3IgbGliIGluIFV0aWxzLnRvX2xpc3QoayBhbmQga1swXSBvciBrdy5nZXQoJ2xpYicsIE5vbmUpKToKKwkJcHkgPSAobGliID09ICdweXRob24nKSBhbmQgJygtcHklcykrJyAlIGt3WydweXRob24nXSBvciAnJworCQkjIFRyeWluZyBsaWJyYXJpZXMsIGZyb20gbW9zdCBzdHJpY3QgbWF0Y2ggdG8gbGVhc3Qgb25lCisJCWZvciBwYXR0ZXJuIGluIFsnYm9vc3RfJXMlcyVzJXMlcycgJSAobGliLCB0b29sc2V0X3BhdCwgdGFncywgcHksIHZlcnNpb24pLAorCQkJCQkJJ2Jvb3N0XyVzJXMlcyVzJyAlIChsaWIsIHRhZ3MsIHB5LCB2ZXJzaW9uKSwKKwkJCQkJCSdib29zdF8lcyVzJXMnICUgKGxpYiwgdGFncywgdmVyc2lvbiksCisJCQkJCQkjIEdpdmUgdXAgdHJ5aW5nIHRvIGZpbmQgdGhlIHJpZ2h0IHZlcnNpb24KKwkJCQkJCSdib29zdF8lcyVzJXMlcycgJSAobGliLCB0b29sc2V0X3BhdCwgdGFncywgcHkpLAorCQkJCQkJJ2Jvb3N0XyVzJXMlcycgJSAobGliLCB0YWdzLCBweSksCisJCQkJCQknYm9vc3RfJXMlcycgJSAobGliLCB0YWdzKV06CisJCQlzZWxmLnRvX2xvZygnVHJ5aW5nIHBhdHRlcm4gJXMnICUgcGF0dGVybikKKwkJCWZpbGUgPSBmaW5kX2xpYihyZS5jb21waWxlKHBhdHRlcm4pLCBmaWxlcykKKwkJCWlmIGZpbGU6CisJCQkJbGlicy5hcHBlbmQoZm9ybWF0X2xpYl9uYW1lKGZpbGUubmFtZSkpCisJCQkJYnJlYWsKKwkJZWxzZToKKwkJCXNlbGYuZW5kX21zZygnbGliICVzIG5vdCBmb3VuZCBpbiAlcycgJSAobGliLCBwYXRoLmFic3BhdGgoKSkpCisJCQlzZWxmLmZhdGFsKCdUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQnKQorCisJcmV0dXJuIHBhdGguYWJzcGF0aCgpLCBsaWJzCisKKworQGNvbmYKK2RlZiBjaGVja19ib29zdChzZWxmLCAqaywgKiprdyk6CisJIiIiCisJSW5pdGlhbGl6ZSBib29zdCBsaWJyYXJpZXMgdG8gYmUgdXNlZC4KKworCUtleXdvcmRzOiB5b3UgY2FuIHBhc3MgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB3aXRoIHRoZSBjb21tYW5kIGxpbmUgKHdpdGhvdXQgIi0tYm9vc3QtIikuCisJTm90ZSB0aGF0IHRoZSBjb21tYW5kIGxpbmUgaGFzIHRoZSBwcmlvcml0eSwgYW5kIHNob3VsZCBwcmVmZXJhYmx5IGJlIHVzZWQuCisJIiIiCisJaWYgbm90IHNlbGYuZW52WydDWFgnXToKKwkJc2VsZi5mYXRhbCgnbG9hZCBhIGMrKyBjb21waWxlciBmaXJzdCwgY29uZi5sb2FkKCJjb21waWxlcl9jeHgiKScpCisKKwlwYXJhbXMgPSB7J2xpYic6IGsgYW5kIGtbMF0gb3Iga3cuZ2V0KCdsaWInLCBOb25lKX0KKwlmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLm9wdGlvbnMuX19kaWN0X18uaXRlbXMoKToKKwkJaWYgbm90IGtleS5zdGFydHN3aXRoKCdib29zdF8nKToKKwkJCWNvbnRpbnVlCisJCWtleSA9IGtleVtsZW4oJ2Jvb3N0XycpOl0KKwkJcGFyYW1zW2tleV0gPSB2YWx1ZSBhbmQgdmFsdWUgb3Iga3cuZ2V0KGtleSwgJycpCisKKwl2YXIgPSBrdy5nZXQoJ3VzZWxpYl9zdG9yZScsICdCT09TVCcpCisKKwlzZWxmLnN0YXJ0X21zZygnQ2hlY2tpbmcgYm9vc3QgaW5jbHVkZXMnKQorCXNlbGYuZW52WydJTkNMVURFU18lcycgJSB2YXJdID0gaW5jID0gc2VsZi5ib29zdF9nZXRfaW5jbHVkZXMoKipwYXJhbXMpCisJdmVyc2lvbnMgPSBzZWxmLmJvb3N0X2dldF92ZXJzaW9uKGluYykKKwlzZWxmLmVudi5CT09TVF9WRVJTSU9OID0gdmVyc2lvbnNbMF0KKwlzZWxmLmVudi5CT09TVF9WRVJTSU9OX05VTUJFUiA9IGludCh2ZXJzaW9uc1sxXSkKKwlzZWxmLmVuZF9tc2coIiVkLiVkLiVkIiAlIChpbnQodmVyc2lvbnNbMV0pIC8gMTAwMDAwLAorCQkJCSAgIGludCh2ZXJzaW9uc1sxXSkgLyAxMDAgJSAxMDAwLAorCQkJCSAgIGludCh2ZXJzaW9uc1sxXSkgJSAxMDApKQorCWlmIExvZ3MudmVyYm9zZToKKwkJTG9ncy5wcHJpbnQoJ0NZQU4nLCAnCXBhdGggOiAlcycgJSBzZWxmLmVudlsnSU5DTFVERVNfJXMnICUgdmFyXSkKKworCWlmIG5vdCBwYXJhbXNbJ2xpYiddOgorCQlyZXR1cm4KKwlzZWxmLnN0YXJ0X21zZygnQ2hlY2tpbmcgYm9vc3QgbGlicycpCisJc3VmZml4ID0gcGFyYW1zLmdldCgnc3RhdGljJywgTm9uZSkgYW5kICdTVCcgb3IgJycKKwlwYXRoLCBsaWJzID0gc2VsZi5ib29zdF9nZXRfbGlicygqKnBhcmFtcykKKwlzZWxmLmVudlsnJXNMSUJQQVRIXyVzJyAlIChzdWZmaXgsIHZhcildID0gW3BhdGhdCisJc2VsZi5lbnZbJyVzTElCXyVzJyAlIChzdWZmaXgsIHZhcildID0gbGlicworCXNlbGYuZW5kX21zZygnb2snKQorCWlmIExvZ3MudmVyYm9zZToKKwkJTG9ncy5wcHJpbnQoJ0NZQU4nLCAnCXBhdGggOiAlcycgJSBwYXRoKQorCQlMb2dzLnBwcmludCgnQ1lBTicsICcJbGlicyA6ICVzJyAlIGxpYnMpCisKKworCWRlZiB0cnlfbGluaygpOgorCQlpZiAnc3lzdGVtJyBpbiBwYXJhbXNbJ2xpYiddOgorCQkJc2VsZi5jaGVja19jeHgoCisJCQkgZnJhZ21lbnQ9Qk9PU1RfU1lTVEVNX0NPREUsCisJCQkgdXNlPXZhciwKKwkJCSBleGVjdXRlPUZhbHNlLAorCQkJKQorCQlpZiAndGhyZWFkJyBpbiBwYXJhbXNbJ2xpYiddOgorCQkJc2VsZi5jaGVja19jeHgoCisJCQkgZnJhZ21lbnQ9Qk9PU1RfVEhSRUFEX0NPREUsCisJCQkgdXNlPXZhciwKKwkJCSBleGVjdXRlPUZhbHNlLAorCQkJKQorCisJaWYgcGFyYW1zLmdldCgnbGlua2FnZV9hdXRvZGV0ZWN0JywgRmFsc2UpOgorCQlzZWxmLnN0YXJ0X21zZygiQXR0ZW1wdGluZyB0byBkZXRlY3QgYm9vc3QgbGlua2FnZSBmbGFncyIpCisJCXRvb2xzZXQgPSBzZWxmLmJvb3N0X2dldF90b29sc2V0KGt3LmdldCgndG9vbHNldCcsICcnKSkKKwkJaWYgdG9vbHNldCBpbiBbJ3ZjJ106CisJCQkjIGRpc2FibGUgYXV0by1saW5raW5nIGZlYXR1cmUsIGNhdXNpbmcgZXJyb3IgTE5LMTE4MQorCQkJIyBiZWNhdXNlIHRoZSBjb2RlIHdhbnRzIHRvIGJlIGxpbmtlZCBhZ2FpbnN0CisJCQlzZWxmLmVudlsnREVGSU5FU18lcycgJSB2YXJdICs9IFsnQk9PU1RfQUxMX05PX0xJQiddCisKKwkJCSMgaWYgbm8gZGxscyBhcmUgcHJlc2VudCwgd2UgZ3Vlc3MgdGhlIC5saWIgZmlsZXMgYXJlIG5vdCBzdHVicworCQkJaGFzX2RsbHMgPSBGYWxzZQorCQkJZm9yIHggaW4gVXRpbHMubGlzdGRpcihwYXRoKToKKwkJCQlpZiB4LmVuZHN3aXRoKHNlbGYuZW52LmN4eHNobGliX1BBVFRFUk4gJSAnJyk6CisJCQkJCWhhc19kbGxzID0gVHJ1ZQorCQkJCQlicmVhaworCQkJaWYgbm90IGhhc19kbGxzOgorCQkJCXNlbGYuZW52WydTVExJQlBBVEhfJXMnICUgdmFyXSA9IFtwYXRoXQorCQkJCXNlbGYuZW52WydTVExJQl8lcycgJSB2YXJdID0gbGlicworCQkJCWRlbCBzZWxmLmVudlsnTElCXyVzJyAlIHZhcl0KKwkJCQlkZWwgc2VsZi5lbnZbJ0xJQlBBVEhfJXMnICUgdmFyXQorCisJCQkjIHdlIGF0dGVtcHQgdG8gcGxheSB3aXRoIHNvbWUga25vd24tdG8td29yayBDWFhGTEFHUyBjb21iaW5hdGlvbnMKKwkJCWZvciBjeHhmbGFncyBpbiAoWycvTUQnLCAnL0VIc2MnXSwgW10pOgorCQkJCXNlbGYuZW52LnN0YXNoKCkKKwkJCQlzZWxmLmVudlsiQ1hYRkxBR1NfJXMiICUgdmFyXSArPSBjeHhmbGFncworCQkJCXRyeToKKwkJCQkJdHJ5X2xpbmsoKQorCQkJCQlzZWxmLmVuZF9tc2coIm9rOiB3aW5uaW5nIGN4eGZsYWdzIGNvbWJpbmF0aW9uOiAlcyIgJSAoc2VsZi5lbnZbIkNYWEZMQUdTXyVzIiAlIHZhcl0pKQorCQkJCQllID0gTm9uZQorCQkJCQlicmVhaworCQkJCWV4Y2VwdCBFcnJvcnMuQ29uZmlndXJhdGlvbkVycm9yIGFzIGV4YzoKKwkJCQkJc2VsZi5lbnYucmV2ZXJ0KCkKKwkJCQkJZSA9IGV4YworCisJCQlpZiBlIGlzIG5vdCBOb25lOgorCQkJCXNlbGYuZW5kX21zZygiQ291bGQgbm90IGF1dG8tZGV0ZWN0IGJvb3N0IGxpbmtpbmcgZmxhZ3MgY29tYmluYXRpb24sIHlvdSBtYXkgcmVwb3J0IGl0IHRvIGJvb3N0LnB5IGF1dGhvciIsIGV4PWUpCisJCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwkJZWxzZToKKwkJCXNlbGYuZW5kX21zZygiQm9vc3QgbGlua2FnZSBmbGFncyBhdXRvLWRldGVjdGlvbiBub3QgaW1wbGVtZW50ZWQgKG5lZWRlZCA/KSBmb3IgdGhpcyB0b29sY2hhaW4iKQorCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwllbHNlOgorCQlzZWxmLnN0YXJ0X21zZygnQ2hlY2tpbmcgZm9yIGJvb3N0IGxpbmthZ2UnKQorCQl0cnk6CisJCQl0cnlfbGluaygpCisJCWV4Y2VwdCBFcnJvcnMuQ29uZmlndXJhdGlvbkVycm9yIGFzIGU6CisJCQlzZWxmLmVuZF9tc2coIkNvdWxkIG5vdCBsaW5rIGFnYWluc3QgYm9vc3QgbGlicmFyaWVzIHVzaW5nIHN1cHBsaWVkIG9wdGlvbnMiKQorCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwkJc2VsZi5lbmRfbXNnKCdvaycpCmRpZmYgLS1naXQgYS9ORkQvLndhZi10b29scy9jb21waWxlci1mZWF0dXJlcy5weSBiL05GRC8ud2FmLXRvb2xzL2NvbXBpbGVyLWZlYXR1cmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDQ5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvLndhZi10b29scy9jb21waWxlci1mZWF0dXJlcy5weQpAQCAtMCwwICsxLDI3IEBACisjIC0qLSBNb2RlOiBweXRob247IHB5LWluZGVudC1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgY29kaW5nOiB1dGYtODsgLSotCisKK2Zyb20gd2FmbGliLkNvbmZpZ3VyZSBpbXBvcnQgY29uZgorCitPVkVSUklERSA9ICcnJworY2xhc3MgQmFzZQoreworICB2aXJ0dWFsIHZvaWQKKyAgZihpbnQgYSk7Cit9OworCitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UKK3sKKyAgdmlydHVhbCB2b2lkCisgIGYoaW50IGEpIG92ZXJyaWRlOworfTsKKycnJworCitAY29uZgorZGVmIGNoZWNrX292ZXJyaWRlKHNlbGYpOgorICAgIGlmIHNlbGYuY2hlY2tfY3h4KG1zZz0nQ2hlY2tpbmcgZm9yIG92ZXJyaWRlIHNwZWNpZmllcicsCisgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQ9T1ZFUlJJREUsCisgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM9J2N4eCcsIG1hbmRhdG9yeT1GYWxzZSk6CisgICAgICAgIHNlbGYuZGVmaW5lKCdIQVZFX0NYWF9PVkVSUklERScsIDEpCisKK2RlZiBjb25maWd1cmUoY29uZik6CisgICAgY29uZi5jaGVja19vdmVycmlkZSgpCmRpZmYgLS1naXQgYS9ORkQvLndhZi10b29scy9jb3ZlcmFnZS5weSBiL05GRC8ud2FmLXRvb2xzL2NvdmVyYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvLndhZi10b29scy9jb3ZlcmFnZS5weQpAQCAtMCwwICsxLDI0IEBACisjIC0qLSBNb2RlOiBweXRob247IHB5LWluZGVudC1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgY29kaW5nOiB1dGYtODsgLSotCisjCisjIENvcHlyaWdodCAoYykgMjAxNCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCisjCisjIEdQTCAzLjAgbGljZW5zZSwgc2VlIHRoZSBDT1BZSU5HLm1kIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24KKworZnJvbSB3YWZsaWIgaW1wb3J0IFRhc2tHZW4KKworZGVmIG9wdGlvbnMob3B0KToKKyAgICBvcHQuYWRkX29wdGlvbignLS13aXRoLWNvdmVyYWdlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgZGVzdD0nd2l0aF9jb3ZlcmFnZScsCisgICAgICAgICAgICAgICAgICAgaGVscD0nJydTZXQgY29tcGlsZXIgZmxhZ3MgZm9yIGdjYyB0byBlbmFibGUgY29kZSBjb3ZlcmFnZSBpbmZvcm1hdGlvbicnJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBpZiBjb25mLm9wdGlvbnMud2l0aF9jb3ZlcmFnZToKKyAgICAgICAgY29uZi5jaGVja19jeHgoY3h4ZmxhZ3M9WyctZnByb2ZpbGUtYXJjcycsICctZnRlc3QtY292ZXJhZ2UnLCAnLWZQSUMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGlua2ZsYWdzPVsnLWZwcm9maWxlLWFyY3MnXSwgdXNlbGliX3N0b3JlPSdHQ09WJywgbWFuZGF0b3J5PVRydWUpCisKK0BUYXNrR2VuLmZlYXR1cmUoJ2N4eCcsJ2NjJykKK0BUYXNrR2VuLmFmdGVyKCdwcm9jZXNzX3NvdXJjZScpCitkZWYgYWRkX2NvdmVyYWdlKHNlbGYpOgorICAgIGlmIGdldGF0dHIoc2VsZiwgJ3VzZScsICcnKToKKyAgICAgICAgc2VsZi51c2UgKz0gJyBHQ09WJworICAgIGVsc2U6CisgICAgICAgIHNlbGYudXNlID0gJ0dDT1YnCmRpZmYgLS1naXQgYS9ORkQvLndhZi10b29scy9kZWZhdWx0LWNvbXBpbGVyLWZsYWdzLnB5IGIvTkZELy53YWYtdG9vbHMvZGVmYXVsdC1jb21waWxlci1mbGFncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmIyNTYzCi0tLSAvZGV2L251bGwKKysrIGIvTkZELy53YWYtdG9vbHMvZGVmYXVsdC1jb21waWxlci1mbGFncy5weQpAQCAtMCwwICsxLDc2IEBACisjIC0qLSBNb2RlOiBweXRob247IHB5LWluZGVudC1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgY29kaW5nOiB1dGYtODsgLSotCisjCisjIENvcHlyaWdodCAoYykgMjAxNCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCisjCisjIEdQTCAzLjAgbGljZW5zZSwgc2VlIHRoZSBDT1BZSU5HLm1kIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24KKworZnJvbSB3YWZsaWIgaW1wb3J0IExvZ3MsIENvbmZpZ3VyZQorCitkZWYgb3B0aW9ucyhvcHQpOgorICAgIG9wdC5hZGRfb3B0aW9uKCctLWRlYnVnJywgJy0td2l0aC1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsIGRlc3Q9J2RlYnVnJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPScnJ0NvbXBpbGUgaW4gZGVidWdnaW5nIG1vZGUgd2l0aG91dCBvcHRpbWl6YXRpb25zICgtTzAgb3IgLU9nKScnJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBhcmVDdXN0b21DeHhmbGFnc1ByZXNlbnQgPSAobGVuKGNvbmYuZW52LkNYWEZMQUdTKSA+IDApCisgICAgZGVmYXVsdEZsYWdzID0gWyctc3RkPWMrKzB4JywgJy1zdGQ9YysrMTEnLAorICAgICAgICAgICAgICAgICAgICAnLXN0ZGxpYj1saWJjKysnLCAgICMgY2xhbmcgb24gT1NYIDwgMTAuOSBieSBkZWZhdWx0IHVzZXMgZ2NjJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxpYnN0ZGMrKywgd2hpY2ggaXMgbm90IEMrKzExIGNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgJy1wZWRhbnRpYycsICctV2FsbCddCisKKyAgICBpZiBjb25mLm9wdGlvbnMuZGVidWc6CisgICAgICAgIGNvbmYuZGVmaW5lKCdfREVCVUcnLCAxKQorICAgICAgICBkZWZhdWx0RmxhZ3MgKz0gWyctTzAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICctT2cnLCAjIGdjYyA+PSA0LjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAnLWczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnLWZjb2xvci1kaWFnbm9zdGljcycsICMgY2xhbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnLWZkaWFnbm9zdGljcy1jb2xvcicsICMgZ2NjID49IDQuOQorICAgICAgICAgICAgICAgICAgICAgICAgICctV2Vycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnLVduby1lcnJvcj1tYXliZS11bmluaXRpYWxpemVkJywgIyBCdWcgIzE1NjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAnLVduby1lcnJvcj11bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbicsICMgQnVnICMxNTg4CisgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1yZWdpc3RlcicsICMgQnVnICMyMjg4CisgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGlmIGFyZUN1c3RvbUN4eGZsYWdzUHJlc2VudDoKKyAgICAgICAgICAgIG1pc3NpbmdGbGFncyA9IFt4IGZvciB4IGluIGRlZmF1bHRGbGFncyBpZiB4IG5vdCBpbiBjb25mLmVudi5DWFhGTEFHU10KKyAgICAgICAgICAgIGlmIGxlbihtaXNzaW5nRmxhZ3MpID4gMDoKKyAgICAgICAgICAgICAgICBMb2dzLndhcm4oIlNlbGVjdGVkIGRlYnVnIG1vZGUsIGJ1dCBDWFhGTEFHUyBpcyBzZXQgdG8gYSBjdXN0b20gdmFsdWUgJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJSAiICIuam9pbihjb25mLmVudi5DWFhGTEFHUykpCisgICAgICAgICAgICAgICAgTG9ncy53YXJuKCJEZWZhdWx0IGZsYWdzICclcycgYXJlIG5vdCBhY3RpdmF0ZWQiICUgIiAiLmpvaW4obWlzc2luZ0ZsYWdzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbmYuYWRkX3N1cHBvcnRlZF9jeHhmbGFncyhkZWZhdWx0RmxhZ3MpCisgICAgZWxzZToKKyAgICAgICAgZGVmYXVsdEZsYWdzICs9IFsnLU8yJywgJy1nJ10KKyAgICAgICAgaWYgbm90IGFyZUN1c3RvbUN4eGZsYWdzUHJlc2VudDoKKyAgICAgICAgICAgIGNvbmYuYWRkX3N1cHBvcnRlZF9jeHhmbGFncyhkZWZhdWx0RmxhZ3MpCisKKyAgICAjIGNsYW5nIG9uIE9TWCA8IDEwLjkgYnkgZGVmYXVsdCB1c2VzIGdjYydzIGxpYnN0ZGMrKywgd2hpY2ggaXMgbm90IEMrKzExIGNvbXBhdGlibGUKKyAgICBjb25mLmFkZF9zdXBwb3J0ZWRfbGlua2ZsYWdzKFsnLXN0ZGxpYj1saWJjKysnXSkKKworQENvbmZpZ3VyZS5jb25mCitkZWYgYWRkX3N1cHBvcnRlZF9jeHhmbGFncyhzZWxmLCBjeHhmbGFncyk6CisgICAgIiIiCisgICAgQ2hlY2sgd2hpY2ggY3h4ZmxhZ3MgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlciBhbmQgYWRkIHRoZW0gdG8gZW52LkNYWEZMQUdTIHZhcmlhYmxlCisgICAgIiIiCisgICAgc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIHN1cHBvcnRlZCBDWFhGTEFHUycpCisKKyAgICBzdXBwb3J0ZWRGbGFncyA9IFtdCisgICAgZm9yIGZsYWcgaW4gY3h4ZmxhZ3M6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfY3h4KGN4eGZsYWdzPVsnLVdlcnJvcicsIGZsYWddLCBtYW5kYXRvcnk9RmFsc2UpOgorICAgICAgICAgICAgc3VwcG9ydGVkRmxhZ3MgKz0gW2ZsYWddCisKKyAgICBzZWxmLmVuZF9tc2coJyAnLmpvaW4oc3VwcG9ydGVkRmxhZ3MpKQorICAgIHNlbGYuZW52LkNYWEZMQUdTID0gc3VwcG9ydGVkRmxhZ3MgKyBzZWxmLmVudi5DWFhGTEFHUworCitAQ29uZmlndXJlLmNvbmYKK2RlZiBhZGRfc3VwcG9ydGVkX2xpbmtmbGFncyhzZWxmLCBsaW5rZmxhZ3MpOgorICAgICIiIgorICAgIENoZWNrIHdoaWNoIGxpbmtmbGFncyBhcmUgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyIGFuZCBhZGQgdGhlbSB0byBlbnYuTElOS0ZMQUdTIHZhcmlhYmxlCisgICAgIiIiCisgICAgc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIHN1cHBvcnRlZCBMSU5LRkxBR1MnKQorCisgICAgc3VwcG9ydGVkRmxhZ3MgPSBbXQorICAgIGZvciBmbGFnIGluIGxpbmtmbGFnczoKKyAgICAgICAgaWYgc2VsZi5jaGVja19jeHgobGlua2ZsYWdzPVsnLVdlcnJvcicsIGZsYWddLCBtYW5kYXRvcnk9RmFsc2UpOgorICAgICAgICAgICAgc3VwcG9ydGVkRmxhZ3MgKz0gW2ZsYWddCisKKyAgICBzZWxmLmVuZF9tc2coJyAnLmpvaW4oc3VwcG9ydGVkRmxhZ3MpKQorICAgIHNlbGYuZW52LkxJTktGTEFHUyA9IHN1cHBvcnRlZEZsYWdzICsgc2VsZi5lbnYuTElOS0ZMQUdTCmRpZmYgLS1naXQgYS9ORkQvLndhZi10b29scy9kZXBlbmRlbmN5LWNoZWNrZXIucHkgYi9ORkQvLndhZi10b29scy9kZXBlbmRlbmN5LWNoZWNrZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5ZmJmZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC8ud2FmLXRvb2xzL2RlcGVuZGVuY3ktY2hlY2tlci5weQpAQCAtMCwwICsxLDI4IEBACisjIGVuY29kaW5nOiB1dGYtOAorCitmcm9tIHdhZmxpYiBpbXBvcnQgT3B0aW9ucywgTG9ncworZnJvbSB3YWZsaWIuQ29uZmlndXJlIGltcG9ydCBjb25mCisKK2RlZiBhZGREZXBlbmRlbmN5T3B0aW9ucyhzZWxmLCBvcHQsIG5hbWUsIGV4dHJhSGVscD0nJyk6CisgICAgb3B0LmFkZF9vcHRpb24oJy0td2l0aC0lcycgJSBuYW1lLCB0eXBlPSdzdHJpbmcnLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgZGVzdD0nd2l0aF8lcycgJSBuYW1lLAorICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gJXMsIGUuZy4sIC91c3IvbG9jYWwgJXMnICUgKG5hbWUsIGV4dHJhSGVscCkpCitzZXRhdHRyKE9wdGlvbnMuT3B0aW9uc0NvbnRleHQsICJhZGREZXBlbmRlbmN5T3B0aW9ucyIsIGFkZERlcGVuZGVuY3lPcHRpb25zKQorCitAY29uZgorZGVmIGNoZWNrRGVwZW5kZW5jeShzZWxmLCBuYW1lLCAqKmt3KToKKyAgICByb290ID0ga3cuZ2V0KCdwYXRoJywgZ2V0YXR0cihPcHRpb25zLm9wdGlvbnMsICd3aXRoXyVzJyAlIG5hbWUpKQorICAgIGt3Wydtc2cnXSA9IGt3LmdldCgnbXNnJywgJ0NoZWNraW5nIGZvciAlcyBsaWJyYXJ5JyAlIG5hbWUpCisgICAga3dbJ3VzZWxpYl9zdG9yZSddID0ga3cuZ2V0KCd1c2VsaWJfc3RvcmUnLCBuYW1lLnVwcGVyKCkpCisgICAga3dbJ2RlZmluZV9uYW1lJ10gPSBrdy5nZXQoJ2RlZmluZV9uYW1lJywgJ0hBVkVfJXMnICUga3dbJ3VzZWxpYl9zdG9yZSddKQorICAgIGt3WydtYW5kYXRvcnknXSA9IGt3LmdldCgnbWFuZGF0b3J5JywgVHJ1ZSkKKworICAgIGlmIHJvb3Q6CisgICAgICAgIGlzT2sgPSBzZWxmLmNoZWNrX2N4eChpbmNsdWRlcz0iJXMvaW5jbHVkZSIgJSByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicGF0aD0iJXMvbGliIiAlIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3KQorICAgIGVsc2U6CisgICAgICAgIGlzT2sgPSBzZWxmLmNoZWNrX2N4eCgqKmt3KQorCisgICAgaWYgaXNPazoKKyAgICAgICAgc2VsZi5lbnZba3dbJ2RlZmluZV9uYW1lJ11dID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvTkZELy53YWYtdG9vbHMvZG94eWdlbi5weSBiL05GRC8ud2FmLXRvb2xzL2RveHlnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4YzcwYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC8ud2FmLXRvb2xzL2RveHlnZW4ucHkKQEAgLTAsMCArMSwyMTQgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMgZW5jb2Rpbmc6IFVURi04CisjIFRob21hcyBOYWd5IDIwMDgtMjAxMCAoaXRhKQorCisiIiIKKworRG94eWdlbiBzdXBwb3J0CisKK1ZhcmlhYmxlcyBwYXNzZWQgdG8gYmxkKCk6CisqIGRveHlmaWxlIC0tIHRoZSBEb3h5ZmlsZSB0byB1c2UKKworV2hlbiB1c2luZyB0aGlzIHRvb2wsIHRoZSB3c2NyaXB0IHdpbGwgbG9vayBsaWtlOgorCisJZGVmIG9wdGlvbnMob3B0KToKKwkJb3B0LmxvYWQoJ2RveHlnZW4nKQorCisJZGVmIGNvbmZpZ3VyZShjb25mKToKKwkJY29uZi5sb2FkKCdkb3h5Z2VuJykKKwkJIyBjaGVjayBjb25mLmVudi5ET1hZR0VOLCBpZiBpdCBpcyBtYW5kYXRvcnkKKworCWRlZiBidWlsZChibGQpOgorCQlpZiBibGQuZW52LkRPWFlHRU46CisJCQlibGQoZmVhdHVyZXM9ImRveHlnZW4iLCBkb3h5ZmlsZT0nRG94eWZpbGUnLCAuLi4pCisKKyAgICAgICAgZGVmIGRveHlnZW4oYmxkKToKKwkJaWYgYmxkLmVudi5ET1hZR0VOOgorCQkJYmxkKGZlYXR1cmVzPSJkb3h5Z2VuIiwgZG94eWZpbGU9J0RveHlmaWxlJywgLi4uKQorIiIiCisKK2Zyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaGNhc2UKK2ltcG9ydCBvcywgb3MucGF0aCwgcmUsIHN0YXQKK2Zyb20gd2FmbGliIGltcG9ydCBUYXNrLCBVdGlscywgTm9kZSwgTG9ncywgRXJyb3JzLCBCdWlsZAorZnJvbSB3YWZsaWIuVGFza0dlbiBpbXBvcnQgZmVhdHVyZQorCitET1hZX1NUUiA9ICciJHtET1hZR0VOfSIgLSAnCitET1hZX0ZNVFMgPSAnaHRtbCBsYXRleCBtYW4gcmZ0IHhtbCcuc3BsaXQoKQorRE9YWV9GSUxFX1BBVFRFUk5TID0gJyouJyArICcgKi4nLmpvaW4oJycnCitjIGNjIGN4eCBjcHAgYysrIGphdmEgaWkgaXh4IGlwcCBpKysgaW5sIGggaGggaHh4IGhwcCBoKysgaWRsIG9kbCBjcyBwaHAgcGhwMworaW5jIG0gbW0gcHkgZjkwYyBjYyBjeHggY3BwIGMrKyBqYXZhIGlpIGl4eCBpcHAgaSsrIGlubCBoIGhoIGh4eAorJycnLnNwbGl0KCkpCisKK3JlX3JsID0gcmUuY29tcGlsZSgnXFxcXFxyKlxuJywgcmUuTVVMVElMSU5FKQorcmVfbmwgPSByZS5jb21waWxlKCdccipcbicsIHJlLk0pCitkZWYgcGFyc2VfZG94eSh0eHQpOgorCXRibCA9IHt9CisJdHh0ICAgPSByZV9ybC5zdWIoJycsIHR4dCkKKwlsaW5lcyA9IHJlX25sLnNwbGl0KHR4dCkKKwlmb3IgeCBpbiBsaW5lczoKKwkJeCA9IHguc3RyaXAoKQorCQlpZiBub3QgeCBvciB4LnN0YXJ0c3dpdGgoJyMnKSBvciB4LmZpbmQoJz0nKSA8IDA6CisJCQljb250aW51ZQorCQlpZiB4LmZpbmQoJys9JykgPj0gMDoKKwkJCXRtcCA9IHguc3BsaXQoJys9JykKKwkJCWtleSA9IHRtcFswXS5zdHJpcCgpCisJCQlpZiBrZXkgaW4gdGJsOgorCQkJCXRibFtrZXldICs9ICcgJyArICcrPScuam9pbih0bXBbMTpdKS5zdHJpcCgpCisJCQllbHNlOgorCQkJCXRibFtrZXldID0gJys9Jy5qb2luKHRtcFsxOl0pLnN0cmlwKCkKKwkJZWxzZToKKwkJCXRtcCA9IHguc3BsaXQoJz0nKQorCQkJdGJsW3RtcFswXS5zdHJpcCgpXSA9ICc9Jy5qb2luKHRtcFsxOl0pLnN0cmlwKCkKKwlyZXR1cm4gdGJsCisKK2NsYXNzIGRveHlnZW4oVGFzay5UYXNrKToKKwl2YXJzICA9IFsnRE9YWUdFTicsICdET1hZRkxBR1MnXQorCWNvbG9yID0gJ0JMVUUnCisKKwlkZWYgcnVubmFibGVfc3RhdHVzKHNlbGYpOgorCQknJycKKwkJc2VsZi5wYXJzIGFyZSBwb3B1bGF0ZWQgaW4gcnVubmFibGVfc3RhdHVzIC0gYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nCisJCXJ1biAqYmVmb3JlKiBib3RoIHNlbGYucGFycyAiY29uc3VtZXJzIiAtIHNjYW4oKSBhbmQgcnVuKCkKKworCQlzZXQgb3V0cHV0X2RpciAobm9kZSkgZm9yIHRoZSBvdXRwdXQKKwkJJycnCisKKwkJZm9yIHggaW4gc2VsZi5ydW5fYWZ0ZXI6CisJCQlpZiBub3QgeC5oYXNydW46CisJCQkJcmV0dXJuIFRhc2suQVNLX0xBVEVSCisKKwkJaWYgbm90IGdldGF0dHIoc2VsZiwgJ3BhcnMnLCBOb25lKToKKwkJCXR4dCA9IHNlbGYuaW5wdXRzWzBdLnJlYWQoKQorCQkJc2VsZi5wYXJzID0gcGFyc2VfZG94eSh0eHQpCisJCQlpZiBub3Qgc2VsZi5wYXJzLmdldCgnT1VUUFVUX0RJUkVDVE9SWScpOgorCQkJCXNlbGYucGFyc1snT1VUUFVUX0RJUkVDVE9SWSddID0gc2VsZi5pbnB1dHNbMF0ucGFyZW50LmdldF9ibGQoKS5hYnNwYXRoKCkKKworCQkJIyBPdmVycmlkZSB3aXRoIGFueSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgdGFzayBnZW5lcmF0b3IKKwkJCWlmIGdldGF0dHIoc2VsZi5nZW5lcmF0b3IsICdwYXJzJywgTm9uZSk6CisJCQkJZm9yIGssIHYgaW4gc2VsZi5nZW5lcmF0b3IucGFycy5pdGVyaXRlbXMoKToKKwkJCQkJc2VsZi5wYXJzW2tdID0gdgorCisJCQlzZWxmLmRveHlfaW5wdXRzID0gZ2V0YXR0cihzZWxmLCAnZG94eV9pbnB1dHMnLCBbXSkKKwkJCWlmIG5vdCBzZWxmLnBhcnMuZ2V0KCdJTlBVVCcpOgorCQkJCXNlbGYuZG94eV9pbnB1dHMuYXBwZW5kKHNlbGYuaW5wdXRzWzBdLnBhcmVudCkKKwkJCWVsc2U6CisJCQkJZm9yIGkgaW4gc2VsZi5wYXJzLmdldCgnSU5QVVQnKS5zcGxpdCgpOgorCQkJCQlpZiBvcy5wYXRoLmlzYWJzKGkpOgorCQkJCQkJbm9kZSA9IHNlbGYuZ2VuZXJhdG9yLmJsZC5yb290LmZpbmRfbm9kZShpKQorCQkJCQllbHNlOgorCQkJCQkJbm9kZSA9IHNlbGYuZ2VuZXJhdG9yLnBhdGguZmluZF9ub2RlKGkpCisJCQkJCWlmIG5vdCBub2RlOgorCQkJCQkJc2VsZi5nZW5lcmF0b3IuYmxkLmZhdGFsKCdDb3VsZCBub3QgZmluZCB0aGUgZG94eWdlbiBpbnB1dCAlcicgJSBpKQorCQkJCQlzZWxmLmRveHlfaW5wdXRzLmFwcGVuZChub2RlKQorCisJCWlmIG5vdCBnZXRhdHRyKHNlbGYsICdvdXRwdXRfZGlyJywgTm9uZSk6CisJCQlibGQgPSBzZWxmLmdlbmVyYXRvci5ibGQKKwkJCSMgRmlyc3QgdHJ5IHRvIGZpbmQgYW4gYWJzb2x1dGUgcGF0aCwgdGhlbiBmaW5kIG9yIGRlY2xhcmUgYSByZWxhdGl2ZSBwYXRoCisJCQlzZWxmLm91dHB1dF9kaXIgPSBibGQucm9vdC5maW5kX2RpcihzZWxmLnBhcnNbJ09VVFBVVF9ESVJFQ1RPUlknXSkKKwkJCWlmIG5vdCBzZWxmLm91dHB1dF9kaXI6CisJCQkJc2VsZi5vdXRwdXRfZGlyID0gYmxkLnBhdGguZmluZF9vcl9kZWNsYXJlKHNlbGYucGFyc1snT1VUUFVUX0RJUkVDVE9SWSddKQorCisJCXNlbGYuc2lnbmF0dXJlKCkKKwkJcmV0dXJuIFRhc2suVGFzay5ydW5uYWJsZV9zdGF0dXMoc2VsZikKKworCWRlZiBzY2FuKHNlbGYpOgorCQlleGNsdWRlX3BhdHRlcm5zID0gc2VsZi5wYXJzLmdldCgnRVhDTFVERV9QQVRURVJOUycsJycpLnNwbGl0KCkKKwkJZmlsZV9wYXR0ZXJucyA9IHNlbGYucGFycy5nZXQoJ0ZJTEVfUEFUVEVSTlMnLCcnKS5zcGxpdCgpCisJCWlmIG5vdCBmaWxlX3BhdHRlcm5zOgorCQkJZmlsZV9wYXR0ZXJucyA9IERPWFlfRklMRV9QQVRURVJOUworCQlpZiBzZWxmLnBhcnMuZ2V0KCdSRUNVUlNJVkUnKSA9PSAnWUVTJzoKKwkJCWZpbGVfcGF0dGVybnMgPSBbIioqLyVzIiAlIHBhdHRlcm4gZm9yIHBhdHRlcm4gaW4gZmlsZV9wYXR0ZXJuc10KKwkJbm9kZXMgPSBbXQorCQluYW1lcyA9IFtdCisJCWZvciBub2RlIGluIHNlbGYuZG94eV9pbnB1dHM6CisJCQlpZiBvcy5wYXRoLmlzZGlyKG5vZGUuYWJzcGF0aCgpKToKKwkJCQlmb3IgbSBpbiBub2RlLmFudF9nbG9iKGluY2w9ZmlsZV9wYXR0ZXJucywgZXhjbD1leGNsdWRlX3BhdHRlcm5zKToKKwkJCQkJbm9kZXMuYXBwZW5kKG0pCisJCQllbHNlOgorCQkJCW5vZGVzLmFwcGVuZChub2RlKQorCQlyZXR1cm4gKG5vZGVzLCBuYW1lcykKKworCWRlZiBydW4oc2VsZik6CisJCWRjdCA9IHNlbGYucGFycy5jb3B5KCkKKwkJZGN0WydJTlBVVCddID0gJyAnLmpvaW4oWyciJXMiJyAlIHguYWJzcGF0aCgpIGZvciB4IGluIHNlbGYuZG94eV9pbnB1dHNdKQorCQljb2RlID0gJ1xuJy5qb2luKFsnJXMgPSAlcycgJSAoeCwgZGN0W3hdKSBmb3IgeCBpbiBzZWxmLnBhcnNdKQorCQljb2RlID0gY29kZS5lbmNvZGUoKSAjIGZvciBweXRob24gMworCQkjZm10ID0gRE9YWV9TVFIgJSAoc2VsZi5pbnB1dHNbMF0ucGFyZW50LmFic3BhdGgoKSkKKwkJY21kID0gVXRpbHMuc3Vic3RfdmFycyhET1hZX1NUUiwgc2VsZi5lbnYpCisJCWVudiA9IHNlbGYuZW52LmVudiBvciBOb25lCisJCXByb2MgPSBVdGlscy5zdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3RkaW49VXRpbHMuc3VicHJvY2Vzcy5QSVBFLCBlbnY9ZW52LCBjd2Q9c2VsZi5nZW5lcmF0b3IuYmxkLnBhdGguZ2V0X2JsZCgpLmFic3BhdGgoKSkKKwkJcHJvYy5jb21tdW5pY2F0ZShjb2RlKQorCQlyZXR1cm4gcHJvYy5yZXR1cm5jb2RlCisKKwlkZWYgcG9zdF9ydW4oc2VsZik6CisJCW5vZGVzID0gc2VsZi5vdXRwdXRfZGlyLmFudF9nbG9iKCcqKi8qJywgcXVpZXQ9VHJ1ZSkKKwkJZm9yIHggaW4gbm9kZXM6CisJCQl4LnNpZyA9IFV0aWxzLmhfZmlsZSh4LmFic3BhdGgoKSkKKwkJc2VsZi5vdXRwdXRzICs9IG5vZGVzCisJCXJldHVybiBUYXNrLlRhc2sucG9zdF9ydW4oc2VsZikKKworY2xhc3MgdGFyKFRhc2suVGFzayk6CisJInF1aWNrIHRhciBjcmVhdGlvbiIKKwlydW5fc3RyID0gJyR7VEFSfSAke1RBUk9QVFN9ICR7VEdUfSAke1NSQ30nCisJY29sb3IgICA9ICdSRUQnCisJYWZ0ZXIgICA9IFsnZG94eWdlbiddCisJZGVmIHJ1bm5hYmxlX3N0YXR1cyhzZWxmKToKKwkJZm9yIHggaW4gZ2V0YXR0cihzZWxmLCAnaW5wdXRfdGFza3MnLCBbXSk6CisJCQlpZiBub3QgeC5oYXNydW46CisJCQkJcmV0dXJuIFRhc2suQVNLX0xBVEVSCisKKwkJaWYgbm90IGdldGF0dHIoc2VsZiwgJ3Rhcl9kb25lX2FkZGluZycsIE5vbmUpOgorCQkJIyBleGVjdXRlIHRoaXMgb25seSBvbmNlCisJCQlzZWxmLnRhcl9kb25lX2FkZGluZyA9IFRydWUKKwkJCWZvciB4IGluIGdldGF0dHIoc2VsZiwgJ2lucHV0X3Rhc2tzJywgW10pOgorCQkJCXNlbGYuc2V0X2lucHV0cyh4Lm91dHB1dHMpCisJCQlpZiBub3Qgc2VsZi5pbnB1dHM6CisJCQkJcmV0dXJuIFRhc2suU0tJUF9NRQorCQlyZXR1cm4gVGFzay5UYXNrLnJ1bm5hYmxlX3N0YXR1cyhzZWxmKQorCisJZGVmIF9fc3RyX18oc2VsZik6CisJCXRndF9zdHIgPSAnICcuam9pbihbYS5uaWNlX3BhdGgoc2VsZi5lbnYpIGZvciBhIGluIHNlbGYub3V0cHV0c10pCisJCXJldHVybiAnJXM6ICVzXG4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCB0Z3Rfc3RyKQorCitAZmVhdHVyZSgnZG94eWdlbicpCitkZWYgcHJvY2Vzc19kb3h5KHNlbGYpOgorCWlmIG5vdCBnZXRhdHRyKHNlbGYsICdkb3h5ZmlsZScsIE5vbmUpOgorCQlzZWxmLmdlbmVyYXRvci5ibGQuZmF0YWwoJ25vIGRveHlmaWxlPz8nKQorCisJbm9kZSA9IHNlbGYuZG94eWZpbGUKKwlpZiBub3QgaXNpbnN0YW5jZShub2RlLCBOb2RlLk5vZGUpOgorCQlub2RlID0gc2VsZi5wYXRoLmZpbmRfcmVzb3VyY2Uobm9kZSkKKwlpZiBub3Qgbm9kZToKKwkJcmFpc2UgVmFsdWVFcnJvcignZG94eWdlbiBmaWxlIG5vdCBmb3VuZCcpCisKKwkjIHRoZSB0YXNrIGluc3RhbmNlCisJZHNrID0gc2VsZi5jcmVhdGVfdGFzaygnZG94eWdlbicsIG5vZGUpCisKKwlpZiBnZXRhdHRyKHNlbGYsICdkb3h5X3RhcicsIE5vbmUpOgorCQl0c2sgPSBzZWxmLmNyZWF0ZV90YXNrKCd0YXInKQorCQl0c2suaW5wdXRfdGFza3MgPSBbZHNrXQorCQl0c2suc2V0X291dHB1dHMoc2VsZi5wYXRoLmZpbmRfb3JfZGVjbGFyZShzZWxmLmRveHlfdGFyKSkKKwkJaWYgc2VsZi5kb3h5X3Rhci5lbmRzd2l0aCgnYnoyJyk6CisJCQl0c2suZW52WydUQVJPUFRTJ10gPSBbJ2NqZiddCisJCWVsaWYgc2VsZi5kb3h5X3Rhci5lbmRzd2l0aCgnZ3onKToKKwkJCXRzay5lbnZbJ1RBUk9QVFMnXSA9IFsnY3pmJ10KKwkJZWxzZToKKwkJCXRzay5lbnZbJ1RBUk9QVFMnXSA9IFsnY2YnXQorCitkZWYgY29uZmlndXJlKGNvbmYpOgorCScnJworCUNoZWNrIGlmIGRveHlnZW4gYW5kIHRhciBjb21tYW5kcyBhcmUgcHJlc2VudCBpbiB0aGUgc3lzdGVtCisKKwlJZiB0aGUgY29tbWFuZHMgYXJlIHByZXNlbnQsIHRoZW4gY29uZi5lbnYuRE9YWUdFTiBhbmQgY29uZi5lbnYuVEFSCisJdmFyaWFibGVzIHdpbGwgYmUgc2V0LiBEZXRlY3Rpb24gY2FuIGJlIGNvbnRyb2xsZWQgYnkgc2V0dGluZyBET1hZR0VOIGFuZAorCVRBUiBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcy4KKwknJycKKworCWNvbmYuZmluZF9wcm9ncmFtKCdkb3h5Z2VuJywgdmFyPSdET1hZR0VOJywgbWFuZGF0b3J5PUZhbHNlKQorCWNvbmYuZmluZF9wcm9ncmFtKCd0YXInLCB2YXI9J1RBUicsIG1hbmRhdG9yeT1GYWxzZSkKKworIyBkb3h5Z2VuIGRvY3MKK2Zyb20gd2FmbGliLkJ1aWxkIGltcG9ydCBCdWlsZENvbnRleHQKK2NsYXNzIGRveHkoQnVpbGRDb250ZXh0KToKKyAgICBjbWQgPSAiZG94eWdlbiIKKyAgICBmdW4gPSAiZG94eWdlbiIKZGlmZiAtLWdpdCBhL05GRC8ud2FmLXRvb2xzL3BjaC5weSBiL05GRC8ud2FmLXRvb2xzL3BjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGNjNWRlCi0tLSAvZGV2L251bGwKKysrIGIvTkZELy53YWYtdG9vbHMvcGNoLnB5CkBAIC0wLDAgKzEsMTQ4IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGVuY29kaW5nOiB1dGYtOAorIyBBbGV4YW5kZXIgQWZhbmFzeWV2IChVQ0xBKSwgMjAxNAorCisiIiIKK0VuYWJsZSBwcmVjb21waWxlZCBDKysgaGVhZGVyIHN1cHBvcnQgKGN1cnJlbnRseSBvbmx5IGNsYW5nKysgYW5kIGcrKyBhcmUgc3VwcG9ydGVkKQorCitUbyB1c2UgdGhpcyB0b29sLCB3c2NyaXB0IHNob3VsZCBsb29rIGxpa2U6CisKKwlkZWYgb3B0aW9ucyhvcHQpOgorCQlvcHQubG9hZCgncGNoJykKKwkJIyBUaGlzIHdpbGwgYWRkIGAtLXdpdGgtcGNoYCBjb25maWd1cmUgb3B0aW9uLgorCQkjIFVubGVzcyAtLXdpdGgtcGNoIGR1cmluZyBjb25maWd1cmUgc3RhZ2Ugc3BlY2lmaWVkLCB0aGUgcHJlY29tcGlsZWQgaGVhZGVyIHN1cHBvcnQgaXMgZGlzYWJsZWQKKworCWRlZiBjb25maWd1cmUoY29uZik6CisJCWNvbmYubG9hZCgncGNoJykKKwkJIyB0aGlzIHdpbGwgc2V0IGNvbmYuZW52LldJVEhfUENIIGlmIC0td2l0aC1wY2ggaXMgc3BlY2lmaWVkIGFuZCB0aGUgc3VwcG9ydGVkIGNvbXBpbGVyIGlzIHVzZWQKKwkJIyBVbmxlc3MgY29uZi5lbnYuV0lUSF9QQ0ggaXMgc2V0LCB0aGUgcHJlY29tcGlsZWQgaGVhZGVyIHN1cHBvcnQgaXMgZGlzYWJsZWQKKworCWRlZiBidWlsZChibGQpOgorCQlibGQoZmVhdHVyZXM9J2N4eCBwY2gnLAorCQkJdGFyZ2V0PSdwcmVjb21waWxlZC1oZWFkZXJzJywKKwkJCW5hbWU9J3ByZWNvbXBpbGVkLWhlYWRlcnMnLAorCQkJaGVhZGVycz0nYS5oIGIuaCBjLmgnLCAjIGhlYWRlcnMgdG8gcHJlLWNvbXBpbGUgaW50byBgcHJlY29tcGlsZWQtaGVhZGVyc2AKKworCQkJIyBPdGhlciBwYXJhbWV0ZXJzIHRvIGNvbXBpbGUgcHJlY29tcGlsZWQgaGVhZGVycworCQkJIyBpbmNsdWRlcz0uLi4sCisJCQkjIGV4cG9ydF9pbmNsdWRlcz0uLi4sCisJCQkjIHVzZT0uLi4sCisJCQkjIC4uLgorCisJCQkjIEV4cG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBwcm9wYWdhdGVkIGV2ZW4gaWYgcHJlY29tcGlsZWQgaGVhZGVycyBhcmUgZGlzYWJsZWQKKwkJKQorCisJCWJsZCgKKwkJCXRhcmdldD0ndGVzdCcsCisJCQlmZWF0dXJlcz0nY3h4IGN4eHByb2dyYW0nLAorCQkJc291cmNlPSdhLmNwcCBiLmNwcCBkLmNwcCBtYWluLmNwcCcsCisJCQl1c2U9J3ByZWNvbXBpbGVkLWhlYWRlcnMnLAorCQkpCisKKwkJIyBvcgorCisJCWJsZCgKKwkJCXRhcmdldD0ndGVzdCcsCisJCQlmZWF0dXJlcz0ncGNoIGN4eCBjeHhwcm9ncmFtJywKKwkJCXNvdXJjZT0nYS5jcHAgYi5jcHAgZC5jcHAgbWFpbi5jcHAnLAorCQkJaGVhZGVycz0nYS5oIGIuaCBjLmgnLAorCQkpCisKK05vdGUgdGhhdCBwcmVjb21waWxlZCBoZWFkZXIgbXVzdCBoYXZlIG11bHRpcGxlIGluY2x1c2lvbiBndWFyZHMuICBJZiB0aGUgZ3VhcmRzIGFyZSBtaXNzaW5nLCBhbnkgYmVuZWZpdCBvZiBwcmVjb21waWxlZCBoZWFkZXIgd2lsbCBiZSB2b2lkZWQgYW5kIGNvbXBpbGF0aW9uIG1heSBmYWlsIGluIHNvbWUgY2FzZXMuCisiIiIKKworaW1wb3J0IG9zCitmcm9tIHdhZmxpYiBpbXBvcnQgVGFzaywgVGFza0dlbiwgTG9ncywgVXRpbHMKK2Zyb20gd2FmbGliLlRvb2xzIGltcG9ydCBjX3ByZXByb2MsIGN4eAorCisKK1BDSF9DT01QSUxFUl9PUFRJT05TID0geworCSdjbGFuZysrJzogW1snLWluY2x1ZGUnXSwgJy5wY2gnLCBbJy14JywgJ2MrKy1oZWFkZXInXV0sCisJJ2crKyc6ICAgICBbWyctaW5jbHVkZSddLCAnLmdjaCcsIFsnLXgnLCAnYysrLWhlYWRlciddXSwKK30KKworCitkZWYgb3B0aW9ucyhvcHQpOgorCW9wdC5hZGRfb3B0aW9uKCctLXdpdGhvdXQtcGNoJywgYWN0aW9uPSdzdG9yZV9mYWxzZScsIGRlZmF1bHQ9VHJ1ZSwgZGVzdD0nd2l0aF9wY2gnLCBoZWxwPScnJ1RyeSB0byB1c2UgcHJlY29tcGlsZWQgaGVhZGVyIHRvIHNwZWVkIHVwIGNvbXBpbGF0aW9uIChvbmx5IGcrKyBhbmQgY2xhbmcrKyknJycpCisKK2RlZiBjb25maWd1cmUoY29uZik6CisJaWYgKGNvbmYub3B0aW9ucy53aXRoX3BjaCBhbmQgY29uZi5lbnZbJ0NPTVBJTEVSX0NYWCddIGluIFBDSF9DT01QSUxFUl9PUFRJT05TLmtleXMoKSk6CisJCWNvbmYuZW52LldJVEhfUENIID0gVHJ1ZQorCQlmbGFncyA9IFBDSF9DT01QSUxFUl9PUFRJT05TW2NvbmYuZW52WydDT01QSUxFUl9DWFgnXV0KKwkJY29uZi5lbnYuQ1hYUENIX0YgPSBmbGFnc1swXQorCQljb25mLmVudi5DWFhQQ0hfRVhUID0gZmxhZ3NbMV0KKwkJY29uZi5lbnYuQ1hYUENIX0ZMQUdTID0gZmxhZ3NbMl0KKworCitAVGFza0dlbi5mZWF0dXJlKCdwY2gnKQorQFRhc2tHZW4uYmVmb3JlKCdwcm9jZXNzX3NvdXJjZScpCitkZWYgYXBwbHlfcGNoKHNlbGYpOgorCWlmIG5vdCBzZWxmLmVudi5XSVRIX1BDSDoKKwkJcmV0dXJuCisKKwlpZiBnZXRhdHRyKHNlbGYuYmxkLCAncGNoX3Rhc2tzJywgTm9uZSkgaXMgTm9uZToKKwkJc2VsZi5ibGQucGNoX3Rhc2tzID0ge30KKworCWlmIGdldGF0dHIoc2VsZiwgJ2hlYWRlcnMnLCBOb25lKSBpcyBOb25lOgorCQlyZXR1cm4KKworCXNlbGYuaGVhZGVycyA9IHNlbGYudG9fbm9kZXMoc2VsZi5oZWFkZXJzKQorCisJaWYgZ2V0YXR0cihzZWxmLCAnbmFtZScsIE5vbmUpOgorCQl0cnk6CisJCQl0YXNrID0gc2VsZi5ibGQucGNoX3Rhc2tzW3NlbGYubmFtZV0KKwkJCXNlbGYuYmxkLmZhdGFsKCJEdXBsaWNhdGVkICdwY2gnIHRhc2sgd2l0aCBuYW1lICVyIiAlIHNlbGYubmFtZSkKKwkJZXhjZXB0IEtleUVycm9yOgorCQkJcGFzcworCisJb3V0ID0gJyVzLiVkJXMnICUgKHNlbGYudGFyZ2V0LCBzZWxmLmlkeCwgc2VsZi5lbnZbJ0NYWFBDSF9FWFQnXSkKKwlvdXQgPSBzZWxmLnBhdGguZmluZF9vcl9kZWNsYXJlKG91dCkKKwl0YXNrID0gc2VsZi5jcmVhdGVfdGFzaygnZ2NoeCcsIHNlbGYuaGVhZGVycywgb3V0KQorCisJIyB0YXJnZXQgc2hvdWxkIGJlIGFuIGFic29sdXRlIHBhdGggb2YgYG91dGAsIGJ1dCB3aXRob3V0IHByZWNvbXBpbGVkIGhlYWRlciBleHRlbnNpb24KKwl0YXNrLnRhcmdldCA9IG91dC5hYnNwYXRoKClbOi1sZW4ob3V0LnN1ZmZpeCgpKV0KKworCXNlbGYucGNoX3Rhc2sgPSB0YXNrCisJaWYgZ2V0YXR0cihzZWxmLCAnbmFtZScsIE5vbmUpOgorCQlzZWxmLmJsZC5wY2hfdGFza3Nbc2VsZi5uYW1lXSA9IHRhc2sKKworQFRhc2tHZW4uZmVhdHVyZSgnY3h4JykKK0BUYXNrR2VuLmFmdGVyX21ldGhvZCgncHJvY2Vzc19zb3VyY2UnLCAncHJvcGFnYXRlX3VzZWxpYl92YXJzJykKK2RlZiBhZGRfcGNoKHNlbGYpOgorCWlmIG5vdCAoc2VsZi5lbnZbJ1dJVEhfUENIJ10gYW5kIGdldGF0dHIoc2VsZiwgJ3VzZScsIE5vbmUpIGFuZCBnZXRhdHRyKHNlbGYsICdjb21waWxlZF90YXNrcycsIE5vbmUpIGFuZCBnZXRhdHRyKHNlbGYuYmxkLCAncGNoX3Rhc2tzJywgTm9uZSkpOgorCQlyZXR1cm4KKworCXBjaCA9IE5vbmUKKwkjIGZpbmQgcGNoIHRhc2ssIGlmIGFueQorCisJaWYgZ2V0YXR0cihzZWxmLCAncGNoX3Rhc2snLCBOb25lKToKKwkJcGNoID0gc2VsZi5wY2hfdGFzaworCWVsc2U6CisJCWZvciB1c2UgaW4gVXRpbHMudG9fbGlzdChzZWxmLnVzZSk6CisJCQl0cnk6CisJCQkJcGNoID0gc2VsZi5ibGQucGNoX3Rhc2tzW3VzZV0KKwkJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCQlwYXNzCisKKwlpZiBwY2g6CisJCWZvciB4IGluIHNlbGYuY29tcGlsZWRfdGFza3M6CisJCQl4LmVudi5hcHBlbmRfdmFsdWUoJ0NYWEZMQUdTJywgc2VsZi5lbnZbJ0NYWFBDSF9GJ10gKyBbcGNoLnRhcmdldF0pCisKK2NsYXNzIGdjaHgoVGFzay5UYXNrKToKKwlydW5fc3RyID0gJyR7Q1hYfSAke0FSQ0hfU1Q6QVJDSH0gJHtDWFhGTEFHU30gJHtDUFBGTEFHU30gJHtDWFhQQ0hfRkxBR1N9ICR7RlJBTUVXT1JLUEFUSF9TVDpGUkFNRVdPUktQQVRIfSAke0NQUFBBVEhfU1Q6SU5DUEFUSFN9ICR7REVGSU5FU19TVDpERUZJTkVTfSAke0NYWFBDSF9GOlNSQ30gJHtDWFhfU1JDX0Z9JHtTUkNbMF0uYWJzcGF0aCgpfSAke0NYWF9UR1RfRn0ke1RHVFswXS5hYnNwYXRoKCl9JworCXNjYW4gICAgPSBjX3ByZXByb2Muc2NhbgorCWNvbG9yICAgPSAnQkxVRScKKwlleHRfb3V0PVsnLmgnXQorCisJZGVmIHJ1bm5hYmxlX3N0YXR1cyhzZWxmKToKKwkJdHJ5OgorCQkJbm9kZV9kZXBzID0gc2VsZi5nZW5lcmF0b3IuYmxkLm5vZGVfZGVwc1tzZWxmLnVpZCgpXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlub2RlX2RlcHMgPSBbXQorCQlyZXQgPSBUYXNrLlRhc2sucnVubmFibGVfc3RhdHVzKHNlbGYpCisJCWlmIHJldCA9PSBUYXNrLlNLSVBfTUUgYW5kIHNlbGYuZW52LkNYWF9OQU1FID09ICdjbGFuZyc6CisJCQl0ID0gb3Muc3RhdChzZWxmLm91dHB1dHNbMF0uYWJzcGF0aCgpKS5zdF9tdGltZQorCQkJZm9yIG4gaW4gc2VsZi5pbnB1dHMgKyBub2RlX2RlcHM6CisJCQkJaWYgb3Muc3RhdChuLmFic3BhdGgoKSkuc3RfbXRpbWUgPiB0OgorCQkJCQlyZXR1cm4gVGFzay5SVU5fTUUKKwkJcmV0dXJuIHJldApkaWZmIC0tZ2l0IGEvTkZELy53YWYtdG9vbHMvc3BoaW54X2J1aWxkLnB5IGIvTkZELy53YWYtdG9vbHMvc3BoaW54X2J1aWxkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MWRhNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvLndhZi10b29scy9zcGhpbnhfYnVpbGQucHkKQEAgLTAsMCArMSw3OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGVuY29kaW5nOiB1dGYtOAorCisjIGluc3BpcmVkIGJ5IGNvZGUgYnkgSGFucy1NYXJ0aW4gdm9uIEdhdWRlY2tlciwgMjAxMgorCitpbXBvcnQgb3MKK2Zyb20gd2FmbGliIGltcG9ydCBOb2RlLCBUYXNrLCBUYXNrR2VuLCBFcnJvcnMsIExvZ3MsIEJ1aWxkLCBVdGlscworCitjbGFzcyBzcGhpbnhfYnVpbGQoVGFzay5UYXNrKToKKyAgICBjb2xvciA9ICdCTFVFJworICAgIHJ1bl9zdHIgPSAnJHtTUEhJTlhfQlVJTER9IC1EICR7VkVSU0lPTn0gLUQgJHtSRUxFQVNFfSAtcSAtYiAke0JVSUxERVJOQU1FfSAtZCAke0RPQ1RSRUVESVJ9ICR7U1JDRElSfSAke09VVERJUn0nCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgZW52ID0gc2VsZi5lbnYKKyAgICAgICAgc3JjX3N0ciA9ICcgJy5qb2luKFthLnBhdGhfZnJvbShhLmN0eC5sYXVuY2hfbm9kZSgpKSBmb3IgYSBpbiBzZWxmLmlucHV0c10pCisgICAgICAgIHRndF9zdHIgPSAnICcuam9pbihbYS5wYXRoX2Zyb20oYS5jdHgubGF1bmNoX25vZGUoKSkgZm9yIGEgaW4gc2VsZi5vdXRwdXRzXSkKKyAgICAgICAgaWYgc2VsZi5vdXRwdXRzOiBzZXAgPSAnIC0+ICcKKyAgICAgICAgZWxzZTogc2VwID0gJycKKyAgICAgICAgcmV0dXJuJyVzIFslc106ICVzJXMlc1xuJyUoc2VsZi5fX2NsYXNzX18uX19uYW1lX18ucmVwbGFjZSgnX3Rhc2snLCcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnZbJ0JVSUxERVJOQU1FJ10sIHNyY19zdHIsIHNlcCwgdGd0X3N0cikKKworQFRhc2tHZW4uZXh0ZW5zaW9uKCcucHknLCAnLnJzdCcpCitkZWYgc2lnX2hvb2soc2VsZiwgbm9kZSk6CisgICAgbm9kZS5zaWc9VXRpbHMuaF9maWxlKG5vZGUuYWJzcGF0aCgpKQorCitAVGFza0dlbi5mZWF0dXJlKCJzcGhpbngiKQorQFRhc2tHZW4uYmVmb3JlX21ldGhvZCgicHJvY2Vzc19zb3VyY2UiKQorZGVmIGFwcGx5X3NwaGlueChzZWxmKToKKyAgICAiIiJTZXQgdXAgdGhlIHRhc2sgZ2VuZXJhdG9yIHdpdGggYSBTcGhpbnggaW5zdGFuY2UgYW5kIGNyZWF0ZSBhIHRhc2suIiIiCisKKyAgICBpbnB1dHMgPSBbXQorICAgIGZvciBpIGluIFV0aWxzLnRvX2xpc3Qoc2VsZi5zb3VyY2UpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpLCBOb2RlLk5vZGUpOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYucGF0aC5maW5kX25vZGUobm9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vZGUgPSBpCisgICAgICAgIGlmIG5vdCBub2RlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignWyVzXSBmaWxlIG5vdCBmb3VuZCcgJSBpKQorICAgICAgICBpbnB1dHMuYXBwZW5kKG5vZGUpCisKKyAgICB0YXNrID0gc2VsZi5jcmVhdGVfdGFzaygnc3BoaW54X2J1aWxkJywgaW5wdXRzKQorCisgICAgY29uZiA9IHNlbGYucGF0aC5maW5kX25vZGUoc2VsZi5jb25maWcpCisgICAgdGFzay5pbnB1dHMuYXBwZW5kKGNvbmYpCisKKyAgICBjb25mZGlyID0gY29uZi5wYXJlbnQuYWJzcGF0aCgpCisgICAgYnVpbGRlcm5hbWUgPSBnZXRhdHRyKHNlbGYsICJidWlsZGVyIiwgImh0bWwiKQorICAgIHNyY2RpciA9IGdldGF0dHIoc2VsZiwgInNyY2RpciIsIGNvbmZkaXIpCisgICAgb3V0ZGlyID0gc2VsZi5wYXRoLmZpbmRfb3JfZGVjbGFyZShnZXRhdHRyKHNlbGYsICJvdXRkaXIiLCBidWlsZGVybmFtZSkpLmdldF9ibGQoKQorICAgIGRvY3RyZWVkaXIgPSBnZXRhdHRyKHNlbGYsICJkb2N0cmVlZGlyIiwgb3MucGF0aC5qb2luKG91dGRpci5hYnNwYXRoKCksICIuZG9jdHJlZXMiKSkKKworICAgIHRhc2suZW52WydCVUlMREVSTkFNRSddID0gYnVpbGRlcm5hbWUKKyAgICB0YXNrLmVudlsnU1JDRElSJ10gPSBzcmNkaXIKKyAgICB0YXNrLmVudlsnRE9DVFJFRURJUiddID0gZG9jdHJlZWRpcgorICAgIHRhc2suZW52WydPVVRESVInXSA9IG91dGRpci5hYnNwYXRoKCkKKyAgICB0YXNrLmVudlsnVkVSU0lPTiddID0gInZlcnNpb249JXMiICUgc2VsZi5WRVJTSU9OCisgICAgdGFzay5lbnZbJ1JFTEVBU0UnXSA9ICJyZWxlYXNlPSVzIiAlIHNlbGYuVkVSU0lPTgorCisgICAgaW1wb3J0IGltcAorICAgIGNvbmZEYXRhID0gaW1wLmxvYWRfc291cmNlKCdzcGhpbnhfY29uZicsIGNvbmYuYWJzcGF0aCgpKQorCisgICAgaWYgYnVpbGRlcm5hbWUgPT0gIm1hbiI6CisgICAgICAgIGZvciBpIGluIGNvbmZEYXRhLm1hbl9wYWdlczoKKyAgICAgICAgICAgIHRhcmdldCA9IG91dGRpci5maW5kX29yX2RlY2xhcmUoJyVzLiVkJyAlIChpWzFdLCBpWzRdKSkKKyAgICAgICAgICAgIHRhc2sub3V0cHV0cy5hcHBlbmQodGFyZ2V0KQorCisgICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfcGF0aDoKKyAgICAgICAgICAgICAgICBzZWxmLmJsZC5pbnN0YWxsX2ZpbGVzKCIlcy9tYW4lZC8iICUgKHNlbGYuaW5zdGFsbF9wYXRoLCBpWzRdKSwgdGFyZ2V0KQorICAgIGVsc2U6CisgICAgICAgIHRhc2sub3V0cHV0cy5hcHBlbmQob3V0ZGlyKQorCitkZWYgY29uZmlndXJlKGNvbmYpOgorICAgIGNvbmYuZmluZF9wcm9ncmFtKCdzcGhpbngtYnVpbGQnLCB2YXI9J1NQSElOWF9CVUlMRCcsIG1hbmRhdG9yeT1GYWxzZSkKKworIyBzcGhpbnggZG9jcworZnJvbSB3YWZsaWIuQnVpbGQgaW1wb3J0IEJ1aWxkQ29udGV4dAorY2xhc3Mgc3BoaW54KEJ1aWxkQ29udGV4dCk6CisgICAgY21kID0gInNwaGlueCIKKyAgICBmdW4gPSAic3BoaW54IgpkaWZmIC0tZ2l0IGEvTkZELy53YWYtdG9vbHMvdHlwZV90cmFpdHMucHkgYi9ORkQvLndhZi10b29scy90eXBlX3RyYWl0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ViMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZELy53YWYtdG9vbHMvdHlwZV90cmFpdHMucHkKQEAgLTAsMCArMSwzMCBAQAorIyAtKi0gTW9kZTogcHl0aG9uOyBweS1pbmRlbnQtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGNvZGluZzogdXRmLTg7IC0qLQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorIworIyBHUEwgMy4wIGxpY2Vuc2UsIHNlZSB0aGUgQ09QWUlORy5tZCBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uCisKK2Zyb20gd2FmbGliIGltcG9ydCBDb25maWd1cmUKKworSVNfREVGQVVMVF9DT05TVFJVQ1RJQkxFX0NIRUNLID0gJycnCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGludD46OnZhbHVlLCAiIik7CisnJycKKworSVNfTU9WRV9DT05TVFJVQ1RJQkxFX0NIRUNLID0gJycnCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfbW92ZV9jb25zdHJ1Y3RpYmxlPGludD46OnZhbHVlLCAiIik7CisnJycKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBpZiBjb25mLmNoZWNrX2N4eChtc2c9J0NoZWNraW5nIGZvciBzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZScsCisgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQ9SVNfREVGQVVMVF9DT05TVFJVQ1RJQkxFX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzPSdjeHgnLCBtYW5kYXRvcnk9RmFsc2UpOgorICAgICAgICBjb25mLmRlZmluZSgnSEFWRV9JU19ERUZBVUxUX0NPTlNUUlVDVElCTEUnLCAxKQorICAgICAgICBjb25mLmVudlsnSEFWRV9JU19ERUZBVUxUX0NPTlNUUlVDVElCTEUnXSA9IFRydWUKKworICAgIGlmIGNvbmYuY2hlY2tfY3h4KG1zZz0nQ2hlY2tpbmcgZm9yIHN0ZDo6aXNfbW92ZV9jb25zdHJ1Y3RpYmxlJywKKyAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudD1JU19NT1ZFX0NPTlNUUlVDVElCTEVfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM9J2N4eCcsIG1hbmRhdG9yeT1GYWxzZSk6CisgICAgICAgIGNvbmYuZGVmaW5lKCdIQVZFX0lTX01PVkVfQ09OU1RSVUNUSUJMRScsIDEpCisgICAgICAgIGNvbmYuZW52WydIQVZFX0lTX01PVkVfQ09OU1RSVUNUSUJMRSddID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvTkZELy53YWYtdG9vbHMvdW5peC1zb2NrZXQucHkgYi9ORkQvLndhZi10b29scy91bml4LXNvY2tldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmUwMzhhCi0tLSAvZGV2L251bGwKKysrIGIvTkZELy53YWYtdG9vbHMvdW5peC1zb2NrZXQucHkKQEAgLTAsMCArMSwyOSBAQAorIyAtKi0gTW9kZTogcHl0aG9uOyBweS1pbmRlbnQtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGNvZGluZzogdXRmLTg7IC0qLQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorIworIyBHUEwgMy4wIGxpY2Vuc2UsIHNlZSB0aGUgQ09QWUlORy5tZCBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uCisKK2Zyb20gd2FmbGliIGltcG9ydCBPcHRpb25zCisKK0JPT1NUX0FTSU9fSEFTX0xPQ0FMX1NPQ0tFVFNfQ0hFQ0sgPSAnJycKKyNpbmNsdWRlIDxib29zdC9hc2lvLmhwcD4KKyNpZm5kZWYgQk9PU1RfQVNJT19IQVNfTE9DQUxfU09DS0VUUworI2Vycm9yICJVbml4IHNvY2tldHMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIKKyNlbmRpZgorJycnCisKK2RlZiBhZGRVbml4T3B0aW9ucyhzZWxmLCBvcHQpOgorICAgIG9wdC5hZGRfb3B0aW9uKCctLWZvcmNlLXVuaXgtc29ja2V0JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdmb3JjZV91bml4X3NvY2tldCcsIGhlbHA9JycnRm9yY2VmdWxseSBlbmFibGUgVW5peCBzb2NrZXRzIHN1cHBvcnQnJycpCitzZXRhdHRyKE9wdGlvbnMuT3B0aW9uc0NvbnRleHQsICJhZGRVbml4T3B0aW9ucyIsIGFkZFVuaXhPcHRpb25zKQorCitkZWYgY29uZmlndXJlKGNvbmYpOgorICAgIGRlZiBib29zdF9hc2lvX2hhc19sb2NhbF9zb2NrZXRzKCk6CisgICAgICAgIHJldHVybiBjb25mLmNoZWNrX2N4eChtc2c9J0NoZWNraW5nIGlmIFVuaXggc29ja2V0cyBhcmUgc3VwcG9ydGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50PUJPT1NUX0FTSU9fSEFTX0xPQ0FMX1NPQ0tFVFNfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcz0nY3h4JywgdXNlPSdCT09TVCcsIG1hbmRhdG9yeT1GYWxzZSkKKworICAgIGlmIGNvbmYub3B0aW9ucy5mb3JjZV91bml4X3NvY2tldCBvciBib29zdF9hc2lvX2hhc19sb2NhbF9zb2NrZXRzKCk6CisgICAgICAgIGNvbmYuZGVmaW5lKCdIQVZFX1VOSVhfU09DS0VUUycsIDEpCisgICAgICAgIGNvbmYuZW52WydIQVZFX1VOSVhfU09DS0VUUyddID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvTkZELy53YWYtdG9vbHMvd2Vic29ja2V0LnB5IGIvTkZELy53YWYtdG9vbHMvd2Vic29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDJlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvLndhZi10b29scy93ZWJzb2NrZXQucHkKQEAgLTAsMCArMSw3OSBAQAorIyBlbmNvZGluZzogdXRmLTgKKworZnJvbSB3YWZsaWIgaW1wb3J0IE9wdGlvbnMsIExvZ3MsIEVycm9ycworZnJvbSB3YWZsaWIuQ29uZmlndXJlIGltcG9ydCBjb25mCisKK2ltcG9ydCByZQorCitkZWYgYWRkV2Vic29ja2V0T3B0aW9ucyhzZWxmLCBvcHQpOgorICAgIG9wdC5hZGRfb3B0aW9uKCctLXdpdGhvdXQtd2Vic29ja2V0JywgYWN0aW9uPSdzdG9yZV9mYWxzZScsIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICBkZXN0PSd3aXRoX3dlYnNvY2tldCcsCisgICAgICAgICAgICAgICAgICAgaGVscD0nRGlzYWJsZSBXZWJTb2NrZXQgZmFjZSBzdXBwb3J0JykKK3NldGF0dHIoT3B0aW9ucy5PcHRpb25zQ29udGV4dCwgImFkZFdlYnNvY2tldE9wdGlvbnMiLCBhZGRXZWJzb2NrZXRPcHRpb25zKQorCitAY29uZgorZGVmIGNoZWNrV2Vic29ja2V0KHNlbGYsICoqa3cpOgorICAgIGlmIG5vdCBzZWxmLm9wdGlvbnMud2l0aF93ZWJzb2NrZXQ6CisgICAgICAgIHJldHVybgorCisgICAgaXNNYW5kYXRvcnkgPSBrdy5nZXQoJ21hbmRhdG9yeScsIFRydWUpCisKKyAgICBzZWxmLnN0YXJ0X21zZygnQ2hlY2tpbmcgZm9yIFdlYlNvY2tldCBpbmNsdWRlcycpCisKKyAgICB0cnk6CisgICAgICAgIHdlYnNvY2tldERpciA9IHNlbGYucGF0aC5maW5kX2Rpcignd2Vic29ja2V0cHAvd2Vic29ja2V0cHAnKQorICAgICAgICBpZiBub3Qgd2Vic29ja2V0RGlyOgorICAgICAgICAgICAgcmFpc2UgRXJyb3JzLldhZkVycm9yKCdOb3QgZm91bmQnKQorCisgICAgICAgIHZlcnNpb25GaWxlID0gd2Vic29ja2V0RGlyLmZpbmRfbm9kZSgndmVyc2lvbi5ocHAnKQorICAgICAgICBpZiBub3Qgd2Vic29ja2V0RGlyOgorICAgICAgICAgICAgcmFpc2UgRXJyb3JzLldhZkVycm9yKCdDb3JydXB0ZWQ6IFdlYlNvY2tldCB2ZXJzaW9uIGZpbGUgbm90IGZvdW5kJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0eHQgPSB2ZXJzaW9uRmlsZS5yZWFkKCkKKyAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9ycy5XYWZFcnJvcignQ29ycnVwdGVkOiBjYW5ub3QgcmVhZCBXZWJTb2NrZXQgdmVyc2lvbiBmaWxlJykKKworICAgICAgICAjIExvb2tpbmcgZm9yIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICMgc3RhdGljIGludCBjb25zdCBtYWpvcl92ZXJzaW9uID0gMDsKKyAgICAgICAgIyBzdGF0aWMgaW50IGNvbnN0IG1pbm9yX3ZlcnNpb24gPSAzOworICAgICAgICAjIHN0YXRpYyBpbnQgY29uc3QgcGF0Y2hfdmVyc2lvbiA9IDA7CisKKyAgICAgICAgdmVyc2lvbiA9IFtOb25lLCBOb25lLCBOb25lXQorCisgICAgICAgIG1ham9yVmVyc2lvbiA9IHJlLmNvbXBpbGUoJ15zdGF0aWMgaW50IGNvbnN0IG1ham9yX3ZlcnNpb24gPSAoXFxkKyk7JCcsIHJlLk0pCisgICAgICAgIHZlcnNpb25bMF0gPSBtYWpvclZlcnNpb24uc2VhcmNoKHR4dCkKKworICAgICAgICBtaW5vclZlcnNpb24gPSByZS5jb21waWxlKCdec3RhdGljIGludCBjb25zdCBtaW5vcl92ZXJzaW9uID0gKFxcZCspOyQnLCByZS5NKQorICAgICAgICB2ZXJzaW9uWzFdID0gbWlub3JWZXJzaW9uLnNlYXJjaCh0eHQpCisKKyAgICAgICAgcGF0Y2hWZXJzaW9uID0gcmUuY29tcGlsZSgnXnN0YXRpYyBpbnQgY29uc3QgcGF0Y2hfdmVyc2lvbiA9IChcXGQrKTskJywgcmUuTSkKKyAgICAgICAgdmVyc2lvblsyXSA9IHBhdGNoVmVyc2lvbi5zZWFyY2godHh0KQorCisgICAgICAgIGlmIG5vdCB2ZXJzaW9uWzBdIG9yIG5vdCB2ZXJzaW9uWzFdIG9yIG5vdCB2ZXJzaW9uWzJdOgorICAgICAgICAgICAgcmFpc2UgRXJyb3JzLldhZkVycm9yKCdDb3JydXB0ZWQ6IGNhbm5vdCBkZXRlY3Qgd2Vic29ja2V0IHZlcnNpb24nKQorCisgICAgICAgIHNlbGYuZW52WydXRUJTT0NLRVRfVkVSU0lPTiddID0gW2kuZ3JvdXAoMSkgZm9yIGkgaW4gdmVyc2lvbl0KKworICAgICAgICAjIHRvZG86IHZlcnNpb24gY2hlY2tpbmcsIGlmIG5lY2Vzc2FyeQorCisgICAgICAgIHNlbGYuZW5kX21zZygnLicuam9pbihzZWxmLmVudlsnV0VCU09DS0VUX1ZFUlNJT04nXSkpCisKKyAgICAgICAgc2VsZi5lbnZbJ0lOQ0xVREVTX1dFQlNPQ0tFVCddID0gd2Vic29ja2V0RGlyLnBhcmVudC5hYnNwYXRoKCkKKyAgICAgICAgc2VsZi5lbnZbJ0hBVkVfV0VCU09DS0VUJ10gPSBUcnVlCisgICAgICAgIHNlbGYuZGVmaW5lKCdIQVZFX1dFQlNPQ0tFVCcsIDEpCisgICAgICAgIHNlbGYuZGVmaW5lKCdfV0VCU09DS0VUUFBfQ1BQMTFfU1RMXycsIDEpCisKKyAgICBleGNlcHQgRXJyb3JzLldhZkVycm9yIGFzIGVycm9yOgorICAgICAgICBpZiBpc01hbmRhdG9yeToKKyAgICAgICAgICAgIHNlbGYuZW5kX21zZyhzdHIoZXJyb3IpLCBjb2xvcj0nUkVEJykKKyAgICAgICAgICAgIExvZ3Mud2FybignSWYgeW91IGFyZSB1c2luZyBnaXQgTkZEIHJlcG9zaXRvcnksIGNoZWNrb3V0IHdlYnNvY2tldHBwIHN1Ym1vZHVsZTogJykKKyAgICAgICAgICAgIExvZ3Mud2FybignICAgIGdpdCBzdWJtb2R1bGUgaW5pdCAmJiBnaXQgc3VibW9kdWxlIHVwZGF0ZScpCisgICAgICAgICAgICBMb2dzLndhcm4oJ090aGVyd2lzZSwgbWFudWFsbHkgZG93bmxvYWQgYW5kIGV4dHJhY3Qgd2Vic29ja2V0cHAgbGlicmFyeTonKQorICAgICAgICAgICAgTG9ncy53YXJuKCcgICAgbWtkaXIgd2Vic29ja2V0cHAnKQorICAgICAgICAgICAgTG9ncy53YXJuKCcgICAgY3VybCAtTCBodHRwczovL2dpdGh1Yi5jb20vemFwaG95ZC93ZWJzb2NrZXRwcC90YXJiYWxsLzQzMDk3NDlkZDk4OTM3YjhhN2JlNWRjMGJmZTY3OWJhMjAxYzU1MTIgPiB3ZWJzb2NrZXQudGFyLmd6JykKKyAgICAgICAgICAgIExvZ3Mud2FybignICAgIHRhciB6eGYgd2Vic29ja2V0LnRhci5neiAtQyB3ZWJzb2NrZXRwcC8gLS1zdHJpcCAxJykKKyAgICAgICAgICAgIExvZ3Mud2FybignQWx0ZXJuYXRpdmVseSwgV2ViU29ja2V0IHN1cHBvcnQgY2FuIGJlIGRpc2FibGVkIHdpdGggLS13aXRob3V0LXdlYnNvY2tldCcpCisgICAgICAgICAgICBzZWxmLmZhdGFsKCJUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbmRfbXNnKHN0cihlcnJvcikpCmRpZmYgLS1naXQgYS9ORkQvQVVUSE9SUy5tZCBiL05GRC9BVVRIT1JTLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzhmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvQVVUSE9SUy5tZApAQCAtMCwwICsxLDczIEBACitORkQgQXV0aG9ycworPT09PT09PT09PT0KKworTkZEIGlzIGFuIG9wZW4gc291cmNlIHByb2plY3Qgc3RhcnRlZCBpbiBsYXRlIDIwMTMsIGluY2x1ZGVzIGNvbnRyaWJ1dGlvbnMKK2Zyb20gbWFueSBwZW9wbGUgYXJvdW5kIHRoZSB3b3JsZCwgYW5kIG9wZW4gZm9yIG5ldyBjb250cmlidXRpb25zIGZyb20gbmV3Cit2b2x1bnRlZXJzLgorCisKKyMjIFByb2plY3QgdGVjaG5pY2FsIGxlYWRzOgorCisqIEFsZXhhbmRlciBBZmFuYXN5ZXYgPGh0dHA6Ly9sYXNyLmNzLnVjbGEuZWR1L2FmYW5hc3lldi9pbmRleC5odG1sPgorKiBKdW54aWFvIFNoaSAgICAgICAgIDxodHRwOi8vd3d3LmNzLmFyaXpvbmEuZWR1L3Blb3BsZS9zaGlqdW54aWFvLz4KKworCisjIyBUZWNobmljYWwgYWR2aXNvcnM6CisKKyogQmVpY2h1YW4gWmhhbmcgICAgICA8aHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9+YnpoYW5nLz4KKyogTGl4aWEgWmhhbmcgICAgICAgICA8aHR0cDovL3d3dy5jcy51Y2xhLmVkdS9+bGl4aWEvPgorCisKKyMjIE1haW4gcHJvamVjdCBhdXRob3JzIGFuZCB0aGVpciBhZmZpbGlhdGlvbnM6CisKKyogVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBMb3MgQW5nZWxlcworCisgICAgKiBBbGV4YW5kZXIgQWZhbmFzeWV2IDxodHRwOi8vbGFzci5jcy51Y2xhLmVkdS9hZmFuYXN5ZXYvaW5kZXguaHRtbD4KKyAgICAqIElseWEgTW9pc2VlbmtvICAgICAgPGh0dHA6Ly9pbHlhbW9pc2VlbmtvLmNvbS8+CisgICAgKiBZaW5nZGkgWXUgICAgICAgICAgIDxodHRwOi8vaXJsLmNzLnVjbGEuZWR1L355aW5nZGkvd2ViL2luZGV4Lmh0bWw+CisgICAgKiBXZW50YW8gU2hhbmcgICAgICAgIDxodHRwOi8vaXJsLmNzLnVjbGEuZWR1L353ZW50YW8vPgorICAgICogTGl4aWEgWmhhbmcgICAgICAgICA8aHR0cDovL3d3dy5jcy51Y2xhLmVkdS9+bGl4aWEvPgorCisqIFRoZSBVbml2ZXJzaXR5IG9mIEFyaXpvbmEKKworICAgICogSnVueGlhbyBTaGkgICAgICAgICA8aHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9wZW9wbGUvc2hpanVueGlhby8+CisgICAgKiBZaSBIdWFuZyAgICAgICAgICAgIDxldGhhbmh1YW5nMTk5MUBnbWFpbC5jb20+CisgICAgKiBKZXJhbGQgUGF1bCBBYnJhaGFtIDxodHRwOi8vd3d3LmNzLmFyaXpvbmEuZWR1L3Blb3BsZS9qZXJhbGRhYnJhaGFtLz4KKyAgICAqIEJlaWNodWFuIFpoYW5nICAgICAgPGh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvfmJ6aGFuZy8+CisKKyogQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eQorCisgICAgKiBTdGV2ZSBEaUJlbmVkZXR0byAgICAgPGh0dHA6Ly93d3cuY3MuY29sb3N0YXRlLmVkdS9+ZGliZW5lZGUvPgorICAgICogQ2hlbmd5dSBGYW4gICAgICAgICAgIDxjaGVuZ3l1QGNzLmNvbG9zdGF0ZS5lZHU+CisgICAgKiBDaHJpc3RvcyBQYXBhZG9wb3Vsb3MgPGh0dHA6Ly93d3cuY3MuY29sb3N0YXRlLmVkdS9+Y2hyaXN0b3MvPgorCisqIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHkKKworICAgICogRGF2aWRlIFBlc2F2ZW50byAgICA8aHR0cDovL3d3dy5saXA2LmZyL2FjdHVhbGl0ZS9wZXJzb25uZXMtZmljaGUucGhwP2lkZW50PUQxNDY5PgorICAgICogR2l1bGlvIEdyYXNzaSAgICAgICA8aHR0cDovL3d3dy5saXA2LmZyL2FjdHVhbGl0ZS9wZXJzb25uZXMtZmljaGUucGhwP2lkZW50PUQxNDYxPgorICAgICogR2lvdmFubmkgUGF1ICAgICAgICA8aHR0cDovL3d3dy5jcy51Y2xhLmVkdS9+Z3BhdS9HaW92YW5uaV9QYXVzX0hvbWVfUGFnZS9Ib21lLmh0bWw+CisKKyogQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorCisgICAgKiBIYW5nIFpoYW5nICAgICAgICAgIDxodHRwOi8vbmV0bGFiLmJpdC5lZHUuY24vel9oYW5nPgorICAgICogVGlhbiBTb25nICAgICAgICAgICA8aHR0cDovL2NzLmJpdC5lZHUuY24vc29uZ3RpYW4+CisKKyogV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcworCisgICAgKiBIYW93ZWkgWXVhbiAgICAgICAgIDxodHRwOi8vd3d3LmNzZS53dXN0bC5lZHUvfnl1YW5oLz4KKyAgICAqIEhpbGEgQmVuIEFicmFoYW0gICAgPGh0dHA6Ly9yZXNlYXJjaC5lbmdpbmVlcmluZy53dXN0bC5lZHUvfmFicmFoYW1oLz4KKyAgICAqIFBhdHJpY2sgQ3Jvd2xleSAgICAgPGh0dHA6Ly93d3cuYXJsLnd1c3RsLmVkdS9+cGNyb3dsZXkvPgorCisqIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKworICAgICogU3llZCBPYmFpZCBBbWluICAgICA8aHR0cDovL29iYWlkYW1pbi53ZWVibHkuY29tLz4KKyAgICAqIFZpbmNlIExlaG1hbiAgICAgICAgPHZzbGVobWFuQG1lbXBoaXMuZWR1PgorICAgICogTGFuIFdhbmcgICAgICAgICAgICA8aHR0cDovL3d3dy5jcy5tZW1waGlzLmVkdS9+bGFud2FuZy8+CisKKyMjIFByb2plY3QgY29udHJpYnV0b3JzCisKK1RoZSBmb2xsb3dpbmcgaXMgYW4gaW5ldml0YWJseSBpbmNvbXBsZXRlIGxpc3Qgb2YgTVVDSC1BUFBSRUNJQVRFRCBDT05UUklCVVRPUlMsCitwZW9wbGUgd2hvIGhhdmUgcmVwb3J0ZWQgYnVncywgc3VibWl0dGVkIHBhdGNoZXMsIGFuZCBpbXBsZW1lbnRlZCBuZXcgZmVhdHVyZXMKK2luIHRoZSBsaWJyYXJ5OgorCisqIFRhaS1MaW4gQ2h1ICAgICAgICAgICAgIDxodHRwczovL3d3dy5saW5rZWRpbi5jb20vcHViL3RhaS1saW4tY2h1LzU1LzViMi82Njk+CmRpZmYgLS1naXQgYS9ORkQvQ09QWUlORy5tZCBiL05GRC9DT1BZSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTk0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvQ09QWUlORy5tZApAQCAtMCwwICsxLDY3NyBAQAorR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKz09PT09PT09PT09PT09PT09PT09PT09PT09CitWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT0KKworPiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIDxodHRwOi8vZnNmLm9yZy8+CisgIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworIyBQcmVhbWJsZQorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBhIGZyZWUsIGNvcHlsZWZ0IGxpY2Vuc2UgZm9yCitzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFuZCBvdGhlciBwcmFjdGljYWwgd29ya3MgYXJlIGRlc2lnbmVkCit0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0bworc2hhcmUgYW5kIGNoYW5nZSBhbGwgdmVyc2lvbnMgb2YgYSBwcm9ncmFtLS10byBtYWtlIHN1cmUgaXQgcmVtYWlucyBmcmVlCitzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9zdCBvZiBvdXIgc29mdHdhcmU7IGl0IGFwcGxpZXMgYWxzbyB0bworYW55IG90aGVyIHdvcmsgcmVsZWFzZWQgdGhpcyB3YXkgYnkgaXRzIGF1dGhvcnMuICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhlbSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3UKK3dhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CitmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKK3RoZXNlIHJpZ2h0cyBvciBhc2tpbmcgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAgVGhlcmVmb3JlLCB5b3UgaGF2ZQorY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmCit5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUKK2ZyZWVkb21zIHRoYXQgeW91IHJlY2VpdmVkLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlCitvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleQora25vdyB0aGVpciByaWdodHMuCisKKyAgRGV2ZWxvcGVycyB0aGF0IHVzZSB0aGUgR05VIEdQTCBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOgorKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKK2dpdmluZyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQuCisKKyAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zCit0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuICBGb3IgYm90aCB1c2VycycgYW5kCithdXRob3JzJyBzYWtlLCB0aGUgR1BMIHJlcXVpcmVzIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgYmUgbWFya2VkIGFzCitjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KK2F1dGhvcnMgb2YgcHJldmlvdXMgdmVyc2lvbnMuCisKKyAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bgorbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIHNvZnR3YXJlIGluc2lkZSB0aGVtLCBhbHRob3VnaCB0aGUgbWFudWZhY3R1cmVyCitjYW4gZG8gc28uICBUaGlzIGlzIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlIHdpdGggdGhlIGFpbSBvZgorcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMKK3BhdHRlcm4gb2Ygc3VjaCBhYnVzZSBvY2N1cnMgaW4gdGhlIGFyZWEgb2YgcHJvZHVjdHMgZm9yIGluZGl2aWR1YWxzIHRvCit1c2UsIHdoaWNoIGlzIHByZWNpc2VseSB3aGVyZSBpdCBpcyBtb3N0IHVuYWNjZXB0YWJsZS4gIFRoZXJlZm9yZSwgd2UKK2hhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQorcHJvZHVjdHMuICBJZiBzdWNoIHByb2JsZW1zIGFyaXNlIHN1YnN0YW50aWFsbHkgaW4gb3RoZXIgZG9tYWlucywgd2UKK3N0YW5kIHJlYWR5IHRvIGV4dGVuZCB0aGlzIHByb3Zpc2lvbiB0byB0aG9zZSBkb21haW5zIGluIGZ1dHVyZSB2ZXJzaW9ucworb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuCisKKyAgRmluYWxseSwgZXZlcnkgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4KK1N0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgorc29mdHdhcmUgb24gZ2VuZXJhbC1wdXJwb3NlIGNvbXB1dGVycywgYnV0IGluIHRob3NlIHRoYXQgZG8sIHdlIHdpc2ggdG8KK2F2b2lkIHRoZSBzcGVjaWFsIGRhbmdlciB0aGF0IHBhdGVudHMgYXBwbGllZCB0byBhIGZyZWUgcHJvZ3JhbSBjb3VsZAorbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQKK3BhdGVudHMgY2Fubm90IGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBwcm9ncmFtIG5vbi1mcmVlLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisjIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyMjIDAuIERlZmluaXRpb25zLgorCisgIF8iVGhpcyBMaWNlbnNlIl8gcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgXyJDb3B5cmlnaHQiXyBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgord29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KKworICBfIlRoZSBQcm9ncmFtIl8gcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcworTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzIF8ieW91Il8uICBfIkxpY2Vuc2VlcyJfIGFuZAorInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgorCisgIFRvIF8ibW9kaWZ5Il8gYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yaworaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCitleGFjdCBjb3B5LiAgVGhlIHJlc3VsdGluZyB3b3JrIGlzIGNhbGxlZCBhIF8ibW9kaWZpZWQgdmVyc2lvbiJfIG9mIHRoZQorZWFybGllciB3b3JrIG9yIGEgd29yayBfImJhc2VkIG9uIl8gdGhlIGVhcmxpZXIgd29yay4KKworICBBIF8iY292ZXJlZCB3b3JrIl8gbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbS4KKworICBUbyBfInByb3BhZ2F0ZSJfIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKK3Blcm1pc3Npb24sIHdvdWxkIG1ha2UgeW91IGRpcmVjdGx5IG9yIHNlY29uZGFyaWx5IGxpYWJsZSBmb3IKK2luZnJpbmdlbWVudCB1bmRlciBhcHBsaWNhYmxlIGNvcHlyaWdodCBsYXcsIGV4Y2VwdCBleGVjdXRpbmcgaXQgb24gYQorY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKK2Rpc3RyaWJ1dGlvbiAod2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiksIG1ha2luZyBhdmFpbGFibGUgdG8gdGhlCitwdWJsaWMsIGFuZCBpbiBzb21lIGNvdW50cmllcyBvdGhlciBhY3Rpdml0aWVzIGFzIHdlbGwuCisKKyAgVG8gXyJjb252ZXkiXyBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCitwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gKK2EgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuCisKKyAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiCit0byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCitmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKK3RlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCitleHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCit3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgordGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKK21lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCisKKyMjIDEuIFNvdXJjZSBDb2RlLgorCisgIFRoZSBfInNvdXJjZSBjb2RlIl8gZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKK2ZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gXyJPYmplY3QgY29kZSJfIG1lYW5zIGFueSBub24tc291cmNlCitmb3JtIG9mIGEgd29yay4KKworICBBIF8iU3RhbmRhcmQgSW50ZXJmYWNlIl8gbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCitzdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCitpbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAoraXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCisKKyAgVGhlIF8iU3lzdGVtIExpYnJhcmllcyJfIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgordGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKK3BhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKK0NvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAorTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCitpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiAgQQorIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50Cisoa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCisoaWYgYW55KSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSB3b3JrIHJ1bnMsIG9yIGEgY29tcGlsZXIgdXNlZCB0bworcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuCisKKyAgVGhlIF8iQ29ycmVzcG9uZGluZyBTb3VyY2UiXyBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCit0aGUgc291cmNlIGNvZGUgbmVlZGVkIHRvIGdlbmVyYXRlLCBpbnN0YWxsLCBhbmQgKGZvciBhbiBleGVjdXRhYmxlCit3b3JrKSBydW4gdGhlIG9iamVjdCBjb2RlIGFuZCB0byBtb2RpZnkgdGhlIHdvcmssIGluY2x1ZGluZyBzY3JpcHRzIHRvCitjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKK1N5c3RlbSBMaWJyYXJpZXMsIG9yIGdlbmVyYWwtcHVycG9zZSB0b29scyBvciBnZW5lcmFsbHkgYXZhaWxhYmxlIGZyZWUKK3Byb2dyYW1zIHdoaWNoIGFyZSB1c2VkIHVubW9kaWZpZWQgaW4gcGVyZm9ybWluZyB0aG9zZSBhY3Rpdml0aWVzIGJ1dAord2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCitpbmNsdWRlcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcyBhc3NvY2lhdGVkIHdpdGggc291cmNlIGZpbGVzIGZvcgordGhlIHdvcmssIGFuZCB0aGUgc291cmNlIGNvZGUgZm9yIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGR5bmFtaWNhbGx5CitsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKK3N1Y2ggYXMgYnkgaW50aW1hdGUgZGF0YSBjb21tdW5pY2F0aW9uIG9yIGNvbnRyb2wgZmxvdyBiZXR3ZWVuIHRob3NlCitzdWJwcm9ncmFtcyBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIHdvcmsuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCB1c2VycworY2FuIHJlZ2VuZXJhdGUgYXV0b21hdGljYWxseSBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBDb3JyZXNwb25kaW5nCitTb3VyY2UuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhIHdvcmsgaW4gc291cmNlIGNvZGUgZm9ybSBpcyB0aGF0CitzYW1lIHdvcmsuCisKKyMjIDIuIEJhc2ljIFBlcm1pc3Npb25zLgorCisgIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCitjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAorY29uZGl0aW9ucyBhcmUgbWV0LiAgVGhpcyBMaWNlbnNlIGV4cGxpY2l0bHkgYWZmaXJtcyB5b3VyIHVubGltaXRlZAorcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKK2NvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cworY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuICBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKK3JpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgorCisgIFlvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QKK2NvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zCitpbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCitvZiBoYXZpbmcgdGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3UKK3dpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCitub3QgY29udHJvbCBjb3B5cmlnaHQuICBUaG9zZSB0aHVzIG1ha2luZyBvciBydW5uaW5nIHRoZSBjb3ZlcmVkIHdvcmtzCitmb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uCithbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKK3lvdXIgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgb3V0c2lkZSB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB5b3UuCisKKyAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKK3RoZSBjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gIFN1YmxpY2Vuc2luZyBpcyBub3QgYWxsb3dlZDsgc2VjdGlvbiAxMAorbWFrZXMgaXQgdW5uZWNlc3NhcnkuCisKKyMjIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCisKKyAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsCittZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUKKzExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgorc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaAorbWVhc3VyZXMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAorY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uCitpcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCit0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yCittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncwordXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCit0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgorCisjIyA0LiBDb252ZXlpbmcgVmVyYmF0aW0gQ29waWVzLgorCisgIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQorcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKK2FwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQorbm9uLXBlcm1pc3NpdmUgdGVybXMgYWRkZWQgaW4gYWNjb3JkIHdpdGggc2VjdGlvbiA3IGFwcGx5IHRvIHRoZSBjb2RlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgb2YgdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbGwKK3JlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCisgIFlvdSBtYXkgY2hhcmdlIGFueSBwcmljZSBvciBubyBwcmljZSBmb3IgZWFjaCBjb3B5IHRoYXQgeW91IGNvbnZleSwKK2FuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCisKKyMjIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCisKKyAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bworcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCisgICAgaXQsIGFuZCBnaXZpbmcgYSByZWxldmFudCBkYXRlLgorCisgICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKKyAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyIHNlY3Rpb24KKyAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvCisgICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KKworICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCisgICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCisgICAgTGljZW5zZSB3aWxsIHRoZXJlZm9yZSBhcHBseSwgYWxvbmcgd2l0aCBhbnkgYXBwbGljYWJsZSBzZWN0aW9uIDcKKyAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLAorICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCisgICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAorICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCisKKyAgICBkKSBJZiB0aGUgd29yayBoYXMgaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2VzLCBlYWNoIG11c3QgZGlzcGxheQorICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQorICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCisgICAgd29yayBuZWVkIG5vdCBtYWtlIHRoZW0gZG8gc28uCisKKyAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAord29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKK2FuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCitpbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCisiYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKK3VzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKK2JleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yaworaW4gYW4gYWdncmVnYXRlIGRvZXMgbm90IGNhdXNlIHRoaXMgTGljZW5zZSB0byBhcHBseSB0byB0aGUgb3RoZXIKK3BhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuCisKKyMjIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgorCisgIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zCitvZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUKK21hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKK2luIG9uZSBvZiB0aGVzZSB3YXlzOgorCisgICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQorICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCisgICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0CisgICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQorICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQorICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCisgICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubworICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcworICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgorCisgICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKKyAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcworICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCisgICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCisgICAgd2l0aCBzdWJzZWN0aW9uIDZiLgorCisgICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKKyAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubworICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCisgICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlCisgICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpCisgICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCisgICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCisgICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KKworICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKKyAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZworICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8KKyAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KKworICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKK2Zyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCitpbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCisKKyAgQSBfIlVzZXIgUHJvZHVjdCJfIGlzIGVpdGhlciAoMSkgYSBfImNvbnN1bWVyIHByb2R1Y3QiXywgd2hpY2ggbWVhbnMgYW55Cit0YW5naWJsZSBwZXJzb25hbCBwcm9wZXJ0eSB3aGljaCBpcyBub3JtYWxseSB1c2VkIGZvciBwZXJzb25hbCwgZmFtaWx5LAorb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgoraW50byBhIGR3ZWxsaW5nLiAgSW4gZGV0ZXJtaW5pbmcgd2hldGhlciBhIHByb2R1Y3QgaXMgYSBjb25zdW1lciBwcm9kdWN0LAorZG91YnRmdWwgY2FzZXMgc2hhbGwgYmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY292ZXJhZ2UuICBGb3IgYSBwYXJ0aWN1bGFyCitwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKK3R5cGljYWwgb3IgY29tbW9uIHVzZSBvZiB0aGF0IGNsYXNzIG9mIHByb2R1Y3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXR1cworb2YgdGhlIHBhcnRpY3VsYXIgdXNlciBvciBvZiB0aGUgd2F5IGluIHdoaWNoIHRoZSBwYXJ0aWN1bGFyIHVzZXIKK2FjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAoraXMgYSBjb25zdW1lciBwcm9kdWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZHVjdCBoYXMgc3Vic3RhbnRpYWwKK2NvbW1lcmNpYWwsIGluZHVzdHJpYWwgb3Igbm9uLWNvbnN1bWVyIHVzZXMsIHVubGVzcyBzdWNoIHVzZXMgcmVwcmVzZW50Cit0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KKworICBfIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiJfIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKK3Byb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbAorYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQorYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0CitzdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdAorY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKK21vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLgorCisgIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCitzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcworcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCitVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCitmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKK2J5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQoraWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwKK21vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMKK2JlZW4gaW5zdGFsbGVkIGluIFJPTSkuCisKKyAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQorcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCitmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcgordGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQorbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKK2FkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZAorcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4KKworICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKK2luIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKK2RvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCitzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKK3VucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgorCisjIyA3LiBBZGRpdGlvbmFsIFRlcm1zLgorCisgIF8iQWRkaXRpb25hbCBwZXJtaXNzaW9ucyJfIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4KK0FkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwKK2JlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKK3RoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCithcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Cit1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Cit0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgorcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mCitpdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCityZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKK2FkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKK2ZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKK2FkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YKK3RoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgorCisgICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCisgICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKKworICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcgorICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKKyAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcgorCisgICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgorICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCisgICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgorCisgICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcgorICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgorCisgICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQorICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcgorCisgICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAorICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mCisgICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgorICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24KKyAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCisKKyAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKK3JlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCitnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKK3Jlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMKK2EgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcworTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zCitvZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcworbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCisKKyAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQorbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCithZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKK3doZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCisKKyAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKK2Zvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7Cit0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCisKKyMjIDguIFRlcm1pbmF0aW9uLgorCisgIFlvdSBtYXkgbm90IHByb3BhZ2F0ZSBvciBtb2RpZnkgYSBjb3ZlcmVkIHdvcmsgZXhjZXB0IGFzIGV4cHJlc3NseQorcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGl0IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyCit0aGlzIExpY2Vuc2UgKGluY2x1ZGluZyBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgdW5kZXIgdGhlIHRoaXJkCitwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCisKKyAgSG93ZXZlciwgaWYgeW91IGNlYXNlIGFsbCB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlLCB0aGVuIHlvdXIKK2xpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQorcHJvdmlzaW9uYWxseSwgdW5sZXNzIGFuZCB1bnRpbCB0aGUgY29weXJpZ2h0IGhvbGRlciBleHBsaWNpdGx5IGFuZAorZmluYWxseSB0ZXJtaW5hdGVzIHlvdXIgbGljZW5zZSwgYW5kIChiKSBwZXJtYW5lbnRseSwgaWYgdGhlIGNvcHlyaWdodAoraG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKK3ByaW9yIHRvIDYwIGRheXMgYWZ0ZXIgdGhlIGNlc3NhdGlvbi4KKworICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKK3JlaW5zdGF0ZWQgcGVybWFuZW50bHkgaWYgdGhlIGNvcHlyaWdodCBob2xkZXIgbm90aWZpZXMgeW91IG9mIHRoZQordmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucywgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaGF2ZQorcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0Citjb3B5cmlnaHQgaG9sZGVyLCBhbmQgeW91IGN1cmUgdGhlIHZpb2xhdGlvbiBwcmlvciB0byAzMCBkYXlzIGFmdGVyCit5b3VyIHJlY2VpcHQgb2YgdGhlIG5vdGljZS4KKworICBUZXJtaW5hdGlvbiBvZiB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIHNlY3Rpb24gZG9lcyBub3QgdGVybWluYXRlIHRoZQorbGljZW5zZXMgb2YgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMgb3IgcmlnaHRzIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CityZWluc3RhdGVkLCB5b3UgZG8gbm90IHF1YWxpZnkgdG8gcmVjZWl2ZSBuZXcgbGljZW5zZXMgZm9yIHRoZSBzYW1lCittYXRlcmlhbCB1bmRlciBzZWN0aW9uIDEwLgorCisjIyA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KKworICBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlIGluIG9yZGVyIHRvIHJlY2VpdmUgb3IKK3J1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK29jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCit0byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuICBIb3dldmVyLAorbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbworbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCitjb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgorCisjIyAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCisKKyAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQorcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCitmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KKworICBBbiBfImVudGl0eSB0cmFuc2FjdGlvbiJfIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4KK29yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4KK29yZ2FuaXphdGlvbiwgb3IgbWVyZ2luZyBvcmdhbml6YXRpb25zLiAgSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCit3b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAordHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCitsaWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKK2dpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKK3RoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KKworICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKK3JpZ2h0cyBncmFudGVkIG9yIGFmZmlybWVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEZvciBleGFtcGxlLCB5b3UgbWF5Citub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKK3JpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CithbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKK3NhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KKworIyMgMTEuIFBhdGVudHMuCisKKyAgQSBfImNvbnRyaWJ1dG9yIl8gaXMgYSBjb3B5cmlnaHQgaG9sZGVyIHdobyBhdXRob3JpemVzIHVzZSB1bmRlciB0aGlzCitMaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQord29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCisKKyAgQSBjb250cmlidXRvcidzIF8iZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiXyBhcmUgYWxsIHBhdGVudCBjbGFpbXMKK293bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLCB3aGV0aGVyIGFscmVhZHkgYWNxdWlyZWQgb3IKK2hlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZAorYnkgdGhpcyBMaWNlbnNlLCBvZiBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLAorYnV0IGRvIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEKK2NvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCitwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBpbmNsdWRlcyB0aGUgcmlnaHQgdG8gZ3JhbnQKK3BhdGVudCBzdWJsaWNlbnNlcyBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZgordGhpcyBMaWNlbnNlLgorCisgIEVhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KK21ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiBpdHMgY29udHJpYnV0b3IgdmVyc2lvbi4KKworICBJbiB0aGUgZm9sbG93aW5nIHRocmVlIHBhcmFncmFwaHMsIGEgInBhdGVudCBsaWNlbnNlIiBpcyBhbnkgZXhwcmVzcworYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQsIGhvd2V2ZXIgZGVub21pbmF0ZWQsIG5vdCB0byBlbmZvcmNlIGEgcGF0ZW50Cisoc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCitzdWUgZm9yIHBhdGVudCBpbmZyaW5nZW1lbnQpLiAgVG8gImdyYW50IiBzdWNoIGEgcGF0ZW50IGxpY2Vuc2UgdG8gYQorcGFydHkgbWVhbnMgdG8gbWFrZSBzdWNoIGFuIGFncmVlbWVudCBvciBjb21taXRtZW50IG5vdCB0byBlbmZvcmNlIGEKK3BhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KKworICBJZiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCBrbm93aW5nbHkgcmVseWluZyBvbiBhIHBhdGVudCBsaWNlbnNlLAorYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKK3RvIGNvcHksIGZyZWUgb2YgY2hhcmdlIGFuZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB0aHJvdWdoIGEKK3B1YmxpY2x5IGF2YWlsYWJsZSBuZXR3b3JrIHNlcnZlciBvciBvdGhlciByZWFkaWx5IGFjY2Vzc2libGUgbWVhbnMsCit0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCithdmFpbGFibGUsIG9yICgyKSBhcnJhbmdlIHRvIGRlcHJpdmUgeW91cnNlbGYgb2YgdGhlIGJlbmVmaXQgb2YgdGhlCitwYXRlbnQgbGljZW5zZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdvcmssIG9yICgzKSBhcnJhbmdlLCBpbiBhIG1hbm5lcgorY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudAorbGljZW5zZSB0byBkb3duc3RyZWFtIHJlY2lwaWVudHMuICAiS25vd2luZ2x5IHJlbHlpbmciIG1lYW5zIHlvdSBoYXZlCithY3R1YWwga25vd2xlZGdlIHRoYXQsIGJ1dCBmb3IgdGhlIHBhdGVudCBsaWNlbnNlLCB5b3VyIGNvbnZleWluZyB0aGUKK2NvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2luIGEgY291bnRyeSwgd291bGQgaW5mcmluZ2Ugb25lIG9yIG1vcmUgaWRlbnRpZmlhYmxlIHBhdGVudHMgaW4gdGhhdAorY291bnRyeSB0aGF0IHlvdSBoYXZlIHJlYXNvbiB0byBiZWxpZXZlIGFyZSB2YWxpZC4KKworICBJZiwgcHVyc3VhbnQgdG8gb3IgaW4gY29ubmVjdGlvbiB3aXRoIGEgc2luZ2xlIHRyYW5zYWN0aW9uIG9yCithcnJhbmdlbWVudCwgeW91IGNvbnZleSwgb3IgcHJvcGFnYXRlIGJ5IHByb2N1cmluZyBjb252ZXlhbmNlIG9mLCBhCitjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKK3JlY2VpdmluZyB0aGUgY292ZXJlZCB3b3JrIGF1dGhvcml6aW5nIHRoZW0gdG8gdXNlLCBwcm9wYWdhdGUsIG1vZGlmeQorb3IgY29udmV5IGEgc3BlY2lmaWMgY29weSBvZiB0aGUgY292ZXJlZCB3b3JrLCB0aGVuIHRoZSBwYXRlbnQgbGljZW5zZQoreW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKK3dvcmsgYW5kIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgordGhlIHNjb3BlIG9mIGl0cyBjb3ZlcmFnZSwgcHJvaGliaXRzIHRoZSBleGVyY2lzZSBvZiwgb3IgaXMKK2NvbmRpdGlvbmVkIG9uIHRoZSBub24tZXhlcmNpc2Ugb2Ygb25lIG9yIG1vcmUgb2YgdGhlIHJpZ2h0cyB0aGF0IGFyZQorc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAord29yayBpZiB5b3UgYXJlIGEgcGFydHkgdG8gYW4gYXJyYW5nZW1lbnQgd2l0aCBhIHRoaXJkIHBhcnR5IHRoYXQgaXMKK2luIHRoZSBidXNpbmVzcyBvZiBkaXN0cmlidXRpbmcgc29mdHdhcmUsIHVuZGVyIHdoaWNoIHlvdSBtYWtlIHBheW1lbnQKK3RvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCit0aGUgd29yaywgYW5kIHVuZGVyIHdoaWNoIHRoZSB0aGlyZCBwYXJ0eSBncmFudHMsIHRvIGFueSBvZiB0aGUKK3BhcnRpZXMgd2hvIHdvdWxkIHJlY2VpdmUgdGhlIGNvdmVyZWQgd29yayBmcm9tIHlvdSwgYSBkaXNjcmltaW5hdG9yeQorcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yaworY29udmV5ZWQgYnkgeW91IChvciBjb3BpZXMgbWFkZSBmcm9tIHRob3NlIGNvcGllcyksIG9yIChiKSBwcmltYXJpbHkKK2ZvciBhbmQgaW4gY29ubmVjdGlvbiB3aXRoIHNwZWNpZmljIHByb2R1Y3RzIG9yIGNvbXBpbGF0aW9ucyB0aGF0Citjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCitvciB0aGF0IHBhdGVudCBsaWNlbnNlIHdhcyBncmFudGVkLCBwcmlvciB0byAyOCBNYXJjaCAyMDA3LgorCisgIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKK2FueSBpbXBsaWVkIGxpY2Vuc2Ugb3Igb3RoZXIgZGVmZW5zZXMgdG8gaW5mcmluZ2VtZW50IHRoYXQgbWF5CitvdGhlcndpc2UgYmUgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhcHBsaWNhYmxlIHBhdGVudCBsYXcuCisKKyMjIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLgorCisgIElmIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCitjb3ZlcmVkIHdvcmsgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5Citub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKK3RvIGNvbGxlY3QgYSByb3lhbHR5IGZvciBmdXJ0aGVyIGNvbnZleWluZyBmcm9tIHRob3NlIHRvIHdob20geW91IGNvbnZleQordGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzCitMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCisKKyMjIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKK3Blcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKK2NvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gYXMgc3VjaC4KKworIyMgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgorCisgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCisgIEVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlCitQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgY2VydGFpbiBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKK29wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IG51bWJlcmVkCit2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBJZiB0aGUgUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIHByb3h5IGNhbiBkZWNpZGUgd2hpY2ggZnV0dXJlCit2ZXJzaW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHVzZWQsIHRoYXQgcHJveHkncworcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQordG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlIFByb2dyYW0uCisKKyAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKK3Blcm1pc3Npb25zLiAgSG93ZXZlciwgbm8gYWRkaXRpb25hbCBvYmxpZ2F0aW9ucyBhcmUgaW1wb3NlZCBvbiBhbnkKK2F1dGhvciBvciBjb3B5cmlnaHQgaG9sZGVyIGFzIGEgcmVzdWx0IG9mIHlvdXIgY2hvb3NpbmcgdG8gZm9sbG93IGEKK2xhdGVyIHZlcnNpb24uCisKKyMjIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgorCisgIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkKK0FQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKK0hPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0KK0lTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRgorQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisjIyAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCitUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQorVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgorREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKK1BBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAorRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0VTLgorCisjIyAxNy4gSW50ZXJwcmV0YXRpb24gb2YgU2VjdGlvbnMgMTUgYW5kIDE2LgorCisgIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAorYWJvdmUgY2Fubm90IGJlIGdpdmVuIGxvY2FsIGxlZ2FsIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlaXIgdGVybXMsCityZXZpZXdpbmcgY291cnRzIHNoYWxsIGFwcGx5IGxvY2FsIGxhdyB0aGF0IG1vc3QgY2xvc2VseSBhcHByb3hpbWF0ZXMKK2FuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKK1Byb2dyYW0sIHVubGVzcyBhIHdhcnJhbnR5IG9yIGFzc3VtcHRpb24gb2YgbGlhYmlsaXR5IGFjY29tcGFuaWVzIGEKK2NvcHkgb2YgdGhlIFByb2dyYW0gaW4gcmV0dXJuIGZvciBhIGZlZS4KKworIyBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCisgIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKK25vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKyAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlICdzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgJ3Nob3cgYycgZm9yIGRldGFpbHMuCisKKyAgVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBfJ3Nob3cgdydfIGFuZCBfJ3Nob3cgYydfIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCittaWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZCB1c2UgYW4gImFib3V0IGJveCIuCisKKyAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKK2lmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLCBhbmQgaG93IHRvIGFwcGx5IGFuZCBmb2xsb3cgdGhlIEdOVSBHUEwsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KK2ludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQorbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoCit0aGUgbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAorPGh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L3doeS1ub3QtbGdwbC5odG1sPi4KZGlmZiAtLWdpdCBhL05GRC9JTlNUQUxMLm1kIGIvTkZEL0lOU1RBTEwubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhMmNlMwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9JTlNUQUxMLm1kCkBAIC0wLDAgKzEsNSBAQAorTkZEIEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NlZSBbYGRvY3MvSU5TVEFMTC5yc3RgXShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9ORkQvYmxvYi9tYXN0ZXIvZG9jcy9JTlNUQUxMLnJzdCkKK2ZvciBkZXRhaWxlZCBORkQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KZGlmZiAtLWdpdCBhL05GRC9SRUFETUUtZGV2Lm1kIGIvTkZEL1JFQURNRS1kZXYubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhZjJlZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9SRUFETUUtZGV2Lm1kCkBAIC0wLDAgKzEsOTggQEAKK05vdGVzIGZvciBORkQgZGV2ZWxvcGVycworPT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tCisKK0luY2x1ZGUgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGJvaWxlcnBsYXRlIGludG8gYWxsIGAuaHBwYCBhbmQgYC5jcHBgIGZpbGVzOgorCisgICAgLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKyAgICAvKioKKyAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICAgICAqCisgICAgICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICAgICAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgICAgICoKKyAgICAgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAgICAgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICAgICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgICAgICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAgICAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqCisgICAgICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICAgICAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICAgICAvLy8vLy8gW29wdGlvbmFsIHBhcnRdIC8vLy8vLworICAgICAqCisgICAgICogXGF1dGhvciBBdXRob3IncyBOYW1lIDxlbWFpbEBkb21haW4+CisgICAgICogXGF1dGhvciBPdGhlciBBdXRob3IncyBOYW1lIDxhbm90aGVyLmVtYWlsQGRvbWFpbj4KKyAgICAgLy8vLy8vIFtlbmQgb2Ygb3B0aW9uYWwgcGFydF0gLy8vLy8vCisgICAgICovCisKK1JlY29tbWVuZGF0aW9ucworLS0tLS0tLS0tLS0tLS0tCisKK05GRCBjb2RlIGlzIHN1YmplY3QgdG8gTkZEIFtjb2RlIHN0eWxlXShodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9Db2RlU3R5bGUpLgorCisKK1J1bm5pbmcgdW5pdC10ZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJ1biB1bml0IHRlc3RzLCBORkQgbmVlZHMgdG8gYmUgY29uZmlndXJlZCBhbmQgYnVpbGQgd2l0aCB1bml0IHRlc3Qgc3VwcG9ydDoKKworICAgIC4vd2FmIGNvbmZpZ3VyZSAtLXdpdGgtdGVzdHMKKyAgICAuL3dhZgorCitUaGUgc2ltcGxlc3Qgd2F5IHRvIHJ1biB0ZXN0cywgaXMganVzdCB0byBydW4gdGhlIGNvbXBpbGVkIGJpbmFyeSB3aXRob3V0IGFueSBwYXJhbWV0ZXJzOgorCisgICAgIyBSdW4gY29yZSB0ZXN0cworICAgIC4vYnVpbGQvdW5pdC10ZXN0cy1jb3JlCisKKyAgICAjIFJ1biAgTkZEIGRhZW1vbiB0ZXN0cworICAgIC4vYnVpbGQvdW5pdC10ZXN0cy1kYWVtb24KKworICAgICMgUnVuIE5GRCBSSUIgbWFuYWdlbWVudCB0ZXN0cworICAgIC4vYnVpbGQvdW5pdC10ZXN0cy1yaWIKKworSG93ZXZlciwgW0Jvb3N0LlRlc3QgZnJhbWV3b3JrXShodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy8xXzQ4XzAvbGlicy90ZXN0L2RvYy9odG1sLykKK2lzIHZlcnkgZmxleGlibGUgYW5kIGFsbG93cyBhIG51bWJlciBvZiBydW4tdGltZSBjdXN0b21pemF0aW9uIG9mIHdoYXQgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KK0ZvciBleGFtcGxlLCBpdCBpcyBwb3NzaWJsZSB0byBjaG9vc2UgdG8gcnVuIG9ubHkgYSBzcGVjaWZpYyB0ZXN0IHN1aXRlLCBvbmx5IGEgc3BlY2lmaWMKK3Rlc3QgY2FzZSB3aXRoaW4gYSBzdWl0ZSwgb3Igc3BlY2lmaWMgdGVzdCBjYXNlcyB3aXRoaW4gc3BlY2lmaWMgdGVzdCBzdWl0ZXM6CisKKyAgICAjIFJ1biBvbmx5IFRDUCBGYWNlIHRlc3Qgc3VpdGUgb2YgTkZEIGRhZW1vbiB0ZXN0cyAoc2VlIHRlc3RzL2RhZW1vbi9mYWNlL3RjcC5jcHApCisgICAgLi9idWlsZC91bml0LXRlc3RzLWRhZW1vbiAtdCBGYWNlVGNwCisKKyAgICAjIFJ1biBvbmx5IHRlc3QgY2FzZSBFbmRUb0VuZDQgZnJvbSB0aGUgc2FtZSB0ZXN0IHN1aXRlCisgICAgLi9idWlsZC91bml0LXRlc3RzLWRhZW1vbiAtdCBGYWNlVGNwL0VuZFRvRW5kNAorCisgICAgIyBSdW4gQmFzaWMgdGVzdCBjYXNlIGZyb20gYWxsIGNvcmUgdGVzdCBzdWl0ZXMKKyAgICAuL2J1aWxkL3VuaXQtdGVzdHMtY29yZSAtdCAqL0Jhc2ljCisKK0J5IGRlZmF1bHQsIEJvb3N0LlRlc3QgZnJhbWV3b3JrIHdpbGwgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCBvbmx5IHdoZW4gYSB0ZXN0IGNhc2UgZmFpbHMuCitJZiBpdCBpcyBkZXNpcmVkIHRvIHNlZSB2ZXJib3NlIG91dHB1dCAocmVzdWx0IG9mIGVhY2ggdGVzdCBhc3NlcnRpb24pLCBhZGQgYC1sIGFsbGAKK29wdGlvbiB0byBgLi9idWlsZC91bml0LXRlc3RzYCBjb21tYW5kLiAgVG8gc2VlIHRlc3QgcHJvZ3Jlc3MsIHlvdSBjYW4gdXNlIGAtbCB0ZXN0X3N1aXRlYAorb3IgYC1wYCB0byBzaG93IHByb2dyZXNzIGJhcjoKKworICAgICMgU2hvdyByZXBvcnQgYWxsIGxvZyBtZXNzYWdlcyBpbmNsdWRpbmcgdGhlIHBhc3NlZCB0ZXN0IG5vdGlmaWNhdGlvbgorICAgIC4vYnVpbGQvdW5pdC10ZXN0cy1kYWVtb24gLWwgYWxsCisKKyAgICAjIFNob3cgdGVzdCBzdWl0ZSBtZXNzYWdlcworICAgIC4vYnVpbGQvdW5pdC10ZXN0cy1kYWVtb24gLWwgdGVzdF9zdWl0ZQorCisgICAgIyBTaG93IG5vdGhpbmcKKyAgICAuL2J1aWxkL3VuaXQtdGVzdHMtZGFlbW9uIC1sIG5vdGhpbmcKKworICAgICMgU2hvdyBwcm9ncmVzcyBiYXIKKyAgICAuL2J1aWxkL3VuaXQtdGVzdHMtY29yZSAtcAorCitUaGVyZSBhcmUgbWFueSBtb3JlIGNvbW1hbmQgbGluZSBvcHRpb25zIGF2YWlsYWJsZSwgaW5mb3JtYXRpb24gYWJvdXQKK3doaWNoIGNhbiBiZSBvYnRhaW5lZCBlaXRoZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIGAtLWhlbHBgCitzd2l0Y2gsIG9yIG9ubGluZSBvbiBbQm9vc3QuVGVzdCBsaWJyYXJ5XShodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy8xXzQ4XzAvbGlicy90ZXN0L2RvYy9odG1sLykKK3dlYnNpdGUuCmRpZmYgLS1naXQgYS9ORkQvUkVBRE1FLm1kIGIvTkZEL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTViZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL1JFQURNRS5tZApAQCAtMCwwICsxLDQyIEBACitORkQgLSBOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nIHN0ZXAtYnktc3RlcCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGFuZAordHV0b3JpYWxzLCBwbGVhc2UgdmlzaXQgdGhlIFtORkQgaG9tZXBhZ2VdKGh0dHA6Ly9uYW1lZC1kYXRhLm5ldC9kb2MvTkZELykuCisKKyMjIE92ZXJ2aWV3CisKK05GRCBpcyBhIG5ldHdvcmsgZm9yd2FyZGVyIHRoYXQgaW1wbGVtZW50cyBhbmQgZXZvbHZlcyB0b2dldGhlciB3aXRoIHRoZSBOYW1lZCBEYXRhCitOZXR3b3JraW5nIChORE4pIFtwcm90b2NvbF0oaHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9uZG4tdGx2LykuICBBZnRlciB0aGUgaW5pdGlhbAorcmVsZWFzZSwgTkZEIHdpbGwgYmVjb21lIGEgY29yZSBjb21wb25lbnQgb2YgdGhlCitbTkROIFBsYXRmb3JtXShodHRwOi8vbmFtZWQtZGF0YS5uZXQvY29kZWJhc2UvcGxhdGZvcm0vKSBhbmQgd2lsbCBmb2xsb3cgdGhlIHNhbWUgcmVsZWFzZQorY3ljbGUuCisKK05GRCBpcyBhbiBvcGVuIGFuZCBmcmVlIHNvZnR3YXJlIHBhY2thZ2UgbGljZW5zZWQgdW5kZXIgR1BMIDMuMCBsaWNlbnNlIGFuZCBpcyB0aGUKK2NlbnRlcnBpZWNlIG9mIG91ciBjb21taXR0ZW1lbnQgdG8gbWFraW5nIE5ETidzIGNvcmUgdGVjaG5vbG9neSBvcGVuIGFuZCBmcmVlIHRvIGFsbAorSW50ZXJuZXQgdXNlcnMgYW5kIGRldmVsb3BlcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGljZW5zaW5nIGRldGFpbHMgYW5kCitsaW1pdGF0aW9uLCByZWZlciB0bworW2BDT1BZSU5HLm1kYF0oaHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvTkZEL2Jsb2IvbWFzdGVyL0NPUFlJTkcubWQpLgorCitORkQgaXMgZGV2ZWxvcGVkIGJ5IGEgY29tbXVuaXR5IGVmZm9ydC4gIEFsdGhvdWdoIHRoZSBmaXJzdCByZWxlYXNlIHdhcyBtb3N0bHkgZG9uZSBieSB0aGUKK21lbWJlcnMgb2YgW05TRi1zcG9uc29yZWQgTkROIHByb2plY3QgdGVhbV0oaHR0cDovL25hbWVkLWRhdGEubmV0L3Byb2plY3QvcGFydGljaXBhbnRzLyksCitpdCBhbHJlYWR5IGNvbnRhaW5zIHNpZ25pZmljYW50IGNvbnRyaWJ1dGlvbnMgZnJvbSBwZW9wbGUgb3V0c2lkZSB0aGUgcHJvamVjdCB0ZWFtIChmb3IKK21vcmUgZGV0YWlscywgcmVmZXIgdG8KK1tgQVVUSE9SUy5tZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL05GRC9ibG9iL21hc3Rlci9BVVRIT1JTLm1kKSkuICBXZSBzdHJvbmdseQorZW5jb3VyYWdlIHBhcnRpY2lwYXRpb24gZnJvbSBhbGwgaW50ZXJlc3RlZCBwYXJ0aWVzLCBzaW5jZSBicm9hZGVyIGNvbW11bml0eSBzdXBwb3J0IGlzCitrZXkgZm9yIE5ETiB0byBzdWNjZWVkIGFzIGEgbmV3IEludGVybmV0IGFyY2hpdGVjdHVyZS4gIEJ1ZyByZXBvcnRzIGFuZCBmZWVkYmFjayBhcmUKK2hpZ2hseSBhcHByZWNpYXRlZCBhbmQgY2FuIGJlIG1hZGUgdGhyb3VnaAorW1JlZG1pbmUgc2l0ZV0oaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkKSBhbmQgdGhlCitbbmRuLWludGVyZXN0IG1haWxpbmcgbGlzdF0oaHR0cDovL3d3dy5saXN0cy5jcy51Y2xhLmVkdS9tYWlsbWFuL2xpc3RpbmZvL25kbi1pbnRlcmVzdCkuCisKK1RoZSBtYWluIGRlc2lnbiBnb2FsIG9mIE5GRCBpcyB0byBzdXBwb3J0IGRpdmVyc2UgZXhwZXJpbWVudGF0aW9uIG9mIE5ETiB0ZWNobm9sb2d5LiAgVGhlCitkZXNpZ24gZW1waGFzaXplcyAqbW9kdWxhcml0eSogYW5kICpleHRlbnNpYmlsaXR5KiB0byBhbGxvdyBlYXN5IGV4cGVyaW1lbnRzIHdpdGggbmV3Citwcm90b2NvbCBmZWF0dXJlcywgYWxnb3JpdGhtcywgbmV3IGFwcGxpY2F0aW9ucy4gIFdlIGhhdmUgbm90IGZ1bGx5IG9wdGltaXplZCB0aGUgY29kZSBmb3IKK3BlcmZvcm1hbmNlLiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgYXJlIG9uZSB0eXBlIG9mIGV4cGVyaW1lbnRzCit0aGF0IGRldmVsb3BlcnMgY2FuIGNvbmR1Y3QgYnkgdHJ5aW5nIG91dCBkaWZmZXJlbnQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkaWZmZXJlbnQKK2FsZ29yaXRobXM7IG92ZXIgdGltZSwgYmV0dGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZW1lcmdlIHdpdGhpbiB0aGUgc2FtZSBkZXNpZ24gZnJhbWV3b3JrLgorCitORkQgd2lsbCBrZWVwIGV2b2x2aW5nIGluIHRocmVlIGFzcGVjdHM6IGltcHJvdmVtZW50IG9mIHRoZSBtb2R1bGFyaXR5IGZyYW1ld29yaywga2VlcGluZwordXAgd2l0aCB0aGUgTkROIHByb3RvY29sIHNwZWMsIGFuZCBhZGRpdGlvbiBvZiBvdGhlciBuZXcgZmVhdHVyZXMuIFdlIGhvcGUgdG8ga2VlcCB0aGUKK21vZHVsYXIgZnJhbWV3b3JrIHN0YWJsZSBhbmQgbGVhbiwgYWxsb3dpbmcgcmVzZWFyY2hlcnMgdG8gaW1wbGVtZW50IGFuZCBleHBlcmltZW50IHdpdGgKK3ZhcmlvdXMgZmVhdHVyZXMsIHNvbWUgb2Ygd2hpY2ggbWF5IGV2ZW50dWFsbHkgd29yayBpbnRvIHRoZSBwcm90b2NvbCBzcGVjLgpkaWZmIC0tZ2l0IGEvTkZEL2NvbW1vbi5ocHAgYi9ORkQvY29tbW9uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzE2MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvbW1vbi5ocHAKQEAgLTAsMCArMSwxMTEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0NPTU1PTl9IUFAKKyNkZWZpbmUgTkZEX0NPTU1PTl9IUFAKKworI2luY2x1ZGUgImNvbmZpZy5ocHAiCisKKyNpZmRlZiBXSVRIX1RFU1RTCisjZGVmaW5lIFZJUlRVQUxfV0lUSF9URVNUUyB2aXJ0dWFsCisjZGVmaW5lIFBVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJPVEVDVEVEIHB1YmxpYworI2RlZmluZSBQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BSSVZBVEUgcHVibGljCisjZGVmaW5lIFBST1RFQ1RFRF9XSVRIX1RFU1RTX0VMU0VfUFJJVkFURSBwcm90ZWN0ZWQKKyNlbHNlCisjZGVmaW5lIFZJUlRVQUxfV0lUSF9URVNUUworI2RlZmluZSBQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BST1RFQ1RFRCBwcm90ZWN0ZWQKKyNkZWZpbmUgUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFIHByaXZhdGUKKyNkZWZpbmUgUFJPVEVDVEVEX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFIHByaXZhdGUKKyNlbmRpZgorCisvKiogXGRlZiBERUNMX09WRVJSSURFCisgKiAgXGJyaWVmIGV4cGFuZHMgdG8gJ292ZXJyaWRlJyBpZiBjb21waWxlciBzdXBwb3J0cyB0aGlzIGZlYXR1cmUsIG90aGVyd2lzZSBleHBhbmRzIHRvIG5vdGhpbmcKKyAqLworI2lmZGVmIEhBVkVfQ1hYX09WRVJSSURFCisjZGVmaW5lIERFQ0xfT1ZFUlJJREUgb3ZlcnJpZGUKKyNlbHNlCisjZGVmaW5lIERFQ0xfT1ZFUlJJREUKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxuZG4tY3h4L2NvbW1vbi5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9pbnRlcmVzdC5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9kYXRhLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvZXZlbnQtZW1pdHRlci5ocHA+IC8vIGRlcHJlY2F0ZWQKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvc2lnbmFsLmhwcD4KKworI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2FzaW8uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9wdHJlZS5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworCit1c2luZyBzdGQ6OnNpemVfdDsKKwordXNpbmcgYm9vc3Q6Om5vbmNvcHlhYmxlOworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Cit1c2luZyBzdGQ6OndlYWtfcHRyOwordXNpbmcgc3RkOjpiYWRfd2Vha19wdHI7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczsKKwordXNpbmcgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0OworCit1c2luZyBzdGQ6OmZ1bmN0aW9uOwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpyZWY7Cit1c2luZyBzdGQ6OmNyZWY7CisKK3VzaW5nIG5kbjo6SW50ZXJlc3Q7Cit1c2luZyBuZG46OkRhdGE7Cit1c2luZyBuZG46Ok5hbWU7Cit1c2luZyBuZG46OkV4Y2x1ZGU7Cit1c2luZyBuZG46OkJsb2NrOwordXNpbmcgbmRuOjp1dGlsOjpFdmVudEVtaXR0ZXI7IC8vIGRlcHJlY2F0ZWQKKworbmFtZXNwYWNlIHRsdiB7CisvLyBEb24ndCB3cml0ZSAibmFtZXNwYWNlIHRsdiA9IG5kbjo6dGx2IiwgYmVjYXVzZSBORkQgY2FuIGFkZCBvdGhlciBtZW1iZXJzIGludG8gdGhpcyBuYW1lc3BhY2UuCit1c2luZyBuYW1lc3BhY2UgbmRuOjp0bHY7Cit9IC8vIG5hbWVzcGFjZSB0bHYKKworbmFtZXNwYWNlIG5hbWUgPSBuZG46Om5hbWU7CituYW1lc3BhY2UgdGltZSA9IG5kbjo6dGltZTsKK25hbWVzcGFjZSBzaWduYWwgPSBuZG46OnV0aWw6OnNpZ25hbDsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfQ09NTU9OX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2NvbnRyaWIvb3N4LWxhdW5jaGQvUkVBRE1FLm1kIGIvTkZEL2NvbnRyaWIvb3N4LWxhdW5jaGQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDNiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29udHJpYi9vc3gtbGF1bmNoZC9SRUFETUUubWQKQEAgLTAsMCArMSwxMzggQEAKK1N0YXJ0aW5nIE5GRCBvbiBPU1ggPj0gMTAuOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK09TWCBwcm92aWRlcyBhIHN0YW5kYXJkIHdheSB0byBzdGFydCBzeXN0ZW0gZGFlbW9ucywgbW9uaXRvciB0aGVpciBoZWFsdGgsIGFuZCByZXN0YXJ0Cit3aGVuIHRoZXkgZGllLgorCitJbml0aWFsIHNldHVwCistLS0tLS0tLS0tLS0tCisKK0VkaXQgYG5ldC5uYW1lZC1kYXRhLm5mZGAgYW5kIGBuZXQubmFtZWQtZGF0YS5ucmRgIGNvcnJlY3RpbmcgcGF0aHMgZm9yIGBuZmRgIGFuZCBgbmZkYAorYmluYXJpZXMsIGNvbmZpZ3VyYXRpb24gZmlsZSwgYW5kIGxvZyBmaWxlcy4KKworICAgICMgQ29weSBsYXVuY2hkLnBsaXN0IGZvciBuZmQgKGZvcndhcmRpbmcgZGFlbW9uKQorICAgIHN1ZG8gY3AgbmV0Lm5hbWVkLWRhdGEubmZkLnBsaXN0IC9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvCisgICAgc3VkbyBjaG93biByb290IC9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvbmV0Lm5hbWVkLWRhdGEubmZkLnBsaXN0CisKKyAgICAjIENvcHkgbGF1bmNoZC5wbGlzdCBmb3IgbnJkIChSSUIgbWFuYWdlbWVudCBkYWVtb24pCisgICAgc3VkbyBjcCBuZXQubmFtZWQtZGF0YS5ucmQucGxpc3QgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8KKyAgICBzdWRvIGNob3duIHJvb3QgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy9uZXQubmFtZWQtZGF0YS5ucmQucGxpc3QKKworIyMjIEFzc3VtcHRpb25zIGluIHRoZSBkZWZhdWx0IHNjcmlwdHMKKworKiBgbmZkYCBhbmQgYG5yZGAgYXJlIGluc3RhbGxlZCBpbnRvIGAvdXNyL2xvY2FsL2JpbmAKKyogQ29uZmlndXJhdGlvbiBmaWxlIGlzIGAvdXNyL2xvY2FsL2V0Yy9uZG4vbmZkLmNvbmZgCisqIGBuZmRgIHdpbGwgYmUgcnVuIGFzIHJvb3QKKyogYG5yZGAgd2lsbCBiZSBydW4gYXMgdXNlciBgbmRuYCBhbmQgZ3JvdXAgYG5kbmAKKyogTG9nIGZpbGVzIHdpbGwgYmUgd3JpdHRlbiB0byBgL3Vzci9sb2NhbC92YXIvbG9nL25kbmAgZm9sZGVyLCB3aGljaCBpcyBvd25lZCBieSB1c2VyIGBuZG5gCisKKyMjIyBDcmVhdGluZyB1c2VycworCitJZiBgbmRuYCB1c2VyIGRvZXMgbm90IGV4aXN0cywgaXQgbmVlZHMgdG8gYmUgbWFudWFsbHkgY3JlYXRlZCAocHJvY2VkdXJlIGNvcGllZCBmcm9tCitbbWFjcG9ydHMgc2NyaXB0XShodHRwczovL3RyYWMubWFjcG9ydHMub3JnL2Jyb3dzZXIvdHJ1bmsvYmFzZS9zcmMvcG9ydDEuMC9wb3J0dXRpbC50Y2wpKS4KK1VwZGF0ZSB1aWQvZ2lkIGlmIDYzNjMgaXMgYWxyZWFkeSB1c2VkLgorCisgICAgIyBDcmVhdGUgdXNlciBgbmRuYAorICAgIHN1ZG8gZHNjbCAuIC1jcmVhdGUgL1VzZXJzL25kbiBVbmlxdWVJRCA2MzYzCisKKyAgICAjIFRoZXNlIGFyZSBpbXBsaWNpdGx5IGFkZGVkIG9uIE1hYyBPU1ggTGlvbi4gIEF1dGhlbnRpY2F0aW9uQXV0aG9yaXR5CisgICAgIyBjYXVzZXMgdGhlIHVzZXIgdG8gYmUgdmlzaWJsZSBpbiB0aGUgVXNlcnMgJiBHcm91cHMgUHJlZmVyZW5jZSBQYW5lLAorICAgICMgYW5kIHRoZSBvdGhlcnMgYXJlIGp1c3Qgbm9pc2UsIHNvIGRlbGV0ZSB0aGVtLgorICAgICMgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy90aWNrZXQvMzAxNjgKKyAgICBzdWRvIGRzY2wgLiAtZGVsZXRlIC9Vc2Vycy9uZG4gQXV0aGVudGljYXRpb25BdXRob3JpdHkKKyAgICBzdWRvIGRzY2wgLiAtZGVsZXRlIC9Vc2Vycy9uZG4gUGFzc3dvcmRQb2xpY3lPcHRpb25zCisgICAgc3VkbyBkc2NsIC4gLWRlbGV0ZSAvVXNlcnMvbmRuIGRzQXR0clR5cGVOYXRpdmU6S2VyYmVyb3NLZXlzCisgICAgc3VkbyBkc2NsIC4gLWRlbGV0ZSAvVXNlcnMvbmRuIGRzQXR0clR5cGVOYXRpdmU6U2hhZG93SGFzaERhdGEKKworICAgIHN1ZG8gZHNjbCAuIC1jcmVhdGUgL1VzZXJzL25kbiBSZWFsTmFtZSAiTkROIFVzZXIiCisgICAgc3VkbyBkc2NsIC4gLWNyZWF0ZSAvVXNlcnMvbmRuIFBhc3N3b3JkICJ7Kn0iCisgICAgc3VkbyBkc2NsIC4gLWNyZWF0ZSAvVXNlcnMvbmRuIFByaW1hcnlHcm91cElEIDYzNjMKKyAgICBzdWRvIGRzY2wgLiAtY3JlYXRlIC9Vc2Vycy9uZG4gTkZTSG9tZURpcmVjdG9yeSAvdmFyL2VtcHR5CisgICAgc3VkbyBkc2NsIC4gLWNyZWF0ZSAvVXNlcnMvbmRuIFVzZXJTaGVsbCAvdXNyL2Jpbi9mYWxzZQorCisgICAgIyBDcmVhdGUgZ3JvdXAgYG5kbmAKKyAgICBzdWRvIGRzY2wgLiAtY3JlYXRlIC9Hcm91cHNuZG4gUGFzc3dvcmQgInsqfSIKKyAgICBzdWRvIGRzY2wgLiAtY3JlYXRlIC9Hcm91cHMvbmRuIFJlYWxOYW1lICJORE4gVXNlciIKKyAgICBzdWRvIGRzY2wgLiAtY3JlYXRlIC9Hcm91cHMvbmRuIFByaW1hcnlHcm91cElEIDYzNjMKKworIyMjIENyZWF0aW5nIGZvbGRlcnMKKworRm9sZGVyIGAvdXNyL2xvY2FsL3Zhci9sb2cvbmRuYCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYXNzaWduZWQgcHJvcGVyIHVzZXIgYW5kIGdyb3VwOgorCisgICAgc3VkbyBta2RpciAtcCAvdXNyL2xvY2FsL3Zhci9sb2cvbmRuCisgICAgc3VkbyBjaG93biAtUiBuZG46bmRuIC91c3IvbG9jYWwvdmFyL2xvZy9uZG4KKworYEhPTUVgIGRpcmVjdG9yaWVzIGZvciBgbmZkYCBhbmQgYG5yZGAgc2hvdWxkIGJlIGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgd2l0aCBjb3JyZWN0CitsaWJyYXJ5J3MgY29uZmlnIGZpbGUgYW5kIGNvbnRhaW4gcHJvcGVyIE5ETiBzZWN1cml0eSBjcmVkZW50aWFscyBmb3Igc2lnbmluZyBEYXRhCitwYWNrZXRzLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgZGVmYXVsdCBwcml2YXRlIGtleSBzdG9yYWdlIG9uIE9TWCAoYG9zeC1rZXljaGFpbmApIGRvZXMKK25vdCBzdXBwb3J0IG5vbi1pbnRlcmFjdGl2ZSBhY2Nlc3MsIGFuZCBmaWxlLWJhc2VkIHByaXZhdGUga2V5IHN0b3JhZ2UgbmVlZHMgdG8gYmUgdXNlZDoKKworICAgICMgR2VuZXJhdGUgc2VsZi1zaWduZWQgTkROIGNlcnRpZmljYXRlIGZvciBuZmQgKG93bmVkIGJ5IHJvb3QpCisgICAgc3VkbyBta2RpciAtcCAvdXNyL2xvY2FsL3Zhci9saWIvbmRuL25mZC8ubmRuCisgICAgc3VkbyBzaCAtYyAnZWNobyB0cG09ZmlsZSA+IC91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbmZkLy5uZG4vY2xpZW50LmNvbmYnCisgICAgc3VkbyBIT01FPS91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbmZkIG5kbnNlYy1rZXlnZW4gL2xvY2FsaG9zdC9kYWVtb25zL25mZCB8IFwKKyAgICAgIHN1ZG8gSE9NRT0vdXNyL2xvY2FsL3Zhci9saWIvbmRuL25mZCBuZG5zZWMtaW5zdGFsbC1jZXJ0IC0KKworICAgICMgR2VuZXJhdGUgc2VsZi1zaWduZWQgTkROIGNlcnRpZmljYXRlIGZvciBucmQgKG93bmVkIGJ5IG5kbikKKyAgICBzdWRvIG1rZGlyIC1wIC91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbnJkLy5uZG4KKyAgICBzdWRvIGNob3duIC1SIG5kbjpuZG4gL3Vzci9sb2NhbC92YXIvbGliL25kbi9ucmQKKyAgICBzdWRvIC11IG5kbiAtZyBuZG4gc2ggLWMgJ2VjaG8gdHBtPWZpbGUgPiAvdXNyL2xvY2FsL3Zhci9saWIvbmRuL25yZC8ubmRuL2NsaWVudC5jb25mJworICAgIHN1ZG8gLXUgbmRuIC1nIG5kbiBIT01FPS91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbnJkIG5kbnNlYy1rZXlnZW4gL2xvY2FsaG9zdC9kYWVtb25zL25yZCB8IFwKKyAgICAgIHN1ZG8gLXUgbmRuIC1nIG5kbiBIT01FPS91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbnJkIG5kbnNlYy1pbnN0YWxsLWNlcnQgLQorCisjIyMgQ29uZmlndXJpbmcgTkZEJ3Mgc2VjdXJpdHkKKworTkZEIHNhbXBsZSBjb25maWd1cmF0aW9uIGFsbG93cyBhbnlib2R5IHRvIGNyZWF0ZSBmYWNlcywgYWRkIG5leHRob3BzIHRvIEZJQiwKK2FuZCBzZXQgc3RyYXRlZ3kgY2hvaWNlIGZvciBuYW1lc3BhY2VzLiAgV2hpbGUgc3VjaCBzZXR0aW5ncyBjb3VsZCBiZSBhIGdvb2Qgc3RhcnQsIGl0IGlzCitnZW5lcmFsbHkgbm90IGEgZ29vZCBpZGVhIHRvIHJ1biBORkQgaW4gdGhpcyBtb2RlLgorCitXaGlsZSB0aG9yb3VnaCBkaXNjdXNzaW9uIGFib3V0IHNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gb2YgTkZEIGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMKK2RvY3VtZW50LCBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIGNoYW5nZSBzaG91bGQgYmUgZG9uZSB0byBuZmQuY29uZiBpbiBhdXRob3JpemUgc2VjdGlvbjoKKworICAgIGF1dGhvcml6YXRpb25zCisgICAgeworICAgICAgYXV0aG9yaXplCisgICAgICB7CisgICAgICAgIGNlcnRmaWxlIGNlcnRzL2xvY2FsaG9zdF9kYWVtb25zX25yZC5uZG5jZXJ0CisgICAgICAgIHByaXZpbGVnZXMKKyAgICAgICAgeworICAgICAgICAgICAgZmFjZXMKKyAgICAgICAgICAgIGZpYgorICAgICAgICAgICAgc3RyYXRlZ3ktY2hvaWNlCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXV0aG9yaXplCisgICAgICB7CisgICAgICAgIGNlcnRmaWxlIGFueQorICAgICAgICBwcml2aWxlZ2VzCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhY2VzCisgICAgICAgICAgICBzdHJhdGVneS1jaG9pY2UKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworV2hpbGUgdGhpcyBjb25maWd1cmF0aW9uIHN0aWxsIGFsbG93cyBtYW5hZ2VtZW50IG9mIGZhY2VzIGFuZCB1cGRhdGluZyBzdHJhdGVneSBjaG9pY2UgYnkKK2FueWJvZHksIG9ubHkgTkZEJ3MgUklCIE1hbmFnZXIgRGFlbW9uIChgbnJkYCkgaXMgYWxsb3dlZCB0byBtYW5hZ2UgRklCLgorCitBcyB0aGUgZmluYWwgc3RlcCB0byBtYWtlIHRoaXMgY29uZmlndXJhdGlvbiB3b3JrLCBucmQncyBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBuZWVkcyB0bworYmUgZXhwb3J0ZWQgaW50byBgbG9jYWxob3N0X2RhZW1vbnNfbnJkLm5kbmNlcnRgIGZpbGU6CisKKyAgICBzdWRvIG1rZGlyIC91c3IvbG9jYWwvZXRjL25kbi9jZXJ0cworICAgIHN1ZG8gc2ggLWMgJ3N1ZG8gLXUgbmRuIC1nIG5kbiBIT01FPS91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbnJkIFwKKyAgICAgIG5kbnNlYy1kdW1wLWNlcnRpZmljYXRlIC1pIC9sb2NhbGhvc3QvZGFlbW9ucy9ucmQgXAorICAgICAgPiAvdXNyL2xvY2FsL2V0Yy9uZG4vY2VydHMvbG9jYWxob3N0X2RhZW1vbnNfbnJkLm5kbmNlcnQnCisKKworRW5hYmxlIGF1dG8tc3RhcnQKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBzdWRvIGxhdW5jaGN0bCBsb2FkIC13IC9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvbmV0Lm5hbWVkLWRhdGEubmZkLnBsaXN0CisgICAgc3VkbyBsYXVuY2hjdGwgbG9hZCAtdyAvTGlicmFyeS9MYXVuY2hEYWVtb25zL25ldC5uYW1lZC1kYXRhLm5yZC5wbGlzdAorCitEaXNhYmxlIGF1dG8tc3RhcnQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgc3VkbyBsYXVuY2hjdGwgdW5sb2FkIC13IC9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvbmV0Lm5hbWVkLWRhdGEubmZkLnBsaXN0CisgICAgc3VkbyBsYXVuY2hjdGwgdW5sb2FkIC13IC9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvbmV0Lm5hbWVkLWRhdGEubnJkLnBsaXN0CmRpZmYgLS1naXQgYS9ORkQvY29udHJpYi9vc3gtbGF1bmNoZC9uZXQubmFtZWQtZGF0YS5uZmQucGxpc3QgYi9ORkQvY29udHJpYi9vc3gtbGF1bmNoZC9uZXQubmFtZWQtZGF0YS5uZmQucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkYTk3MAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb250cmliL29zeC1sYXVuY2hkL25ldC5uYW1lZC1kYXRhLm5mZC5wbGlzdApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIgorImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiID4KKzxwbGlzdCB2ZXJzaW9uPScxLjAnPgorPGRpY3Q+Cis8a2V5PkxhYmVsPC9rZXk+PHN0cmluZz5uZXQubmFtZWQtZGF0YS5uZmQ8L3N0cmluZz4KKzxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PgorPGFycmF5PgorICA8c3RyaW5nPi91c3IvbG9jYWwvYmluL25mZDwvc3RyaW5nPgorICA8c3RyaW5nPi0tY29uZmlnPC9zdHJpbmc+CisgIDxzdHJpbmc+L3Vzci9sb2NhbC9ldGMvbmRuL25mZC5jb25mPC9zdHJpbmc+Cis8L2FycmF5PgorPGtleT5FbnZpcm9ubWVudFZhcmlhYmxlczwva2V5PgorPGRpY3Q+CisgIDxrZXk+SE9NRTwva2V5PjxzdHJpbmc+L3Vzci9sb2NhbC92YXIvbGliL25kbi9uZmQ8L3N0cmluZz4KKzwvZGljdD4KKzxrZXk+RGVidWc8L2tleT48dHJ1ZS8+Cis8a2V5PkRpc2FibGVkPC9rZXk+PHRydWUvPgorPGtleT5LZWVwQWxpdmU8L2tleT48dHJ1ZS8+Cis8a2V5PlN0YW5kYXJkRXJyb3JQYXRoPC9rZXk+PHN0cmluZz4vdXNyL2xvY2FsL3Zhci9sb2cvbmRuL25mZC5sb2c8L3N0cmluZz4KKzxrZXk+UHJvY2Vzc1R5cGU8L2tleT48c3RyaW5nPkJhY2tncm91bmQ8L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9ORkQvY29udHJpYi9vc3gtbGF1bmNoZC9uZXQubmFtZWQtZGF0YS5ucmQucGxpc3QgYi9ORkQvY29udHJpYi9vc3gtbGF1bmNoZC9uZXQubmFtZWQtZGF0YS5ucmQucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkN2FhYQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb250cmliL29zeC1sYXVuY2hkL25ldC5uYW1lZC1kYXRhLm5yZC5wbGlzdApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIgorImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiID4KKzxwbGlzdCB2ZXJzaW9uPScxLjAnPgorPGRpY3Q+Cis8a2V5PkxhYmVsPC9rZXk+PHN0cmluZz5uZXQubmFtZWQtZGF0YS5ucmQ8L3N0cmluZz4KKzxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PgorPGFycmF5PgorICA8c3RyaW5nPi91c3IvbG9jYWwvYmluL25yZDwvc3RyaW5nPgorICA8c3RyaW5nPi0tY29uZmlnPC9zdHJpbmc+CisgIDxzdHJpbmc+L3Vzci9sb2NhbC9ldGMvbmRuL25mZC5jb25mPC9zdHJpbmc+Cis8L2FycmF5PgorPGtleT5Vc2VyTmFtZTwva2V5PjxzdHJpbmc+bmRuPC9zdHJpbmc+Cis8a2V5Pkdyb3VwTmFtZTwva2V5PjxzdHJpbmc+bmRuPC9zdHJpbmc+Cis8a2V5PkVudmlyb25tZW50VmFyaWFibGVzPC9rZXk+Cis8ZGljdD4KKyAgPGtleT5IT01FPC9rZXk+PHN0cmluZz4vdXNyL2xvY2FsL3Zhci9saWIvbmRuL25yZDwvc3RyaW5nPgorPC9kaWN0PgorPGtleT5EZWJ1Zzwva2V5Pjx0cnVlLz4KKzxrZXk+RGlzYWJsZWQ8L2tleT48dHJ1ZS8+Cis8a2V5PktlZXBBbGl2ZTwva2V5Pjx0cnVlLz4KKzxrZXk+U3RhbmRhcmRFcnJvclBhdGg8L2tleT48c3RyaW5nPi91c3IvbG9jYWwvdmFyL2xvZy9uZG4vbnJkLmxvZzwvc3RyaW5nPgorPGtleT5Qcm9jZXNzVHlwZTwva2V5PjxzdHJpbmc+QmFja2dyb3VuZDwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL05GRC9jb250cmliL3Vwc3RhcnQvUkVBRE1FLm1kIGIvTkZEL2NvbnRyaWIvdXBzdGFydC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZThhOAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb250cmliL3Vwc3RhcnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQ0IEBACitTdGFydGluZyBORkQgb24gTGludXggd2l0aCB1cHN0YXJ0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NvbWUgTGludXggZGlzdHJpYnV0aW9ucywgc3VjaCBhcyBVYnVudHUsIHVzZSBbdXBzdGFydF0oaHR0cDovL3Vwc3RhcnQudWJ1bnR1LmNvbS8pIGFzIGEKK3N0YW5kYXJkIG1lY2hhbmlzbSB0byBzdGFydCBzeXN0ZW0gZGFlbW9ucywgbW9uaXRvciB0aGVpciBoZWFsdGgsIGFuZCByZXN0YXJ0Cit3aGVuIHRoZXkgZGllLgorCitJbml0aWFsIHNldHVwCistLS0tLS0tLS0tLS0tCisKK0VkaXQgYG5mZC5jb25mYCBhbmQgYG5yZC5jb25mYCBjb3JyZWN0aW5nIHBhdGhzIGZvciBgbmZkYCBhbmQgYG5mZGAgYmluYXJpZXMsCitjb25maWd1cmF0aW9uIGZpbGUsIGFuZCBsb2cgZmlsZXMuCisKKyAgICAjIENvcHkgdXBzdGFydCBjb25maWcgZmlsZSBmb3IgbmZkIChmb3J3YXJkaW5nIGRhZW1vbikKKyAgICBzdWRvIGNwIG5mZC5jb25mIC9ldGMvaW5pdC8KKworICAgICMgQ29weSB1cHN0YXJ0IGNvbmZpZyBmaWxlIGZvciBucmQgKFJJQiBtYW5hZ2VtZW50IGRhZW1vbikKKyAgICBzdWRvIGNwIG5yZC5jb25mIC9ldGMvaW5pdC8KKworICAgICMgQ29weSB1cHN0YXJ0IGNvbmZpZyBmaWxlIGZvciBuZmQtd2F0Y2hlciAod2lsbCByZXN0YXJ0IE5GRCB3aGVuIG5ldHdvcmsgY2hhbmdlIGRldGVjdGVkKQorICAgIHN1ZG8gY3AgbmZkLXdhdGNoZXIuY29uZiAvZXRjL2luaXQvCisKKyMjIyBBc3N1bXB0aW9ucyBpbiB0aGUgZGVmYXVsdCBzY3JpcHRzCisKKyogYG5mZGAgYW5kIGBucmRgIGFyZSBpbnN0YWxsZWQgaW50byBgL3Vzci9sb2NhbC9iaW5gCisqIENvbmZpZ3VyYXRpb24gZmlsZSBpcyBgL3Vzci9sb2NhbC9ldGMvbmRuL25mZC5jb25mYAorKiBgbmZkYCB3aWxsIGJlIHJ1biBhcyByb290CisqIGBucmRgIHdpbGwgYmUgcnVuIGFzIHVzZXIgYG5kbmAgYW5kIGdyb3VwIGBuZG5gCisqIExvZyBmaWxlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gYC91c3IvbG9jYWwvdmFyL2xvZy9uZG5gIGZvbGRlciwgd2hpY2ggaXMgb3duZWQgYnkgdXNlciBgbmRuYAorKiBXaGVuZXZlciBuZXR3b3JrIGNvbm5lY3Rpdml0eSBjaGFuZ2VzLCBib3RoIGBuZmRgIGFuZCBgbnJkYCBhcmUgcmVzdGFydGVkCisKKyMjIyBDcmVhdGluZyB1c2VycworCitJZiBgbmRuYCB1c2VyIGFuZCBncm91cCBkb2VzIG5vdCBleGlzdHMsIHRoZXkgbmVlZCB0byBiZSBtYW51YWxseSBjcmVhdGVkLgorCisgICAgIyBDcmVhdGUgZ3JvdXAgYG5kbmAKKyAgICBhZGRncm91cCAtLXN5c3RlbSBuZG4KKworICAgICMgQ3JlYXRlIHVzZXIgYG5kbmAKKyAgICBzdWRvIGFkZHVzZXIgLS1zeXN0ZW0gXAorICAgICAgICAgICAgICAgICAtLWRpc2FibGVkLWxvZ2luIFwKKyAgICAgICAgICAgICAgICAgLS1pbmdyb3VwIG5kbiBcCisgICAgICAgICAgICAgICAgIC0taG9tZSAvbm9uZXhpc3RlbnQgXAorICAgICAgICAgICAgICAgICAtLWdlY29zICJORE4gVXNlciIgXAorICAgICAgICAgICAgICAgICAtLXNoZWxsIC9iaW4vZmFsc2UgXAorICAgICAgICAgICAgICAgICBuZG4KKworCisjIyMgQ3JlYXRpbmcgZm9sZGVycworCitGb2xkZXIgYC91c3IvbG9jYWwvdmFyL2xvZy9uZG5gIHNob3VsZCBiZSBjcmVhdGVkIGFuZCBhc3NpZ25lZCBwcm9wZXIgdXNlciBhbmQgZ3JvdXA6CisKKyAgICBzdWRvIG1rZGlyIC1wIC91c3IvbG9jYWwvdmFyL2xvZy9uZG4KKyAgICBzdWRvIGNob3duIC1SIG5kbjpuZG4gL3Vzci9sb2NhbC92YXIvbG9nL25kbgorCitgSE9NRWAgZGlyZWN0b3JpZXMgZm9yIGBuZmRgIGFuZCBgbnJkYCBzaG91bGQgYmUgY3JlYXRlZCBwcmlvciB0byBzdGFydGluZy4gIFRoaXMgaXMKK25lY2Vzc2FyeSB0byBtYW5hZ2UgdW5pcXVlIHNlY3VyaXR5IGNyZWRlbnRpYWxzIGZvciB0aGUgZGVhbW9ucy4KKworICAgICMgQ3JlYXRlIEhPTUUgYW5kIGdlbmVyYXRlIHNlbGYtc2lnbmVkIE5ETiBjZXJ0aWZpY2F0ZSBmb3IgbmZkCisgICAgc3VkbyBta2RpciAtcCAvdXNyL2xvY2FsL3Zhci9saWIvbmRuL25mZC8ubmRuCisgICAgc3VkbyBIT01FPS91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbmZkIG5kbnNlYy1rZXlnZW4gL2xvY2FsaG9zdC9kYWVtb25zL25mZCB8IFwKKyAgICAgIHN1ZG8gSE9NRT0vdXNyL2xvY2FsL3Zhci9saWIvbmRuL25mZCBuZG5zZWMtaW5zdGFsbC1jZXJ0IC0KKworICAgICMgQ3JlYXRlIEhPTUUgYW5kIGdlbmVyYXRlIHNlbGYtc2lnbmVkIE5ETiBjZXJ0aWZpY2F0ZSBmb3IgbnJkCisgICAgc3VkbyBta2RpciAtcCAvdXNyL2xvY2FsL3Zhci9saWIvbmRuL25yZC8ubmRuCisgICAgc3VkbyBjaG93biAtUiBuZG46bmRuIC91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbnJkCisgICAgc3VkbyAtdSBuZG4gLWcgbmRuIEhPTUU9L3Vzci9sb2NhbC92YXIvbGliL25kbi9ucmQgbmRuc2VjLWtleWdlbiAvbG9jYWxob3N0L2RhZW1vbnMvbnJkIHwgXAorICAgICAgc3VkbyAtdSBuZG4gLWcgbmRuIEhPTUU9L3Vzci9sb2NhbC92YXIvbGliL25kbi9ucmQgbmRuc2VjLWluc3RhbGwtY2VydCAtCisKKyMjIyBDb25maWd1cmluZyBORkQncyBzZWN1cml0eQorCitORkQgc2FtcGxlIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGFueWJvZHkgdG8gY3JlYXRlIGZhY2VzLCBhZGQgbmV4dGhvcHMgdG8gRklCLCBhbmQgc2V0CitzdHJhdGVneSBjaG9pY2UgZm9yIG5hbWVzcGFjZXMuICBXaGlsZSBzdWNoIHNldHRpbmdzIGNvdWxkIGJlIGEgZ29vZCBzdGFydCwgaXQgaXMKK2dlbmVyYWxseSBub3QgYSBnb29kIGlkZWEgdG8gcnVuIE5GRCBpbiB0aGlzIG1vZGUuCisKK1doaWxlIHRob3JvdWdoIGRpc2N1c3Npb24gYWJvdXQgc2VjdXJpdHkgY29uZmlndXJhdGlvbiBvZiBORkQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcworZG9jdW1lbnQsIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgY2hhbmdlIHNob3VsZCBiZSBkb25lIHRvIGBgbmZkLmNvbmZgYCBpbiBhdXRob3JpemUKK3NlY3Rpb246CisKKyAgICBhdXRob3JpemF0aW9ucworICAgIHsKKyAgICAgIGF1dGhvcml6ZQorICAgICAgeworICAgICAgICBjZXJ0ZmlsZSBjZXJ0cy9sb2NhbGhvc3RfZGFlbW9uc19ucmQubmRuY2VydAorICAgICAgICBwcml2aWxlZ2VzCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhY2VzCisgICAgICAgICAgICBmaWIKKyAgICAgICAgICAgIHN0cmF0ZWd5LWNob2ljZQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGF1dGhvcml6ZQorICAgICAgeworICAgICAgICBjZXJ0ZmlsZSBhbnkKKyAgICAgICAgcHJpdmlsZWdlcworICAgICAgICB7CisgICAgICAgICAgICBmYWNlcworICAgICAgICAgICAgc3RyYXRlZ3ktY2hvaWNlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKK1doaWxlIHRoaXMgY29uZmlndXJhdGlvbiBzdGlsbCBhbGxvd3MgbWFuYWdlbWVudCBvZiBmYWNlcyBhbmQgdXBkYXRpbmcgc3RyYXRlZ3kgY2hvaWNlIGJ5Cithbnlib2R5LCBvbmx5IE5GRCdzIFJJQiBNYW5hZ2VyIERhZW1vbiAoYG5yZGApIGlzIGFsbG93ZWQgdG8gbWFuYWdlIEZJQi4KKworQXMgdGhlIGZpbmFsIHN0ZXAgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYXRpb24gd29yaywgbnJkJ3Mgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgbmVlZHMgdG8KK2JlIGV4cG9ydGVkIGludG8gYGxvY2FsaG9zdF9kYWVtb25zX25yZC5uZG5jZXJ0YCBmaWxlOgorCisgICAgc3VkbyBta2RpciAvdXNyL2xvY2FsL2V0Yy9uZG4vY2VydHMKKyAgICBzdWRvIHNoIC1jICdzdWRvIC11IG5kbiAtZyBuZG4gSE9NRT0vdXNyL2xvY2FsL3Zhci9saWIvbmRuL25yZCBcCisgICAgICBuZG5zZWMtZHVtcC1jZXJ0aWZpY2F0ZSAtaSAvbG9jYWxob3N0L2RhZW1vbnMvbnJkIFwKKyAgICAgID4gL3Vzci9sb2NhbC9ldGMvbmRuL2NlcnRzL2xvY2FsaG9zdF9kYWVtb25zX25yZC5uZG5jZXJ0JworCisKK0VuYWJsZSBhdXRvLXN0YXJ0CistLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciBjb3B5aW5nIHRoZSBwcm92aWRlZCB1cHN0YXJ0IHNjcmlwdHMsIGBuZmRgIGFuZCBgbnJkYCBkYWVtb25zIHdpbGwgYXV0b21hdGljYWxseSBydW4KK2FmdGVyIHRoZSByZWJvb3QuICBUbyBtYW51YWxseSBzdGFydCB0aGVtLCB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAgIHN1ZG8gc3RhcnQgbmZkCisgICAgIyBucmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgYnkgdXBzdGFydAorCitOb3RlIHRoYXQgYW4gYWRkaXRpb25hbCB1cHN0YXJ0IGpvYiwgYGBuZmQtd2F0Y2hlcmBgLCB3aWxsIGF1dG9tYXRpY2FsbHkgbW9uaXRvciBmb3IKK25ldHdvcmsgY29ubmVjdGl2aXR5IGNoYW5nZXMsIHN1Y2ggYXMgd2hlbiBuZXR3b3JrIGludGVyZmFjZSBnZXRzIGNvbm5lY3RlZCwgZGlzY29ubmVjdGVkLAorb3IgSVAgYWRkcmVzc2VzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSBnZXQgdXBkYXRlZC4gIFdoZW4gYGBuZmQtd2F0Y2hlcmBgIGRldGVjdHMgdGhlCitldmVudCwgaXQgd2lsbCByZXN0YXJ0IGBuZmRgIGFuZCBgbnJkYC4KKworRGlzYWJsZSBhdXRvLXN0YXJ0CistLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gc3RvcCBgbnJkYCBhbmQgYG5mZGAgZGFlbW9uLCB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAgIHN1ZG8gc3RvcCBuZmQKKyAgICAjIG5yZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RvcHBlZCBieSB1cHN0YXJ0CisKK05vdGUgdGhhdCBhcyBsb25nIGFzIHVwc3RhcnQgZmlsZXMgYXJlIHByZXNlbnQgaW4gYC9ldGMvaW5pdC9gLCB0aGUgZGFlbW9ucyB3aWxsCithdXRvbWF0aWNhbGx5IHN0YXJ0IGFmdGVyIHRoZSByZWJvb3QuICBUbyBwZXJtYW5lbnRseSBzdG9wIGBuZmRgIGFuZCBgbnJkYCBkYWVtb25zLCBkZWxldGUKK3RoZSB1cHN0YXJ0IGZpbGVzOgorCisgICAgc3VkbyBybSAvZXRjL2luaXQvbmZkLmNvbmYKKyAgICBzdWRvIHJtIC9ldGMvaW5pdC9ucmQuY29uZgorICAgIHN1ZG8gcm0gL2V0Yy9pbml0L25mZC13YXRjaGVyLmNvbmYKZGlmZiAtLWdpdCBhL05GRC9jb250cmliL3Vwc3RhcnQvbmZkLXdhdGNoZXIuY29uZiBiL05GRC9jb250cmliL3Vwc3RhcnQvbmZkLXdhdGNoZXIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTJhZjUyCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvbnRyaWIvdXBzdGFydC9uZmQtd2F0Y2hlci5jb25mCkBAIC0wLDAgKzEsMTMgQEAKKyMgbmZkLXdhdGNoZXIuY29uZgorIworIyBSZXN0YXJ0aW5nIE5ETiBGb3J3YXJkaW5nIERhZW1vbiBvbiBuZXR3b3JrIGNvbm5lY3Rpdml0eSBjaGFuZ2VzCisKK3N0YXJ0IG9uIChuZXQtZGV2aWNlLXVwIG9yCisgICAgICAgICAgbmV0LWRldmljZS1yZW1vdmVkIG9yCisgICAgICAgICAgbmV0LWRldmljZS1jaGFuZ2VkKQordGFzaworCitzY3JpcHQKKyAgc3RhdHVzIG5mZCB8IGdyZXAgLXEgc3RhcnQvIHx8IHN0b3AKKyAgcmVzdGFydCBuZmQKK2VuZCBzY3JpcHQKZGlmZiAtLWdpdCBhL05GRC9jb250cmliL3Vwc3RhcnQvbmZkLmNvbmYgYi9ORkQvY29udHJpYi91cHN0YXJ0L25mZC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTc5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29udHJpYi91cHN0YXJ0L25mZC5jb25mCkBAIC0wLDAgKzEsMTcgQEAKKyMgbmZkLmNvbmYKKyMKKyMgTkROIEZvcndhcmRpbmcgRGFlbW9uCisKK2Rlc2NyaXB0aW9uICJORE4gZm9yd2FyZGluZyBkYWVtb24iCisKK3N0YXJ0IG9uIChsb2NhbC1maWxlc3lzdGVtcyBhbmQgbmV0LWRldmljZS11cCBJRkFDRSE9bG8pCitzdG9wIG9uIHJ1bmxldmVsIFshMjM0NV0KKworcmVzcGF3bgorcmVzcGF3biBsaW1pdCB1bmxpbWl0ZWQKKworZW52IEhPTUU9L3Vzci9sb2NhbC92YXIvbGliL25kbi9uZmQKK2V4cG9ydCBIT01FCisKK2V4ZWMgL3Vzci9sb2NhbC9iaW4vbmZkIC0tY29uZmlnIC91c3IvbG9jYWwvZXRjL25kbi9uZmQuY29uZiAyPj4gL3Vzci9sb2NhbC92YXIvbG9nL25kbi9uZmQubG9nCitwb3N0LXN0b3AgZXhlYyBzbGVlcCAyCmRpZmYgLS1naXQgYS9ORkQvY29udHJpYi91cHN0YXJ0L25yZC5jb25mIGIvTkZEL2NvbnRyaWIvdXBzdGFydC9ucmQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzRiODFjCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvbnRyaWIvdXBzdGFydC9ucmQuY29uZgpAQCAtMCwwICsxLDIyIEBACisjIG5yZC5jb25mCisjCisjIE5ETiBSSUIgTWFuYWdlciBEYWVtb24KKworZGVzY3JpcHRpb24gIk5ETiBSSUIgTWFuYWdlciBEYWVtb24iCisKK3N0YXJ0IG9uIHN0YXJ0ZWQgIG5mZAorc3RvcCAgb24gc3RvcHBpbmcgbmZkCisKK3Jlc3Bhd24KK3Jlc3Bhd24gbGltaXQgdW5saW1pdGVkCisKK3NldHVpZCBuZG4KK3NldGdpZCBuZG4KKworcHJlLXN0YXJ0IGV4ZWMgc2xlZXAgMgorc2NyaXB0CisgIGV4cG9ydCBIT01FPS91c3IvbG9jYWwvdmFyL2xpYi9uZG4vbnJkCisgIC91c3IvbG9jYWwvYmluL25yZCAtLWNvbmZpZyAvdXNyL2xvY2FsL2V0Yy9uZG4vbmZkLmNvbmYgMj4+IC91c3IvbG9jYWwvdmFyL2xvZy9uZG4vbnJkLmxvZworZW5kIHNjcmlwdAorCitwb3N0LXN0b3AgZXhlYyBzbGVlcCAyCmRpZmYgLS1naXQgYS9ORkQvY29yZS9jaXR5LWhhc2guY3BwIGIvTkZEL2NvcmUvY2l0eS1oYXNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGE3NzkxCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvY2l0eS1oYXNoLmNwcApAQCAtMCwwICsxLDY1MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSwgSW5jLgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKy8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisvLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisvLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisvLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKy8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisvLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKy8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKy8vIFRIRSBTT0ZUV0FSRS4KKy8vCisvLyBDaXR5SGFzaCwgYnkgR2VvZmYgUGlrZSBhbmQgSnlya2kgQWxha3VpamFsYQorLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBDaXR5SGFzaDY0KCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorLy8KKy8vIEl0J3MgcHJvYmFibHkgcG9zc2libGUgdG8gY3JlYXRlIGV2ZW4gZmFzdGVyIGhhc2ggZnVuY3Rpb25zIGJ5CisvLyB3cml0aW5nIGEgcHJvZ3JhbSB0aGF0IHN5c3RlbWF0aWNhbGx5IGV4cGxvcmVzIHNvbWUgb2YgdGhlIHNwYWNlIG9mCisvLyBwb3NzaWJsZSBoYXNoIGZ1bmN0aW9ucywgYnkgdXNpbmcgU0lNRCBpbnN0cnVjdGlvbnMsIG9yIGJ5CisvLyBjb21wcm9taXNpbmcgb24gaGFzaCBxdWFsaXR5LgorCisvLyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJjaXR5LWhhc2guaHBwIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIGZvciBtZW1jcHkgYW5kIG1lbXNldAorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK3N0YXRpYyB1aW50NjQgVU5BTElHTkVEX0xPQUQ2NChjb25zdCBjaGFyICpwKSB7CisgIHVpbnQ2NCByZXN1bHQ7CisgIG1lbWNweSgmcmVzdWx0LCBwLCBzaXplb2YocmVzdWx0KSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB1aW50MzIgVU5BTElHTkVEX0xPQUQzMihjb25zdCBjaGFyICpwKSB7CisgIHVpbnQzMiByZXN1bHQ7CisgIG1lbWNweSgmcmVzdWx0LCBwLCBzaXplb2YocmVzdWx0KSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBfTVNDX1ZFUgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIGJzd2FwXzMyKHgpIF9ieXRlc3dhcF91bG9uZyh4KQorI2RlZmluZSBic3dhcF82NCh4KSBfYnl0ZXN3YXBfdWludDY0KHgpCisKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCisvLyBNYWMgT1MgWCAvIERhcndpbiBmZWF0dXJlcworI2luY2x1ZGUgPGxpYmtlcm4vT1NCeXRlT3JkZXIuaD4KKyNkZWZpbmUgYnN3YXBfMzIoeCkgT1NTd2FwSW50MzIoeCkKKyNkZWZpbmUgYnN3YXBfNjQoeCkgT1NTd2FwSW50NjQoeCkKKworI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWFjaGluZS9ic3dhcC5oPgorI2lmIGRlZmluZWQoX19CU1dBUF9SRU5BTUUpICYmICFkZWZpbmVkKF9fYnN3YXBfMzIpCisjZGVmaW5lIGJzd2FwXzMyKHgpIGJzd2FwMzIoeCkKKyNkZWZpbmUgYnN3YXBfNjQoeCkgYnN3YXA2NCh4KQorI2VuZGlmCisKKworI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKworLy8gQmFzZWQgb24gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9mcmVlYnNkL3NvdXJjZS9icm93c2Uvc3lzL29mZWQvaW5jbHVkZS9ieXRlc3dhcC5oP3NwZWM9c3ZuMzhhODM1MGE2MjlkOTU5YzhjNTUwOTIyMWNkMDdmZmI4OTFiNWE3NyZyPTM4YTgzNTBhNjI5ZDk1OWM4YzU1MDkyMjFjZDA3ZmZiODkxYjVhNzcKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKyNkZWZpbmUgYnN3YXBfMTYoeCkgYnN3YXAxNih4KQorI2RlZmluZSBic3dhcF8zMih4KSBic3dhcDMyKHgpCisjZGVmaW5lIGJzd2FwXzY0KHgpIGJzd2FwNjQoeCkKKworI2Vsc2UKKworI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisKKyNlbmRpZgorCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIHVpbnQzMl9pbl9leHBlY3RlZF9vcmRlcih4KSAoYnN3YXBfMzIoeCkpCisjZGVmaW5lIHVpbnQ2NF9pbl9leHBlY3RlZF9vcmRlcih4KSAoYnN3YXBfNjQoeCkpCisjZWxzZQorI2RlZmluZSB1aW50MzJfaW5fZXhwZWN0ZWRfb3JkZXIoeCkgKHgpCisjZGVmaW5lIHVpbnQ2NF9pbl9leHBlY3RlZF9vcmRlcih4KSAoeCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTElLRUxZKQorI2lmIEhBVkVfQlVJTFRJTl9FWFBFQ1QKKyNkZWZpbmUgTElLRUxZKHgpIChfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKSkKKyNlbHNlCisjZGVmaW5lIExJS0VMWSh4KSAoeCkKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB1aW50NjQgRmV0Y2g2NChjb25zdCBjaGFyICpwKSB7CisgIHJldHVybiB1aW50NjRfaW5fZXhwZWN0ZWRfb3JkZXIoVU5BTElHTkVEX0xPQUQ2NChwKSk7Cit9CisKK3N0YXRpYyB1aW50MzIgRmV0Y2gzMihjb25zdCBjaGFyICpwKSB7CisgIHJldHVybiB1aW50MzJfaW5fZXhwZWN0ZWRfb3JkZXIoVU5BTElHTkVEX0xPQUQzMihwKSk7Cit9CisKKy8vIFNvbWUgcHJpbWVzIGJldHdlZW4gMl42MyBhbmQgMl42NCBmb3IgdmFyaW91cyB1c2VzLgorc3RhdGljIGNvbnN0IHVpbnQ2NCBrMCA9IDB4YzNhNWM4NWM5N2NiMzEyN1VMTDsKK3N0YXRpYyBjb25zdCB1aW50NjQgazEgPSAweGI0OTJiNjZmYmU5OGYyNzNVTEw7CitzdGF0aWMgY29uc3QgdWludDY0IGsyID0gMHg5YWUxNmEzYjJmOTA0MDRmVUxMOworCisvLyBNYWdpYyBudW1iZXJzIGZvciAzMi1iaXQgaGFzaGluZy4gIENvcGllZCBmcm9tIE11cm11cjMuCitzdGF0aWMgY29uc3QgdWludDMyX3QgYzEgPSAweGNjOWUyZDUxOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGMyID0gMHgxYjg3MzU5MzsKKworLy8gQSAzMi1iaXQgdG8gMzItYml0IGludGVnZXIgaGFzaCBjb3BpZWQgZnJvbSBNdXJtdXIzLgorc3RhdGljIHVpbnQzMiBmbWl4KHVpbnQzMiBoKQoreworICBoIF49IGggPj4gMTY7CisgIGggKj0gMHg4NWViY2E2YjsKKyAgaCBePSBoID4+IDEzOworICBoICo9IDB4YzJiMmFlMzU7CisgIGggXj0gaCA+PiAxNjsKKyAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyB1aW50MzIgUm90YXRlMzIodWludDMyIHZhbCwgaW50IHNoaWZ0KSB7CisgIC8vIEF2b2lkIHNoaWZ0aW5nIGJ5IDMyOiBkb2luZyBzbyB5aWVsZHMgYW4gdW5kZWZpbmVkIHJlc3VsdC4KKyAgcmV0dXJuIHNoaWZ0ID09IDAgPyB2YWwgOiAoKHZhbCA+PiBzaGlmdCkgfCAodmFsIDw8ICgzMiAtIHNoaWZ0KSkpOworfQorCisjdW5kZWYgUEVSTVVURTMKKyNkZWZpbmUgUEVSTVVURTMoYSwgYiwgYykgZG8geyBzdGQ6OnN3YXAoYSwgYik7IHN0ZDo6c3dhcChhLCBjKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIHVpbnQzMiBNdXIodWludDMyIGEsIHVpbnQzMiBoKSB7CisgIC8vIEhlbHBlciBmcm9tIE11cm11cjMgZm9yIGNvbWJpbmluZyB0d28gMzItYml0IHZhbHVlcy4KKyAgYSAqPSBjMTsKKyAgYSA9IFJvdGF0ZTMyKGEsIDE3KTsKKyAgYSAqPSBjMjsKKyAgaCBePSBhOworICBoID0gUm90YXRlMzIoaCwgMTkpOworICByZXR1cm4gaCAqIDUgKyAweGU2NTQ2YjY0OworfQorCitzdGF0aWMgdWludDMyIEhhc2gzMkxlbjEzdG8yNChjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKSB7CisgIHVpbnQzMiBhID0gRmV0Y2gzMihzIC0gNCArIChsZW4gPj4gMSkpOworICB1aW50MzIgYiA9IEZldGNoMzIocyArIDQpOworICB1aW50MzIgYyA9IEZldGNoMzIocyArIGxlbiAtIDgpOworICB1aW50MzIgZCA9IEZldGNoMzIocyArIChsZW4gPj4gMSkpOworICB1aW50MzIgZSA9IEZldGNoMzIocyk7CisgIHVpbnQzMiBmID0gRmV0Y2gzMihzICsgbGVuIC0gNCk7CisgIHVpbnQzMiBoID0gbGVuOworCisgIHJldHVybiBmbWl4KE11cihmLCBNdXIoZSwgTXVyKGQsIE11cihjLCBNdXIoYiwgTXVyKGEsIGgpKSkpKSkpOworfQorCitzdGF0aWMgdWludDMyIEhhc2gzMkxlbjB0bzQoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikgeworICB1aW50MzIgYiA9IDA7CisgIHVpbnQzMiBjID0gOTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHNpZ25lZCBjaGFyIHYgPSBzW2ldOworICAgIGIgPSBiICogYzEgKyB2OworICAgIGMgXj0gYjsKKyAgfQorICByZXR1cm4gZm1peChNdXIoYiwgTXVyKGxlbiwgYykpKTsKK30KKworc3RhdGljIHVpbnQzMiBIYXNoMzJMZW41dG8xMihjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKSB7CisgIHVpbnQzMiBhID0gbGVuLCBiID0gbGVuICogNSwgYyA9IDksIGQgPSBiOworICBhICs9IEZldGNoMzIocyk7CisgIGIgKz0gRmV0Y2gzMihzICsgbGVuIC0gNCk7CisgIGMgKz0gRmV0Y2gzMihzICsgKChsZW4gPj4gMSkgJiA0KSk7CisgIHJldHVybiBmbWl4KE11cihjLCBNdXIoYiwgTXVyKGEsIGQpKSkpOworfQorCit1aW50MzIgQ2l0eUhhc2gzMihjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKSB7CisgIGlmIChsZW4gPD0gMjQpIHsKKyAgICByZXR1cm4gbGVuIDw9IDEyID8KKyAgICAgICAgKGxlbiA8PSA0ID8gSGFzaDMyTGVuMHRvNChzLCBsZW4pIDogSGFzaDMyTGVuNXRvMTIocywgbGVuKSkgOgorICAgICAgICBIYXNoMzJMZW4xM3RvMjQocywgbGVuKTsKKyAgfQorCisgIC8vIGxlbiA+IDI0CisgIHVpbnQzMiBoID0gbGVuLCBnID0gYzEgKiBsZW4sIGYgPSBnOworICB1aW50MzIgYTAgPSBSb3RhdGUzMihGZXRjaDMyKHMgKyBsZW4gLSA0KSAqIGMxLCAxNykgKiBjMjsKKyAgdWludDMyIGExID0gUm90YXRlMzIoRmV0Y2gzMihzICsgbGVuIC0gOCkgKiBjMSwgMTcpICogYzI7CisgIHVpbnQzMiBhMiA9IFJvdGF0ZTMyKEZldGNoMzIocyArIGxlbiAtIDE2KSAqIGMxLCAxNykgKiBjMjsKKyAgdWludDMyIGEzID0gUm90YXRlMzIoRmV0Y2gzMihzICsgbGVuIC0gMTIpICogYzEsIDE3KSAqIGMyOworICB1aW50MzIgYTQgPSBSb3RhdGUzMihGZXRjaDMyKHMgKyBsZW4gLSAyMCkgKiBjMSwgMTcpICogYzI7CisgIGggXj0gYTA7CisgIGggPSBSb3RhdGUzMihoLCAxOSk7CisgIGggPSBoICogNSArIDB4ZTY1NDZiNjQ7CisgIGggXj0gYTI7CisgIGggPSBSb3RhdGUzMihoLCAxOSk7CisgIGggPSBoICogNSArIDB4ZTY1NDZiNjQ7CisgIGcgXj0gYTE7CisgIGcgPSBSb3RhdGUzMihnLCAxOSk7CisgIGcgPSBnICogNSArIDB4ZTY1NDZiNjQ7CisgIGcgXj0gYTM7CisgIGcgPSBSb3RhdGUzMihnLCAxOSk7CisgIGcgPSBnICogNSArIDB4ZTY1NDZiNjQ7CisgIGYgKz0gYTQ7CisgIGYgPSBSb3RhdGUzMihmLCAxOSk7CisgIGYgPSBmICogNSArIDB4ZTY1NDZiNjQ7CisgIHNpemVfdCBpdGVycyA9IChsZW4gLSAxKSAvIDIwOworICBkbyB7CisgICAgdWludDMyIGEwID0gUm90YXRlMzIoRmV0Y2gzMihzKSAqIGMxLCAxNykgKiBjMjsKKyAgICB1aW50MzIgYTEgPSBGZXRjaDMyKHMgKyA0KTsKKyAgICB1aW50MzIgYTIgPSBSb3RhdGUzMihGZXRjaDMyKHMgKyA4KSAqIGMxLCAxNykgKiBjMjsKKyAgICB1aW50MzIgYTMgPSBSb3RhdGUzMihGZXRjaDMyKHMgKyAxMikgKiBjMSwgMTcpICogYzI7CisgICAgdWludDMyIGE0ID0gRmV0Y2gzMihzICsgMTYpOworICAgIGggXj0gYTA7CisgICAgaCA9IFJvdGF0ZTMyKGgsIDE4KTsKKyAgICBoID0gaCAqIDUgKyAweGU2NTQ2YjY0OworICAgIGYgKz0gYTE7CisgICAgZiA9IFJvdGF0ZTMyKGYsIDE5KTsKKyAgICBmID0gZiAqIGMxOworICAgIGcgKz0gYTI7CisgICAgZyA9IFJvdGF0ZTMyKGcsIDE4KTsKKyAgICBnID0gZyAqIDUgKyAweGU2NTQ2YjY0OworICAgIGggXj0gYTMgKyBhMTsKKyAgICBoID0gUm90YXRlMzIoaCwgMTkpOworICAgIGggPSBoICogNSArIDB4ZTY1NDZiNjQ7CisgICAgZyBePSBhNDsKKyAgICBnID0gYnN3YXBfMzIoZykgKiA1OworICAgIGggKz0gYTQgKiA1OworICAgIGggPSBic3dhcF8zMihoKTsKKyAgICBmICs9IGEwOworICAgIFBFUk1VVEUzKGYsIGgsIGcpOworICAgIHMgKz0gMjA7CisgIH0gd2hpbGUgKC0taXRlcnMgIT0gMCk7CisgIGcgPSBSb3RhdGUzMihnLCAxMSkgKiBjMTsKKyAgZyA9IFJvdGF0ZTMyKGcsIDE3KSAqIGMxOworICBmID0gUm90YXRlMzIoZiwgMTEpICogYzE7CisgIGYgPSBSb3RhdGUzMihmLCAxNykgKiBjMTsKKyAgaCA9IFJvdGF0ZTMyKGggKyBnLCAxOSk7CisgIGggPSBoICogNSArIDB4ZTY1NDZiNjQ7CisgIGggPSBSb3RhdGUzMihoLCAxNykgKiBjMTsKKyAgaCA9IFJvdGF0ZTMyKGggKyBmLCAxOSk7CisgIGggPSBoICogNSArIDB4ZTY1NDZiNjQ7CisgIGggPSBSb3RhdGUzMihoLCAxNykgKiBjMTsKKyAgcmV0dXJuIGg7Cit9CisKKy8vIEJpdHdpc2UgcmlnaHQgcm90YXRlLiAgTm9ybWFsbHkgdGhpcyB3aWxsIGNvbXBpbGUgdG8gYSBzaW5nbGUKKy8vIGluc3RydWN0aW9uLCBlc3BlY2lhbGx5IGlmIHRoZSBzaGlmdCBpcyBhIG1hbmlmZXN0IGNvbnN0YW50Lgorc3RhdGljIHVpbnQ2NCBSb3RhdGUodWludDY0IHZhbCwgaW50IHNoaWZ0KSB7CisgIC8vIEF2b2lkIHNoaWZ0aW5nIGJ5IDY0OiBkb2luZyBzbyB5aWVsZHMgYW4gdW5kZWZpbmVkIHJlc3VsdC4KKyAgcmV0dXJuIHNoaWZ0ID09IDAgPyB2YWwgOiAoKHZhbCA+PiBzaGlmdCkgfCAodmFsIDw8ICg2NCAtIHNoaWZ0KSkpOworfQorCitzdGF0aWMgdWludDY0IFNoaWZ0TWl4KHVpbnQ2NCB2YWwpIHsKKyAgcmV0dXJuIHZhbCBeICh2YWwgPj4gNDcpOworfQorCitzdGF0aWMgdWludDY0IEhhc2hMZW4xNih1aW50NjQgdSwgdWludDY0IHYpIHsKKyAgcmV0dXJuIEhhc2gxMjh0bzY0KHVpbnQxMjgodSwgdikpOworfQorCitzdGF0aWMgdWludDY0IEhhc2hMZW4xNih1aW50NjQgdSwgdWludDY0IHYsIHVpbnQ2NCBtdWwpIHsKKyAgLy8gTXVybXVyLWluc3BpcmVkIGhhc2hpbmcuCisgIHVpbnQ2NCBhID0gKHUgXiB2KSAqIG11bDsKKyAgYSBePSAoYSA+PiA0Nyk7CisgIHVpbnQ2NCBiID0gKHYgXiBhKSAqIG11bDsKKyAgYiBePSAoYiA+PiA0Nyk7CisgIGIgKj0gbXVsOworICByZXR1cm4gYjsKK30KKworc3RhdGljIHVpbnQ2NCBIYXNoTGVuMHRvMTYoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikgeworICBpZiAobGVuID49IDgpIHsKKyAgICB1aW50NjQgbXVsID0gazIgKyBsZW4gKiAyOworICAgIHVpbnQ2NCBhID0gRmV0Y2g2NChzKSArIGsyOworICAgIHVpbnQ2NCBiID0gRmV0Y2g2NChzICsgbGVuIC0gOCk7CisgICAgdWludDY0IGMgPSBSb3RhdGUoYiwgMzcpICogbXVsICsgYTsKKyAgICB1aW50NjQgZCA9IChSb3RhdGUoYSwgMjUpICsgYikgKiBtdWw7CisgICAgcmV0dXJuIEhhc2hMZW4xNihjLCBkLCBtdWwpOworICB9CisgIGlmIChsZW4gPj0gNCkgeworICAgIHVpbnQ2NCBtdWwgPSBrMiArIGxlbiAqIDI7CisgICAgdWludDY0IGEgPSBGZXRjaDMyKHMpOworICAgIHJldHVybiBIYXNoTGVuMTYobGVuICsgKGEgPDwgMyksIEZldGNoMzIocyArIGxlbiAtIDQpLCBtdWwpOworICB9CisgIGlmIChsZW4gPiAwKSB7CisgICAgdWludDggYSA9IHNbMF07CisgICAgdWludDggYiA9IHNbbGVuID4+IDFdOworICAgIHVpbnQ4IGMgPSBzW2xlbiAtIDFdOworICAgIHVpbnQzMiB5ID0gc3RhdGljX2Nhc3Q8dWludDMyPihhKSArIChzdGF0aWNfY2FzdDx1aW50MzI+KGIpIDw8IDgpOworICAgIHVpbnQzMiB6ID0gbGVuICsgKHN0YXRpY19jYXN0PHVpbnQzMj4oYykgPDwgMik7CisgICAgcmV0dXJuIFNoaWZ0TWl4KHkgKiBrMiBeIHogKiBrMCkgKiBrMjsKKyAgfQorICByZXR1cm4gazI7Cit9CisKKy8vIFRoaXMgcHJvYmFibHkgd29ya3Mgd2VsbCBmb3IgMTYtYnl0ZSBzdHJpbmdzIGFzIHdlbGwsIGJ1dCBpdCBtYXkgYmUgb3ZlcmtpbGwKKy8vIGluIHRoYXQgY2FzZS4KK3N0YXRpYyB1aW50NjQgSGFzaExlbjE3dG8zMihjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKSB7CisgIHVpbnQ2NCBtdWwgPSBrMiArIGxlbiAqIDI7CisgIHVpbnQ2NCBhID0gRmV0Y2g2NChzKSAqIGsxOworICB1aW50NjQgYiA9IEZldGNoNjQocyArIDgpOworICB1aW50NjQgYyA9IEZldGNoNjQocyArIGxlbiAtIDgpICogbXVsOworICB1aW50NjQgZCA9IEZldGNoNjQocyArIGxlbiAtIDE2KSAqIGsyOworICByZXR1cm4gSGFzaExlbjE2KFJvdGF0ZShhICsgYiwgNDMpICsgUm90YXRlKGMsIDMwKSArIGQsCisgICAgICAgICAgICAgICAgICAgYSArIFJvdGF0ZShiICsgazIsIDE4KSArIGMsIG11bCk7Cit9CisKKy8vIFJldHVybiBhIDE2LWJ5dGUgaGFzaCBmb3IgNDggYnl0ZXMuICBRdWljayBhbmQgZGlydHkuCisvLyBDYWxsZXJzIGRvIGJlc3QgdG8gdXNlICJyYW5kb20tbG9va2luZyIgdmFsdWVzIGZvciBhIGFuZCBiLgorc3RhdGljIHBhaXI8dWludDY0LCB1aW50NjQ+IFdlYWtIYXNoTGVuMzJXaXRoU2VlZHMoCisgICAgdWludDY0IHcsIHVpbnQ2NCB4LCB1aW50NjQgeSwgdWludDY0IHosIHVpbnQ2NCBhLCB1aW50NjQgYikgeworICBhICs9IHc7CisgIGIgPSBSb3RhdGUoYiArIGEgKyB6LCAyMSk7CisgIHVpbnQ2NCBjID0gYTsKKyAgYSArPSB4OworICBhICs9IHk7CisgIGIgKz0gUm90YXRlKGEsIDQ0KTsKKyAgcmV0dXJuIG1ha2VfcGFpcihhICsgeiwgYiArIGMpOworfQorCisvLyBSZXR1cm4gYSAxNi1ieXRlIGhhc2ggZm9yIHNbMF0gLi4uIHNbMzFdLCBhLCBhbmQgYi4gIFF1aWNrIGFuZCBkaXJ0eS4KK3N0YXRpYyBwYWlyPHVpbnQ2NCwgdWludDY0PiBXZWFrSGFzaExlbjMyV2l0aFNlZWRzKAorICAgIGNvbnN0IGNoYXIqIHMsIHVpbnQ2NCBhLCB1aW50NjQgYikgeworICByZXR1cm4gV2Vha0hhc2hMZW4zMldpdGhTZWVkcyhGZXRjaDY0KHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZXRjaDY0KHMgKyA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmV0Y2g2NChzICsgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZXRjaDY0KHMgKyAyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIpOworfQorCisvLyBSZXR1cm4gYW4gOC1ieXRlIGhhc2ggZm9yIDMzIHRvIDY0IGJ5dGVzLgorc3RhdGljIHVpbnQ2NCBIYXNoTGVuMzN0bzY0KGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pIHsKKyAgdWludDY0IG11bCA9IGsyICsgbGVuICogMjsKKyAgdWludDY0IGEgPSBGZXRjaDY0KHMpICogazI7CisgIHVpbnQ2NCBiID0gRmV0Y2g2NChzICsgOCk7CisgIHVpbnQ2NCBjID0gRmV0Y2g2NChzICsgbGVuIC0gMjQpOworICB1aW50NjQgZCA9IEZldGNoNjQocyArIGxlbiAtIDMyKTsKKyAgdWludDY0IGUgPSBGZXRjaDY0KHMgKyAxNikgKiBrMjsKKyAgdWludDY0IGYgPSBGZXRjaDY0KHMgKyAyNCkgKiA5OworICB1aW50NjQgZyA9IEZldGNoNjQocyArIGxlbiAtIDgpOworICB1aW50NjQgaCA9IEZldGNoNjQocyArIGxlbiAtIDE2KSAqIG11bDsKKyAgdWludDY0IHUgPSBSb3RhdGUoYSArIGcsIDQzKSArIChSb3RhdGUoYiwgMzApICsgYykgKiA5OworICB1aW50NjQgdiA9ICgoYSArIGcpIF4gZCkgKyBmICsgMTsKKyAgdWludDY0IHcgPSBic3dhcF82NCgodSArIHYpICogbXVsKSArIGg7CisgIHVpbnQ2NCB4ID0gUm90YXRlKGUgKyBmLCA0MikgKyBjOworICB1aW50NjQgeSA9IChic3dhcF82NCgodiArIHcpICogbXVsKSArIGcpICogbXVsOworICB1aW50NjQgeiA9IGUgKyBmICsgYzsKKyAgYSA9IGJzd2FwXzY0KCh4ICsgeikgKiBtdWwgKyB5KSArIGI7CisgIGIgPSBTaGlmdE1peCgoeiArIGEpICogbXVsICsgZCArIGgpICogbXVsOworICByZXR1cm4gYiArIHg7Cit9CisKK3VpbnQ2NCBDaXR5SGFzaDY0KGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pIHsKKyAgaWYgKGxlbiA8PSAzMikgeworICAgIGlmIChsZW4gPD0gMTYpIHsKKyAgICAgIHJldHVybiBIYXNoTGVuMHRvMTYocywgbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEhhc2hMZW4xN3RvMzIocywgbGVuKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobGVuIDw9IDY0KSB7CisgICAgcmV0dXJuIEhhc2hMZW4zM3RvNjQocywgbGVuKTsKKyAgfQorCisgIC8vIEZvciBzdHJpbmdzIG92ZXIgNjQgYnl0ZXMgd2UgaGFzaCB0aGUgZW5kIGZpcnN0LCBhbmQgdGhlbiBhcyB3ZQorICAvLyBsb29wIHdlIGtlZXAgNTYgYnl0ZXMgb2Ygc3RhdGU6IHYsIHcsIHgsIHksIGFuZCB6LgorICB1aW50NjQgeCA9IEZldGNoNjQocyArIGxlbiAtIDQwKTsKKyAgdWludDY0IHkgPSBGZXRjaDY0KHMgKyBsZW4gLSAxNikgKyBGZXRjaDY0KHMgKyBsZW4gLSA1Nik7CisgIHVpbnQ2NCB6ID0gSGFzaExlbjE2KEZldGNoNjQocyArIGxlbiAtIDQ4KSArIGxlbiwgRmV0Y2g2NChzICsgbGVuIC0gMjQpKTsKKyAgcGFpcjx1aW50NjQsIHVpbnQ2ND4gdiA9IFdlYWtIYXNoTGVuMzJXaXRoU2VlZHMocyArIGxlbiAtIDY0LCBsZW4sIHopOworICBwYWlyPHVpbnQ2NCwgdWludDY0PiB3ID0gV2Vha0hhc2hMZW4zMldpdGhTZWVkcyhzICsgbGVuIC0gMzIsIHkgKyBrMSwgeCk7CisgIHggPSB4ICogazEgKyBGZXRjaDY0KHMpOworCisgIC8vIERlY3JlYXNlIGxlbiB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA2NCwgYW5kIG9wZXJhdGUgb24gNjQtYnl0ZSBjaHVua3MuCisgIGxlbiA9IChsZW4gLSAxKSAmIH5zdGF0aWNfY2FzdDxzaXplX3Q+KDYzKTsKKyAgZG8geworICAgIHggPSBSb3RhdGUoeCArIHkgKyB2LmZpcnN0ICsgRmV0Y2g2NChzICsgOCksIDM3KSAqIGsxOworICAgIHkgPSBSb3RhdGUoeSArIHYuc2Vjb25kICsgRmV0Y2g2NChzICsgNDgpLCA0MikgKiBrMTsKKyAgICB4IF49IHcuc2Vjb25kOworICAgIHkgKz0gdi5maXJzdCArIEZldGNoNjQocyArIDQwKTsKKyAgICB6ID0gUm90YXRlKHogKyB3LmZpcnN0LCAzMykgKiBrMTsKKyAgICB2ID0gV2Vha0hhc2hMZW4zMldpdGhTZWVkcyhzLCB2LnNlY29uZCAqIGsxLCB4ICsgdy5maXJzdCk7CisgICAgdyA9IFdlYWtIYXNoTGVuMzJXaXRoU2VlZHMocyArIDMyLCB6ICsgdy5zZWNvbmQsIHkgKyBGZXRjaDY0KHMgKyAxNikpOworICAgIHN0ZDo6c3dhcCh6LCB4KTsKKyAgICBzICs9IDY0OworICAgIGxlbiAtPSA2NDsKKyAgfSB3aGlsZSAobGVuICE9IDApOworICByZXR1cm4gSGFzaExlbjE2KEhhc2hMZW4xNih2LmZpcnN0LCB3LmZpcnN0KSArIFNoaWZ0TWl4KHkpICogazEgKyB6LAorICAgICAgICAgICAgICAgICAgIEhhc2hMZW4xNih2LnNlY29uZCwgdy5zZWNvbmQpICsgeCk7Cit9CisKK3VpbnQ2NCBDaXR5SGFzaDY0V2l0aFNlZWQoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0IHNlZWQpIHsKKyAgcmV0dXJuIENpdHlIYXNoNjRXaXRoU2VlZHMocywgbGVuLCBrMiwgc2VlZCk7Cit9CisKK3VpbnQ2NCBDaXR5SGFzaDY0V2l0aFNlZWRzKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQgc2VlZDAsIHVpbnQ2NCBzZWVkMSkgeworICByZXR1cm4gSGFzaExlbjE2KENpdHlIYXNoNjQocywgbGVuKSAtIHNlZWQwLCBzZWVkMSk7Cit9CisKKy8vIEEgc3Vicm91dGluZSBmb3IgQ2l0eUhhc2gxMjgoKS4gIFJldHVybnMgYSBkZWNlbnQgMTI4LWJpdCBoYXNoIGZvciBzdHJpbmdzCisvLyBvZiBhbnkgbGVuZ3RoIHJlcHJlc2VudGFibGUgaW4gc2lnbmVkIGxvbmcuICBCYXNlZCBvbiBDaXR5IGFuZCBNdXJtdXIuCitzdGF0aWMgdWludDEyOCBDaXR5TXVybXVyKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQxMjggc2VlZCkgeworICB1aW50NjQgYSA9IFVpbnQxMjhMb3c2NChzZWVkKTsKKyAgdWludDY0IGIgPSBVaW50MTI4SGlnaDY0KHNlZWQpOworICB1aW50NjQgYyA9IDA7CisgIHVpbnQ2NCBkID0gMDsKKyAgc2lnbmVkIGxvbmcgbCA9IGxlbiAtIDE2OworICBpZiAobCA8PSAwKSB7ICAvLyBsZW4gPD0gMTYKKyAgICBhID0gU2hpZnRNaXgoYSAqIGsxKSAqIGsxOworICAgIGMgPSBiICogazEgKyBIYXNoTGVuMHRvMTYocywgbGVuKTsKKyAgICBkID0gU2hpZnRNaXgoYSArIChsZW4gPj0gOCA/IEZldGNoNjQocykgOiBjKSk7CisgIH0gZWxzZSB7ICAvLyBsZW4gPiAxNgorICAgIGMgPSBIYXNoTGVuMTYoRmV0Y2g2NChzICsgbGVuIC0gOCkgKyBrMSwgYSk7CisgICAgZCA9IEhhc2hMZW4xNihiICsgbGVuLCBjICsgRmV0Y2g2NChzICsgbGVuIC0gMTYpKTsKKyAgICBhICs9IGQ7CisgICAgZG8geworICAgICAgYSBePSBTaGlmdE1peChGZXRjaDY0KHMpICogazEpICogazE7CisgICAgICBhICo9IGsxOworICAgICAgYiBePSBhOworICAgICAgYyBePSBTaGlmdE1peChGZXRjaDY0KHMgKyA4KSAqIGsxKSAqIGsxOworICAgICAgYyAqPSBrMTsKKyAgICAgIGQgXj0gYzsKKyAgICAgIHMgKz0gMTY7CisgICAgICBsIC09IDE2OworICAgIH0gd2hpbGUgKGwgPiAwKTsKKyAgfQorICBhID0gSGFzaExlbjE2KGEsIGMpOworICBiID0gSGFzaExlbjE2KGQsIGIpOworICByZXR1cm4gdWludDEyOChhIF4gYiwgSGFzaExlbjE2KGIsIGEpKTsKK30KKwordWludDEyOCBDaXR5SGFzaDEyOFdpdGhTZWVkKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQxMjggc2VlZCkgeworICBpZiAobGVuIDwgMTI4KSB7CisgICAgcmV0dXJuIENpdHlNdXJtdXIocywgbGVuLCBzZWVkKTsKKyAgfQorCisgIC8vIFdlIGV4cGVjdCBsZW4gPj0gMTI4IHRvIGJlIHRoZSBjb21tb24gY2FzZS4gIEtlZXAgNTYgYnl0ZXMgb2Ygc3RhdGU6CisgIC8vIHYsIHcsIHgsIHksIGFuZCB6LgorICBwYWlyPHVpbnQ2NCwgdWludDY0PiB2LCB3OworICB1aW50NjQgeCA9IFVpbnQxMjhMb3c2NChzZWVkKTsKKyAgdWludDY0IHkgPSBVaW50MTI4SGlnaDY0KHNlZWQpOworICB1aW50NjQgeiA9IGxlbiAqIGsxOworICB2LmZpcnN0ID0gUm90YXRlKHkgXiBrMSwgNDkpICogazEgKyBGZXRjaDY0KHMpOworICB2LnNlY29uZCA9IFJvdGF0ZSh2LmZpcnN0LCA0MikgKiBrMSArIEZldGNoNjQocyArIDgpOworICB3LmZpcnN0ID0gUm90YXRlKHkgKyB6LCAzNSkgKiBrMSArIHg7CisgIHcuc2Vjb25kID0gUm90YXRlKHggKyBGZXRjaDY0KHMgKyA4OCksIDUzKSAqIGsxOworCisgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW5uZXIgbG9vcCBhcyBDaXR5SGFzaDY0KCksIG1hbnVhbGx5IHVucm9sbGVkLgorICBkbyB7CisgICAgeCA9IFJvdGF0ZSh4ICsgeSArIHYuZmlyc3QgKyBGZXRjaDY0KHMgKyA4KSwgMzcpICogazE7CisgICAgeSA9IFJvdGF0ZSh5ICsgdi5zZWNvbmQgKyBGZXRjaDY0KHMgKyA0OCksIDQyKSAqIGsxOworICAgIHggXj0gdy5zZWNvbmQ7CisgICAgeSArPSB2LmZpcnN0ICsgRmV0Y2g2NChzICsgNDApOworICAgIHogPSBSb3RhdGUoeiArIHcuZmlyc3QsIDMzKSAqIGsxOworICAgIHYgPSBXZWFrSGFzaExlbjMyV2l0aFNlZWRzKHMsIHYuc2Vjb25kICogazEsIHggKyB3LmZpcnN0KTsKKyAgICB3ID0gV2Vha0hhc2hMZW4zMldpdGhTZWVkcyhzICsgMzIsIHogKyB3LnNlY29uZCwgeSArIEZldGNoNjQocyArIDE2KSk7CisgICAgc3RkOjpzd2FwKHosIHgpOworICAgIHMgKz0gNjQ7CisgICAgeCA9IFJvdGF0ZSh4ICsgeSArIHYuZmlyc3QgKyBGZXRjaDY0KHMgKyA4KSwgMzcpICogazE7CisgICAgeSA9IFJvdGF0ZSh5ICsgdi5zZWNvbmQgKyBGZXRjaDY0KHMgKyA0OCksIDQyKSAqIGsxOworICAgIHggXj0gdy5zZWNvbmQ7CisgICAgeSArPSB2LmZpcnN0ICsgRmV0Y2g2NChzICsgNDApOworICAgIHogPSBSb3RhdGUoeiArIHcuZmlyc3QsIDMzKSAqIGsxOworICAgIHYgPSBXZWFrSGFzaExlbjMyV2l0aFNlZWRzKHMsIHYuc2Vjb25kICogazEsIHggKyB3LmZpcnN0KTsKKyAgICB3ID0gV2Vha0hhc2hMZW4zMldpdGhTZWVkcyhzICsgMzIsIHogKyB3LnNlY29uZCwgeSArIEZldGNoNjQocyArIDE2KSk7CisgICAgc3RkOjpzd2FwKHosIHgpOworICAgIHMgKz0gNjQ7CisgICAgbGVuIC09IDEyODsKKyAgfSB3aGlsZSAoTElLRUxZKGxlbiA+PSAxMjgpKTsKKyAgeCArPSBSb3RhdGUodi5maXJzdCArIHosIDQ5KSAqIGswOworICB5ID0geSAqIGswICsgUm90YXRlKHcuc2Vjb25kLCAzNyk7CisgIHogPSB6ICogazAgKyBSb3RhdGUody5maXJzdCwgMjcpOworICB3LmZpcnN0ICo9IDk7CisgIHYuZmlyc3QgKj0gazA7CisgIC8vIElmIDAgPCBsZW4gPCAxMjgsIGhhc2ggdXAgdG8gNCBjaHVua3Mgb2YgMzIgYnl0ZXMgZWFjaCBmcm9tIHRoZSBlbmQgb2Ygcy4KKyAgZm9yIChzaXplX3QgdGFpbF9kb25lID0gMDsgdGFpbF9kb25lIDwgbGVuOyApIHsKKyAgICB0YWlsX2RvbmUgKz0gMzI7CisgICAgeSA9IFJvdGF0ZSh4ICsgeSwgNDIpICogazAgKyB2LnNlY29uZDsKKyAgICB3LmZpcnN0ICs9IEZldGNoNjQocyArIGxlbiAtIHRhaWxfZG9uZSArIDE2KTsKKyAgICB4ID0geCAqIGswICsgdy5maXJzdDsKKyAgICB6ICs9IHcuc2Vjb25kICsgRmV0Y2g2NChzICsgbGVuIC0gdGFpbF9kb25lKTsKKyAgICB3LnNlY29uZCArPSB2LmZpcnN0OworICAgIHYgPSBXZWFrSGFzaExlbjMyV2l0aFNlZWRzKHMgKyBsZW4gLSB0YWlsX2RvbmUsIHYuZmlyc3QgKyB6LCB2LnNlY29uZCk7CisgICAgdi5maXJzdCAqPSBrMDsKKyAgfQorICAvLyBBdCB0aGlzIHBvaW50IG91ciA1NiBieXRlcyBvZiBzdGF0ZSBzaG91bGQgY29udGFpbiBtb3JlIHRoYW4KKyAgLy8gZW5vdWdoIGluZm9ybWF0aW9uIGZvciBhIHN0cm9uZyAxMjgtYml0IGhhc2guICBXZSB1c2UgdHdvCisgIC8vIGRpZmZlcmVudCA1Ni1ieXRlLXRvLTgtYnl0ZSBoYXNoZXMgdG8gZ2V0IGEgMTYtYnl0ZSBmaW5hbCByZXN1bHQuCisgIHggPSBIYXNoTGVuMTYoeCwgdi5maXJzdCk7CisgIHkgPSBIYXNoTGVuMTYoeSArIHosIHcuZmlyc3QpOworICByZXR1cm4gdWludDEyOChIYXNoTGVuMTYoeCArIHYuc2Vjb25kLCB3LnNlY29uZCkgKyB5LAorICAgICAgICAgICAgICAgICBIYXNoTGVuMTYoeCArIHcuc2Vjb25kLCB5ICsgdi5zZWNvbmQpKTsKK30KKwordWludDEyOCBDaXR5SGFzaDEyOChjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKSB7CisgIHJldHVybiBsZW4gPj0gMTYgPworICAgICAgQ2l0eUhhc2gxMjhXaXRoU2VlZChzICsgMTYsIGxlbiAtIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTI4KEZldGNoNjQocyksIEZldGNoNjQocyArIDgpICsgazApKSA6CisgICAgICBDaXR5SGFzaDEyOFdpdGhTZWVkKHMsIGxlbiwgdWludDEyOChrMCwgazEpKTsKK30KKworLy8gTkZEIE5PVEUKKy8vIFRoZSBmb2xsb3dpbmcgY29kZSBibG9jayBpcyBjb21tZW50ZWQgb3V0IGR1ZSB0byB0aGUgZm9sbG93aW5nIHJlYXNvbnMuCisvLyAtIEl0IHJlcXVpcmVzIHRoZSAiY2l0eWNyYy5oIiBoZWFkZXIgZmlsZSwgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluIHRoZQorLy8gICBORkQgY29kZSBiYXNlLgorLy8gLSBUaGUgZnVuY3Rpb25zIGRlZmluZWQgYmVsb3cgYXJlIG5vdCB1c2VkIGJ5IHRoZSBjdXJyZW50IE5GRAorLy8gICBpbXBsZW1lbnRhdGlvbi4KKy8vIFRoZSBoZWFkZXIgZmlsZSAiY2l0eWNyYy5oIiBpcyBhdmFpbGFibGUgYXQKKy8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2l0eWhhc2gvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY2l0eWNyYy5oCisKKy8qCisjaWZkZWYgX19TU0U0XzJfXworI2luY2x1ZGUgPGNpdHljcmMuaD4KKyNpbmNsdWRlIDxubW1pbnRyaW4uaD4KKworLy8gUmVxdWlyZXMgbGVuID49IDI0MC4KK3N0YXRpYyB2b2lkIENpdHlIYXNoQ3JjMjU2TG9uZyhjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBzZWVkLCB1aW50NjQgKnJlc3VsdCkgeworICB1aW50NjQgYSA9IEZldGNoNjQocyArIDU2KSArIGswOworICB1aW50NjQgYiA9IEZldGNoNjQocyArIDk2KSArIGswOworICB1aW50NjQgYyA9IHJlc3VsdFswXSA9IEhhc2hMZW4xNihiLCBsZW4pOworICB1aW50NjQgZCA9IHJlc3VsdFsxXSA9IEZldGNoNjQocyArIDEyMCkgKiBrMCArIGxlbjsKKyAgdWludDY0IGUgPSBGZXRjaDY0KHMgKyAxODQpICsgc2VlZDsKKyAgdWludDY0IGYgPSAwOworICB1aW50NjQgZyA9IDA7CisgIHVpbnQ2NCBoID0gYyArIGQ7CisgIHVpbnQ2NCB4ID0gc2VlZDsKKyAgdWludDY0IHkgPSAwOworICB1aW50NjQgeiA9IDA7CisKKyAgLy8gMjQwIGJ5dGVzIG9mIGlucHV0IHBlciBpdGVyLgorICBzaXplX3QgaXRlcnMgPSBsZW4gLyAyNDA7CisgIGxlbiAtPSBpdGVycyAqIDI0MDsKKyAgZG8geworI3VuZGVmIENIVU5LCisjZGVmaW5lIENIVU5LKHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUEVSTVVURTMoeCwgeiwgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiArPSBGZXRjaDY0KHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYyArPSBGZXRjaDY0KHMgKyA4KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZCArPSBGZXRjaDY0KHMgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZSArPSBGZXRjaDY0KHMgKyAyNCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZiArPSBGZXRjaDY0KHMgKyAzMik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSArPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaCArPSBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiArPSBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZiArPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZyArPSBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZSArPSB6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZyArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeiA9IF9tbV9jcmMzMl91NjQoeiwgYiArIGcpOyAgICAgICAgICAgICAgICBcCisgICAgeSA9IF9tbV9jcmMzMl91NjQoeSwgZSArIGgpOyAgICAgICAgICAgICAgICBcCisgICAgeCA9IF9tbV9jcmMzMl91NjQoeCwgZiArIGEpOyAgICAgICAgICAgICAgICBcCisgICAgZSA9IFJvdGF0ZShlLCByKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYyArPSBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcyArPSA0MAorCisgICAgQ0hVTksoMCk7IFBFUk1VVEUzKGEsIGgsIGMpOworICAgIENIVU5LKDMzKTsgUEVSTVVURTMoYSwgaCwgZik7CisgICAgQ0hVTksoMCk7IFBFUk1VVEUzKGIsIGgsIGYpOworICAgIENIVU5LKDQyKTsgUEVSTVVURTMoYiwgaCwgZCk7CisgICAgQ0hVTksoMCk7IFBFUk1VVEUzKGIsIGgsIGUpOworICAgIENIVU5LKDMzKTsgUEVSTVVURTMoYSwgaCwgZSk7CisgIH0gd2hpbGUgKC0taXRlcnMgPiAwKTsKKworICB3aGlsZSAobGVuID49IDQwKSB7CisgICAgQ0hVTksoMjkpOworICAgIGUgXj0gUm90YXRlKGEsIDIwKTsKKyAgICBoICs9IFJvdGF0ZShiLCAzMCk7CisgICAgZyBePSBSb3RhdGUoYywgNDApOworICAgIGYgKz0gUm90YXRlKGQsIDM0KTsKKyAgICBQRVJNVVRFMyhjLCBoLCBnKTsKKyAgICBsZW4gLT0gNDA7CisgIH0KKyAgaWYgKGxlbiA+IDApIHsKKyAgICBzID0gcyArIGxlbiAtIDQwOworICAgIENIVU5LKDMzKTsKKyAgICBlIF49IFJvdGF0ZShhLCA0Myk7CisgICAgaCArPSBSb3RhdGUoYiwgNDIpOworICAgIGcgXj0gUm90YXRlKGMsIDQxKTsKKyAgICBmICs9IFJvdGF0ZShkLCA0MCk7CisgIH0KKyAgcmVzdWx0WzBdIF49IGg7CisgIHJlc3VsdFsxXSBePSBnOworICBnICs9IGg7CisgIGEgPSBIYXNoTGVuMTYoYSwgZyArIHopOworICB4ICs9IHkgPDwgMzI7CisgIGIgKz0geDsKKyAgYyA9IEhhc2hMZW4xNihjLCB6KSArIGg7CisgIGQgPSBIYXNoTGVuMTYoZCwgZSArIHJlc3VsdFswXSk7CisgIGcgKz0gZTsKKyAgaCArPSBIYXNoTGVuMTYoeCwgZik7CisgIGUgPSBIYXNoTGVuMTYoYSwgZCkgKyBnOworICB6ID0gSGFzaExlbjE2KGIsIGMpICsgYTsKKyAgeSA9IEhhc2hMZW4xNihnLCBoKSArIGM7CisgIHJlc3VsdFswXSA9IGUgKyB6ICsgeSArIHg7CisgIGEgPSBTaGlmdE1peCgoYSArIHkpICogazApICogazAgKyBiOworICByZXN1bHRbMV0gKz0gYSArIHJlc3VsdFswXTsKKyAgYSA9IFNoaWZ0TWl4KGEgKiBrMCkgKiBrMCArIGM7CisgIHJlc3VsdFsyXSA9IGEgKyByZXN1bHRbMV07CisgIGEgPSBTaGlmdE1peCgoYSArIGUpICogazApICogazA7CisgIHJlc3VsdFszXSA9IGEgKyByZXN1bHRbMl07Cit9CisKKy8vIFJlcXVpcmVzIGxlbiA8IDI0MC4KK3N0YXRpYyB2b2lkIENpdHlIYXNoQ3JjMjU2U2hvcnQoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0ICpyZXN1bHQpIHsKKyAgY2hhciBidWZbMjQwXTsKKyAgbWVtY3B5KGJ1ZiwgcywgbGVuKTsKKyAgbWVtc2V0KGJ1ZiArIGxlbiwgMCwgMjQwIC0gbGVuKTsKKyAgQ2l0eUhhc2hDcmMyNTZMb25nKGJ1ZiwgMjQwLCB+c3RhdGljX2Nhc3Q8dWludDMyPihsZW4pLCByZXN1bHQpOworfQorCit2b2lkIENpdHlIYXNoQ3JjMjU2KGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQ2NCAqcmVzdWx0KSB7CisgIGlmIChMSUtFTFkobGVuID49IDI0MCkpIHsKKyAgICBDaXR5SGFzaENyYzI1NkxvbmcocywgbGVuLCAwLCByZXN1bHQpOworICB9IGVsc2UgeworICAgIENpdHlIYXNoQ3JjMjU2U2hvcnQocywgbGVuLCByZXN1bHQpOworICB9Cit9CisKK3VpbnQxMjggQ2l0eUhhc2hDcmMxMjhXaXRoU2VlZChjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLCB1aW50MTI4IHNlZWQpIHsKKyAgaWYgKGxlbiA8PSA5MDApIHsKKyAgICByZXR1cm4gQ2l0eUhhc2gxMjhXaXRoU2VlZChzLCBsZW4sIHNlZWQpOworICB9IGVsc2UgeworICAgIHVpbnQ2NCByZXN1bHRbNF07CisgICAgQ2l0eUhhc2hDcmMyNTYocywgbGVuLCByZXN1bHQpOworICAgIHVpbnQ2NCB1ID0gVWludDEyOEhpZ2g2NChzZWVkKSArIHJlc3VsdFswXTsKKyAgICB1aW50NjQgdiA9IFVpbnQxMjhMb3c2NChzZWVkKSArIHJlc3VsdFsxXTsKKyAgICByZXR1cm4gdWludDEyOChIYXNoTGVuMTYodSwgdiArIHJlc3VsdFsyXSksCisgICAgICAgICAgICAgICAgICAgSGFzaExlbjE2KFJvdGF0ZSh2LCAzMiksIHUgKiBrMCArIHJlc3VsdFszXSkpOworICB9Cit9CisKK3VpbnQxMjggQ2l0eUhhc2hDcmMxMjgoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikgeworICBpZiAobGVuIDw9IDkwMCkgeworICAgIHJldHVybiBDaXR5SGFzaDEyOChzLCBsZW4pOworICB9IGVsc2UgeworICAgIHVpbnQ2NCByZXN1bHRbNF07CisgICAgQ2l0eUhhc2hDcmMyNTYocywgbGVuLCByZXN1bHQpOworICAgIHJldHVybiB1aW50MTI4KHJlc3VsdFsyXSwgcmVzdWx0WzNdKTsKKyAgfQorfQorCisjZW5kaWYKKyovCmRpZmYgLS1naXQgYS9ORkQvY29yZS9jaXR5LWhhc2guaHBwIGIvTkZEL2NvcmUvY2l0eS1oYXNoLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE5MGNiCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvY2l0eS1oYXNoLmhwcApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSwgSW5jLgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKy8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisvLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisvLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisvLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKy8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisvLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKy8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKy8vIFRIRSBTT0ZUV0FSRS4KKy8vCisvLyBDaXR5SGFzaCwgYnkgR2VvZmYgUGlrZSBhbmQgSnlya2kgQWxha3VpamFsYQorLy8KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaXR5aGFzaC8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSBmZXcgZnVuY3Rpb25zIGZvciBoYXNoaW5nIHN0cmluZ3MuICBBbGwgb2YgdGhlbSBhcmUKKy8vIGhpZ2gtcXVhbGl0eSBmdW5jdGlvbnMgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBwYXNzIHN0YW5kYXJkIHRlc3RzIHN1Y2gKKy8vIGFzIEF1c3RpbiBBcHBsZWJ5J3MgU01IYXNoZXIuICBUaGV5IGFyZSBhbHNvIGZhc3QuCisvLworLy8gRm9yIDY0LWJpdCB4ODYgY29kZSwgb24gc2hvcnQgc3RyaW5ncywgd2UgZG9uJ3Qga25vdyBvZiBhbnl0aGluZyBmYXN0ZXIgdGhhbgorLy8gQ2l0eUhhc2g2NCB0aGF0IGlzIG9mIGNvbXBhcmFibGUgcXVhbGl0eS4gIFdlIGJlbGlldmUgb3VyIG5lYXJlc3QgY29tcGV0aXRvcgorLy8gaXMgTXVybXVyMy4gIEZvciA2NC1iaXQgeDg2IGNvZGUsIENpdHlIYXNoNjQgaXMgYW4gZXhjZWxsZW50IGNob2ljZSBmb3IgaGFzaAorLy8gdGFibGVzIGFuZCBtb3N0IG90aGVyIGhhc2hpbmcgKGV4Y2x1ZGluZyBjcnlwdG9ncmFwaHkpLgorLy8KKy8vIEZvciA2NC1iaXQgeDg2IGNvZGUsIG9uIGxvbmcgc3RyaW5ncywgdGhlIHBpY3R1cmUgaXMgbW9yZSBjb21wbGljYXRlZC4KKy8vIE9uIG1hbnkgcmVjZW50IEludGVsIENQVXMsIHN1Y2ggYXMgTmVoYWxlbSwgV2VzdG1lcmUsIFNhbmR5IEJyaWRnZSwgZXRjLiwKKy8vIENpdHlIYXNoQ3JjMTI4IGFwcGVhcnMgdG8gYmUgZmFzdGVyIHRoYW4gYWxsIGNvbXBldGl0b3JzIG9mIGNvbXBhcmFibGUKKy8vIHF1YWxpdHkuICBDaXR5SGFzaDEyOCBpcyBhbHNvIGdvb2QgYnV0IG5vdCBxdWl0ZSBhcyBmYXN0LiAgV2UgYmVsaWV2ZSBvdXIKKy8vIG5lYXJlc3QgY29tcGV0aXRvciBpcyBCb2IgSmVua2lucycgU3Bvb2t5LiAgV2UgZG9uJ3QgaGF2ZSBncmVhdCBkYXRhIGZvcgorLy8gb3RoZXIgNjQtYml0IENQVXMsIGJ1dCBmb3IgbG9uZyBzdHJpbmdzIHdlIGtub3cgdGhhdCBTcG9va3kgaXMgc2xpZ2h0bHkKKy8vIGZhc3RlciB0aGFuIENpdHlIYXNoIG9uIHNvbWUgcmVsYXRpdmVseSByZWNlbnQgQU1EIHg4Ni02NCBDUFVzLCBmb3IgZXhhbXBsZS4KKy8vIE5vdGUgdGhhdCBDaXR5SGFzaENyYzEyOCBpcyBkZWNsYXJlZCBpbiBjaXR5Y3JjLmguCisvLworLy8gRm9yIDMyLWJpdCB4ODYgY29kZSwgd2UgZG9uJ3Qga25vdyBvZiBhbnl0aGluZyBmYXN0ZXIgdGhhbiBDaXR5SGFzaDMyIHRoYXQKKy8vIGlzIG9mIGNvbXBhcmFibGUgcXVhbGl0eS4gIFdlIGJlbGlldmUgb3VyIG5lYXJlc3QgY29tcGV0aXRvciBpcyBNdXJtdXIzQS4KKy8vIChPbiA2NC1iaXQgQ1BVcywgaXQgaXMgdHlwaWNhbGx5IGZhc3RlciB0byB1c2UgdGhlIG90aGVyIENpdHlIYXNoIHZhcmlhbnRzLikKKy8vCisvLyBGdW5jdGlvbnMgaW4gdGhlIENpdHlIYXNoIGZhbWlseSBhcmUgbm90IHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaHkuCisvLworLy8gUGxlYXNlIHNlZSBDaXR5SGFzaCdzIFJFQURNRSBmaWxlIGZvciBtb3JlIGRldGFpbHMgb24gb3VyIHBlcmZvcm1hbmNlCisvLyBtZWFzdXJlbWVudHMgYW5kIHNvIG9uLgorLy8KKy8vIFdBUk5JTkc6IFRoaXMgY29kZSBoYXMgYmVlbiBvbmx5IGxpZ2h0bHkgdGVzdGVkIG9uIGJpZy1lbmRpYW4gcGxhdGZvcm1zIQorLy8gSXQgaXMga25vd24gdG8gd29yayB3ZWxsIG9uIGxpdHRsZS1lbmRpYW4gcGxhdGZvcm1zIHRoYXQgaGF2ZSBhIHNtYWxsIHBlbmFsdHkKKy8vIGZvciB1bmFsaWduZWQgcmVhZHMsIHN1Y2ggYXMgY3VycmVudCBJbnRlbCBhbmQgQU1EIG1vZGVyYXRlLXRvLWhpZ2gtZW5kIENQVXMuCisvLyBJdCBzaG91bGQgd29yayBvbiBhbGwgMzItYml0IGFuZCA2NC1iaXQgcGxhdGZvcm1zIHRoYXQgYWxsb3cgdW5hbGlnbmVkIHJlYWRzOworLy8gYnVnIHJlcG9ydHMgYXJlIHdlbGNvbWUuCisvLworLy8gQnkgdGhlIHdheSwgZm9yIHNvbWUgaGFzaCBmdW5jdGlvbnMsIGdpdmVuIHN0cmluZ3MgYSBhbmQgYiwgdGhlIGhhc2gKKy8vIG9mIGErYiBpcyBlYXNpbHkgZGVyaXZlZCBmcm9tIHRoZSBoYXNoZXMgb2YgYSBhbmQgYi4gIFRoaXMgcHJvcGVydHkKKy8vIGRvZXNuJ3QgaG9sZCBmb3IgYW55IGhhc2ggZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4KKworI2lmbmRlZiBDSVRZX0hBU0hfSFBQCisjZGVmaW5lIENJVFlfSEFTSF9IUFAKKworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIHNpemVfdC4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCit0eXBlZGVmIHVpbnQ4X3QgdWludDg7Cit0eXBlZGVmIHVpbnQzMl90IHVpbnQzMjsKK3R5cGVkZWYgdWludDY0X3QgdWludDY0OwordHlwZWRlZiBzdGQ6OnBhaXI8dWludDY0LCB1aW50NjQ+IHVpbnQxMjg7CisKK2lubGluZSB1aW50NjQgVWludDEyOExvdzY0KGNvbnN0IHVpbnQxMjgmIHgpIHsgcmV0dXJuIHguZmlyc3Q7IH0KK2lubGluZSB1aW50NjQgVWludDEyOEhpZ2g2NChjb25zdCB1aW50MTI4JiB4KSB7IHJldHVybiB4LnNlY29uZDsgfQorCisvLyBIYXNoIGZ1bmN0aW9uIGZvciBhIGJ5dGUgYXJyYXkuCit1aW50NjQgQ2l0eUhhc2g2NChjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvLyBIYXNoIGZ1bmN0aW9uIGZvciBhIGJ5dGUgYXJyYXkuICBGb3IgY29udmVuaWVuY2UsIGEgNjQtYml0IHNlZWQgaXMgYWxzbworLy8gaGFzaGVkIGludG8gdGhlIHJlc3VsdC4KK3VpbnQ2NCBDaXR5SGFzaDY0V2l0aFNlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLCB1aW50NjQgc2VlZCk7CisKKy8vIEhhc2ggZnVuY3Rpb24gZm9yIGEgYnl0ZSBhcnJheS4gIEZvciBjb252ZW5pZW5jZSwgdHdvIHNlZWRzIGFyZSBhbHNvCisvLyBoYXNoZWQgaW50byB0aGUgcmVzdWx0LgordWludDY0IENpdHlIYXNoNjRXaXRoU2VlZHMoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0IHNlZWQwLCB1aW50NjQgc2VlZDEpOworCisvLyBIYXNoIGZ1bmN0aW9uIGZvciBhIGJ5dGUgYXJyYXkuCit1aW50MTI4IENpdHlIYXNoMTI4KGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pOworCisvLyBIYXNoIGZ1bmN0aW9uIGZvciBhIGJ5dGUgYXJyYXkuICBGb3IgY29udmVuaWVuY2UsIGEgMTI4LWJpdCBzZWVkIGlzIGFsc28KKy8vIGhhc2hlZCBpbnRvIHRoZSByZXN1bHQuCit1aW50MTI4IENpdHlIYXNoMTI4V2l0aFNlZWQoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDEyOCBzZWVkKTsKKworLy8gSGFzaCBmdW5jdGlvbiBmb3IgYSBieXRlIGFycmF5LiAgTW9zdCB1c2VmdWwgaW4gMzItYml0IGJpbmFyaWVzLgordWludDMyIENpdHlIYXNoMzIoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLy8gSGFzaCAxMjggaW5wdXQgYml0cyBkb3duIHRvIDY0IGJpdHMgb2Ygb3V0cHV0LgorLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIHJlYXNvbmFibHkgZ29vZCBoYXNoIGZ1bmN0aW9uLgoraW5saW5lIHVpbnQ2NCBIYXNoMTI4dG82NChjb25zdCB1aW50MTI4JiB4KSB7CisgIC8vIE11cm11ci1pbnNwaXJlZCBoYXNoaW5nLgorICBjb25zdCB1aW50NjQga011bCA9IDB4OWRkZmVhMDhlYjM4MmQ2OVVMTDsKKyAgdWludDY0IGEgPSAoVWludDEyOExvdzY0KHgpIF4gVWludDEyOEhpZ2g2NCh4KSkgKiBrTXVsOworICBhIF49IChhID4+IDQ3KTsKKyAgdWludDY0IGIgPSAoVWludDEyOEhpZ2g2NCh4KSBeIGEpICoga011bDsKKyAgYiBePSAoYiA+PiA0Nyk7CisgIGIgKj0ga011bDsKKyAgcmV0dXJuIGI7Cit9CisKKyNlbmRpZiAgLy8gQ0lUWV9IQVNIX0hfCmRpZmYgLS1naXQgYS9ORkQvY29yZS9jb25maWctZmlsZS5jcHAgYi9ORkQvY29yZS9jb25maWctZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4N2MyYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb3JlL2NvbmZpZy1maWxlLmNwcApAQCAtMCwwICsxLDE0MyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImNvbmZpZy1maWxlLmhwcCIKKyNpbmNsdWRlICJsb2dnZXIuaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9pbmZvX3BhcnNlci5ocHA+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiQ29uZmlnRmlsZSIpOworCit2b2lkCitDb25maWdGaWxlOjp0aHJvd0Vycm9yT25Vbmtub3duU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWdTZWN0aW9uJiBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RyeVJ1bikKK3sKKyAgc3RkOjpzdHJpbmcgbXNnID0gIkVycm9yIHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbiBmaWxlICI7CisgIG1zZyArPSBmaWxlbmFtZTsKKyAgbXNnICs9ICI6IG5vIG1vZHVsZSBzdWJzY3JpYmVkIGZvciBzZWN0aW9uIFwiIiArIHNlY3Rpb25OYW1lICsgIlwiIjsKKworICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcihtc2cpOworfQorCit2b2lkCitDb25maWdGaWxlOjppZ25vcmVVbmtub3duU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWdTZWN0aW9uJiBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RyeVJ1bikKK3sKKyAgLy8gZG8gbm90aGluZworfQorCitDb25maWdGaWxlOjpDb25maWdGaWxlKFVua25vd25Db25maWdTZWN0aW9uSGFuZGxlciB1bmtub3duU2VjdGlvbkNhbGxiYWNrKQorICA6IG1fdW5rbm93blNlY3Rpb25DYWxsYmFjayh1bmtub3duU2VjdGlvbkNhbGxiYWNrKQoreworfQorCit2b2lkCitDb25maWdGaWxlOjphZGRTZWN0aW9uSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWdTZWN0aW9uSGFuZGxlciBzdWJzY3JpYmVyKQoreworICBtX3N1YnNjcmlwdGlvbnNbc2VjdGlvbk5hbWVdID0gc3Vic2NyaWJlcjsKK30KKwordm9pZAorQ29uZmlnRmlsZTo6cGFyc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBib29sIGlzRHJ5UnVuKQoreworICBzdGQ6Omlmc3RyZWFtIGlucHV0RmlsZTsKKyAgaW5wdXRGaWxlLm9wZW4oZmlsZW5hbWUuY19zdHIoKSk7CisgIGlmICghaW5wdXRGaWxlLmdvb2QoKSB8fCAhaW5wdXRGaWxlLmlzX29wZW4oKSkKKyAgICB7CisgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIHJlYWQgY29uZmlndXJhdGlvbiBmaWxlOiAiOworICAgICAgbXNnICs9IGZpbGVuYW1lOworICAgICAgdGhyb3cgRXJyb3IobXNnKTsKKyAgICB9CisgIHBhcnNlKGlucHV0RmlsZSwgaXNEcnlSdW4sIGZpbGVuYW1lKTsKKyAgaW5wdXRGaWxlLmNsb3NlKCk7Cit9CisKK3ZvaWQKK0NvbmZpZ0ZpbGU6OnBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwgYm9vbCBpc0RyeVJ1biwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW5wdXRTdHJlYW0oaW5wdXQpOworICBwYXJzZShpbnB1dFN0cmVhbSwgaXNEcnlSdW4sIGZpbGVuYW1lKTsKK30KKworCit2b2lkCitDb25maWdGaWxlOjpwYXJzZShzdGQ6OmlzdHJlYW0mIGlucHV0LCBib29sIGlzRHJ5UnVuLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHRyeQorICAgIHsKKyAgICAgIGJvb3N0Ojpwcm9wZXJ0eV90cmVlOjpyZWFkX2luZm8oaW5wdXQsIG1fZ2xvYmFsKTsKKyAgICB9CisgIGNhdGNoIChjb25zdCBib29zdDo6cHJvcGVydHlfdHJlZTo6aW5mb19wYXJzZXJfZXJyb3ImIGVycm9yKQorICAgIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG1zZzsKKyAgICAgIG1zZyA8PCAiRmFpbGVkIHRvIHBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSI7CisgICAgICBtc2cgPDwgIiAiIDw8IGZpbGVuYW1lOworICAgICAgbXNnIDw8ICIgIiA8PCBlcnJvci5tZXNzYWdlKCkgPDwgIiBsaW5lICIgPDwgZXJyb3IubGluZSgpOworICAgICAgdGhyb3cgRXJyb3IobXNnLnN0cigpKTsKKyAgICB9CisKKyAgcHJvY2Vzcyhpc0RyeVJ1biwgZmlsZW5hbWUpOworfQorCit2b2lkCitDb25maWdGaWxlOjpwcm9jZXNzKGJvb2wgaXNEcnlSdW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgQk9PU1RfQVNTRVJUKCFmaWxlbmFtZS5lbXB0eSgpKTsKKyAgLy8gTkZEX0xPR19ERUJVRygicHJvY2Vzc2luZy4uLiIgPDwgKChpc0RyeVJ1bik/KCJkcnkgcnVuIik6KCIiKSkpOworCisgIGlmIChtX2dsb2JhbC5iZWdpbigpID09IG1fZ2xvYmFsLmVuZCgpKQorICAgIHsKKyAgICAgIHN0ZDo6c3RyaW5nIG1zZyA9ICJFcnJvciBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTogIjsKKyAgICAgIG1zZyArPSBmaWxlbmFtZTsKKyAgICAgIG1zZyArPSAiIG5vIGRhdGEiOworICAgICAgdGhyb3cgRXJyb3IobXNnKTsKKyAgICB9CisKKyAgZm9yIChDb25maWdTZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpID0gbV9nbG9iYWwuYmVnaW4oKTsgaSAhPSBtX2dsb2JhbC5lbmQoKTsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uTmFtZSA9IGktPmZpcnN0OworICAgICAgY29uc3QgQ29uZmlnU2VjdGlvbiYgc2VjdGlvbiA9IGktPnNlY29uZDsKKworICAgICAgU3Vic2NyaXB0aW9uVGFibGU6Oml0ZXJhdG9yIHN1YnNjcmliZXJJdCA9IG1fc3Vic2NyaXB0aW9ucy5maW5kKHNlY3Rpb25OYW1lKTsKKyAgICAgIGlmIChzdWJzY3JpYmVySXQgIT0gbV9zdWJzY3JpcHRpb25zLmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgQ29uZmlnU2VjdGlvbkhhbmRsZXIgc3Vic2NyaWJlciA9IHN1YnNjcmliZXJJdC0+c2Vjb25kOworICAgICAgICAgIHN1YnNjcmliZXIoc2VjdGlvbiwgaXNEcnlSdW4sIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbV91bmtub3duU2VjdGlvbkNhbGxiYWNrKGZpbGVuYW1lLCBzZWN0aW9uTmFtZSwgc2VjdGlvbiwgaXNEcnlSdW4pOworICAgICAgICB9CisgICAgfQorfQorCit9CmRpZmYgLS1naXQgYS9ORkQvY29yZS9jb25maWctZmlsZS5ocHAgYi9ORkQvY29yZS9jb25maWctZmlsZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkZDg4NgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb3JlL2NvbmZpZy1maWxlLmhwcApAQCAtMCwwICsxLDEyOCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBORkRfQ09SRV9DT05GSUdfRklMRV9IUFAKKyNkZWZpbmUgTkZEX0NPUkVfQ09ORklHX0ZJTEVfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfdHJlZS9wdHJlZS5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworCit0eXBlZGVmIGJvb3N0Ojpwcm9wZXJ0eV90cmVlOjpwdHJlZSBDb25maWdTZWN0aW9uOworCisvLy8gXGJyaWVmIGNhbGxiYWNrIGZvciBjb25maWcgZmlsZSBzZWN0aW9ucwordHlwZWRlZiBmdW5jdGlvbjx2b2lkKGNvbnN0IENvbmZpZ1NlY3Rpb24mIC8qc2VjdGlvbiovLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyppc0RyeVJ1biovLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmZpbGVuYW1lKi8pPiBDb25maWdTZWN0aW9uSGFuZGxlcjsKKworLy8vIFxicmllZiBjYWxsYmFjayBmb3IgY29uZmlnIGZpbGUgc2VjdGlvbnMgd2l0aG91dCBhIHN1YnNjcmliZWQgaGFuZGxlcgordHlwZWRlZiBmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmZpbGVuYW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qc2VjdGlvbk5hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWdTZWN0aW9uJiAvKnNlY3Rpb24qLywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIC8qaXNEcnlSdW4qLyk+IFVua25vd25Db25maWdTZWN0aW9uSGFuZGxlcjsKKworY2xhc3MgQ29uZmlnRmlsZSA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisKKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IHN0ZDo6cnVudGltZV9lcnJvcih3aGF0KQorICAgIHsKKworICAgIH0KKyAgfTsKKworICBDb25maWdGaWxlKFVua25vd25Db25maWdTZWN0aW9uSGFuZGxlciB1bmtub3duU2VjdGlvbkNhbGxiYWNrID0gdGhyb3dFcnJvck9uVW5rbm93blNlY3Rpb24pOworCisgIHN0YXRpYyB2b2lkCisgIHRocm93RXJyb3JPblVua25vd25TZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWdTZWN0aW9uJiBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRHJ5UnVuKTsKKworICBzdGF0aWMgdm9pZAorICBpZ25vcmVVbmtub3duU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnU2VjdGlvbiYgc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RyeVJ1bik7CisKKyAgLy8vIFxicmllZiBzZXR1cCBub3RpZmljYXRpb24gb2YgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb25zCisgIHZvaWQKKyAgYWRkU2VjdGlvbkhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICBDb25maWdTZWN0aW9uSGFuZGxlciBzdWJzY3JpYmVyKTsKKworCisgIC8qKgorICAgKiBccGFyYW0gZmlsZW5hbWUgZmlsZSB0byBwYXJzZQorICAgKiBccGFyYW0gaXNEcnlSdW4gdHJ1ZSBpZiBwZXJmb3JtaW5nIGEgZHJ5IHJ1biBvZiBjb25maWd1cmF0aW9uLCBmYWxzZSBvdGhlcndpc2UKKyAgICogXHRocm93cyBDb25maWdGaWxlOjpFcnJvciBpZiBmaWxlIG5vdCBmb3VuZAorICAgKiBcdGhyb3dzIENvbmZpZ0ZpbGU6OkVycm9yIGlmIHBhcnNlIGVycm9yCisgICAqLworICB2b2lkCisgIHBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgYm9vbCBpc0RyeVJ1bik7CisKKyAgLyoqCisgICAqIFxwYXJhbSBpbnB1dCBjb25maWd1cmF0aW9uIChhcyBhIHN0cmluZykgdG8gcGFyc2UKKyAgICogXHBhcmFtIGlzRHJ5UnVuIHRydWUgaWYgcGVyZm9ybWluZyBhIGRyeSBydW4gb2YgY29uZmlndXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqIFxwYXJhbSBmaWxlbmFtZSBvcHRpb25hbCBjb252ZW5pZW5jZSBhcmd1bWVudCB0byBwcm92aWRlIG1vcmUgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMKKyAgICogXHRocm93cyBDb25maWdGaWxlOjpFcnJvciBpZiBmaWxlIG5vdCBmb3VuZAorICAgKiBcdGhyb3dzIENvbmZpZ0ZpbGU6OkVycm9yIGlmIHBhcnNlIGVycm9yCisgICAqLworICB2b2lkCisgIHBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwgYm9vbCBpc0RyeVJ1biwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworICAvKioKKyAgICogXHBhcmFtIGlucHV0IHN0cmVhbSB0byBwYXJzZQorICAgKiBccGFyYW0gaXNEcnlSdW4gdHJ1ZSBpZiBwZXJmb3JtaW5nIGEgZHJ5IHJ1biBvZiBjb25maWd1cmF0aW9uLCBmYWxzZSBvdGhlcndpc2UKKyAgICogXHBhcmFtIGZpbGVuYW1lIG9wdGlvbmFsIGNvbnZlbmllbmNlIGFyZ3VtZW50IHRvIHByb3ZpZGUgbW9yZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcworICAgKiBcdGhyb3dzIENvbmZpZ0ZpbGU6OkVycm9yIGlmIHBhcnNlIGVycm9yCisgICAqLworICB2b2lkCisgIHBhcnNlKHN0ZDo6aXN0cmVhbSYgaW5wdXQsIGJvb2wgaXNEcnlSdW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisKK3ByaXZhdGU6CisKKyAgdm9pZAorICBwcm9jZXNzKGJvb2wgaXNEcnlSdW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisKK3ByaXZhdGU6CisgIFVua25vd25Db25maWdTZWN0aW9uSGFuZGxlciBtX3Vua25vd25TZWN0aW9uQ2FsbGJhY2s7CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29uZmlnU2VjdGlvbkhhbmRsZXI+IFN1YnNjcmlwdGlvblRhYmxlOworCisgIFN1YnNjcmlwdGlvblRhYmxlIG1fc3Vic2NyaXB0aW9uczsKKworICBDb25maWdTZWN0aW9uIG1fZ2xvYmFsOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKworI2VuZGlmIC8vIE5GRF9DT1JFX0NPTkZJR19GSUxFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2NvcmUvZ2xvYmFsLWlvLmNwcCBiL05GRC9jb3JlL2dsb2JhbC1pby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkODI3MAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb3JlL2dsb2JhbC1pby5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImdsb2JhbC1pby5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCituYW1lc3BhY2Ugc2NoZWR1bGVyIHsKKy8vIGRlZmluZWQgaW4gc2NoZWR1bGVyLmNwcAordm9pZAorcmVzZXRHbG9iYWxTY2hlZHVsZXIoKTsKK30gLy8gbmFtZXNwYWNlIHNjaGVkdWxlcgorCitzdGF0aWMgc2hhcmVkX3B0cjxib29zdDo6YXNpbzo6aW9fc2VydmljZT4gZ19pb1NlcnZpY2U7CisKK2Jvb3N0Ojphc2lvOjppb19zZXJ2aWNlJgorZ2V0R2xvYmFsSW9TZXJ2aWNlKCkKK3sKKyAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihnX2lvU2VydmljZSkpIHsKKyAgICBnX2lvU2VydmljZSA9IG1ha2Vfc2hhcmVkPGJvb3N0Ojphc2lvOjppb19zZXJ2aWNlPigpOworICB9CisgIHJldHVybiAqZ19pb1NlcnZpY2U7Cit9CisKK3ZvaWQKK3Jlc2V0R2xvYmFsSW9TZXJ2aWNlKCkKK3sKKyAgc2NoZWR1bGVyOjpyZXNldEdsb2JhbFNjaGVkdWxlcigpOworICBnX2lvU2VydmljZS5yZXNldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9jb3JlL2dsb2JhbC1pby5ocHAgYi9ORkQvY29yZS9nbG9iYWwtaW8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDMwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9nbG9iYWwtaW8uaHBwCkBAIC0wLDAgKzEsNDggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0NPUkVfR0xPQkFMX0lPX0hQUAorI2RlZmluZSBORkRfQ09SRV9HTE9CQUxfSU9fSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqIFxyZXR1cm4gdGhlIGdsb2JhbCBpb19zZXJ2aWNlIGluc3RhbmNlCisgKi8KK2Jvb3N0Ojphc2lvOjppb19zZXJ2aWNlJgorZ2V0R2xvYmFsSW9TZXJ2aWNlKCk7CisKKyNpZmRlZiBXSVRIX1RFU1RTCisvKiogXGJyaWVmIGRlbGV0ZSB0aGUgZ2xvYmFsIGlvX3NlcnZpY2UgaW5zdGFuY2UKKyAqCisgKiAgSXQgd2lsbCBiZSByZWNyZWF0ZWQgYXQgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBnZXRHbG9iYWxJb1NlcnZpY2UuCisgKi8KK3ZvaWQKK3Jlc2V0R2xvYmFsSW9TZXJ2aWNlKCk7CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfQ09SRV9HTE9CQUxfSU9fSFBQCmRpZmYgLS1naXQgYS9ORkQvY29yZS9sb2dnZXItZmFjdG9yeS5jcHAgYi9ORkQvY29yZS9sb2dnZXItZmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlZjNjZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb3JlL2xvZ2dlci1mYWN0b3J5LmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImxvZ2dlci1mYWN0b3J5LmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiTG9nZ2VyRmFjdG9yeSIpOworCitMb2dnZXJGYWN0b3J5JgorTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKQoreworICBzdGF0aWMgTG9nZ2VyRmFjdG9yeSBnbG9iYWxMb2dnZXJGYWN0b3J5OworCisgIHJldHVybiBnbG9iYWxMb2dnZXJGYWN0b3J5OworfQorCitMb2dnZXJGYWN0b3J5OjpMb2dnZXJGYWN0b3J5KCkKKyAgOiBtX2RlZmF1bHRMZXZlbChMT0dfSU5GTykKK3sKKyAgbV9sZXZlbE5hbWVzWyJOT05FIl0gPSBMT0dfTk9ORTsKKyAgbV9sZXZlbE5hbWVzWyJFUlJPUiJdID0gTE9HX0VSUk9SOworICBtX2xldmVsTmFtZXNbIldBUk4iXSA9IExPR19XQVJOOworICBtX2xldmVsTmFtZXNbIklORk8iXSA9IExPR19JTkZPOworICBtX2xldmVsTmFtZXNbIkRFQlVHIl0gPSBMT0dfREVCVUc7CisgIG1fbGV2ZWxOYW1lc1siVFJBQ0UiXSA9IExPR19UUkFDRTsKKyAgbV9sZXZlbE5hbWVzWyJBTEwiXSA9IExPR19BTEw7Cit9CisKK3ZvaWQKK0xvZ2dlckZhY3Rvcnk6OnNldENvbmZpZ0ZpbGUoQ29uZmlnRmlsZSYgY29uZmlnKQoreworICBjb25maWcuYWRkU2VjdGlvbkhhbmRsZXIoImxvZyIsIGJpbmQoJkxvZ2dlckZhY3Rvcnk6Om9uQ29uZmlnLCB0aGlzLCBfMSwgXzIsIF8zKSk7Cit9CisKK0xvZ0xldmVsCitMb2dnZXJGYWN0b3J5OjpwYXJzZUxldmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBsZXZlbCkKK3sKKyAgc3RkOjpzdHJpbmcgdXBwZXJMZXZlbCA9IGxldmVsOworICBib29zdDo6dG9fdXBwZXIodXBwZXJMZXZlbCk7CisKKyAgLy8gc3RkOjpjZXJyIDw8ICJwYXJzaW5nIGxldmVsOiAiIDw8IHVwcGVyTGV2ZWwgPDwgc3RkOjplbmRsOzsKKyAgLy8gc3RkOjpjZXJyIDw8ICIjIGxldmVsczogIiA8PCBtX2xldmVsTmFtZXMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgLy8gc3RkOjpjZXJyIDw8IG1fbGV2ZWxOYW1lcy5iZWdpbigpLT5maXJzdCA8PCBzdGQ6OmVuZGw7CisKKyAgTGV2ZWxNYXA6OmNvbnN0X2l0ZXJhdG9yIGxldmVsSXQgPSBtX2xldmVsTmFtZXMuZmluZCh1cHBlckxldmVsKTsKKyAgaWYgKGxldmVsSXQgIT0gbV9sZXZlbE5hbWVzLmVuZCgpKQorICAgIHsKKyAgICAgIHJldHVybiBsZXZlbEl0LT5zZWNvbmQ7CisgICAgfQorICB0cnkKKyAgICB7CisgICAgICB1aW50MzJfdCBsZXZlbE5vID0gYm9vc3Q6OmxleGljYWxfY2FzdDx1aW50MzJfdD4obGV2ZWwpOworCisgICAgICBpZiAoKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8dWludDMyX3Q+KExPR19OT05FKSA8PSBsZXZlbE5vICYmCisgICAgICAgICAgIGxldmVsTm8gPD0gYm9vc3Q6OmxleGljYWxfY2FzdDx1aW50MzJfdD4oTE9HX1RSQUNFKSkgfHwKKyAgICAgICAgICBsZXZlbE5vID09IExPR19BTEwpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TG9nTGV2ZWw+KGxldmVsTm8pOworICAgICAgICB9CisgICAgfQorICBjYXRjaCAoY29uc3QgYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QmIGVycm9yKQorICAgIHsKKyAgICB9CisgIHRocm93IExvZ2dlckZhY3Rvcnk6OkVycm9yKCJVbnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsICsgIlwiIik7Cit9CisKK0xvZ0xldmVsCitMb2dnZXJGYWN0b3J5OjpleHRyYWN0TGV2ZWwoY29uc3QgQ29uZmlnU2VjdGlvbiYgaXRlbSwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkKK3sKKyAgc3RkOjpzdHJpbmcgbGV2ZWxTdHJpbmc7CisgIHRyeQorICAgIHsKKyAgICAgIGxldmVsU3RyaW5nID0gaXRlbS5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCk7CisgICAgfQorICBjYXRjaCAoY29uc3QgYm9vc3Q6OnByb3BlcnR5X3RyZWU6OnB0cmVlX2Vycm9yJiBlcnJvcikKKyAgICB7CisgICAgfQorCisgIGlmIChsZXZlbFN0cmluZy5lbXB0eSgpKQorICAgIHsKKyAgICAgIHRocm93IExvZ2dlckZhY3Rvcnk6OkVycm9yKCJObyBsb2dnaW5nIGxldmVsIGZvdW5kIGZvciBvcHRpb24gXCIiICsga2V5ICsgIlwiIik7CisgICAgfQorCisgIHJldHVybiBwYXJzZUxldmVsKGxldmVsU3RyaW5nKTsKK30KKwordm9pZAorTG9nZ2VyRmFjdG9yeTo6b25Db25maWcoY29uc3QgQ29uZmlnU2VjdGlvbiYgc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisvLyBsb2cKKy8vIHsKKy8vICAgOyBkZWZhdWx0X2xldmVsIHNwZWNpZmllcyB0aGUgbG9nZ2luZyBsZXZlbCBmb3IgbW9kdWxlcworLy8gICA7IHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IG5hbWVkLiBBbGwgZGVidWdnaW5nIGxldmVscworLy8gICA7IGxpc3RlZCBhYm92ZSB0aGUgc2VsZWN0ZWQgdmFsdWUgYXJlIGVuYWJsZWQuCisvLworLy8gICBkZWZhdWx0X2xldmVsIElORk8KKy8vCisvLyAgIDsgWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZvciBzcGVjaWZpYyBtb2R1bGVzOgorLy8KKy8vICAgRmliTWFuYWdlciBERUJVRworLy8gICBGb3J3YXJkZXIgV0FSTgorLy8gfQorCisgIGlmICghaXNEcnlSdW4pCisgICAgeworICAgICAgQ29uZmlnU2VjdGlvbjo6Y29uc3RfYXNzb2NfaXRlcmF0b3IgaXRlbSA9IHNlY3Rpb24uZmluZCgiZGVmYXVsdF9sZXZlbCIpOworICAgICAgaWYgKGl0ZW0gIT0gc2VjdGlvbi5ub3RfZm91bmQoKSkKKyAgICAgICAgeworICAgICAgICAgIExvZ0xldmVsIGxldmVsID0gZXh0cmFjdExldmVsKGl0ZW0tPnNlY29uZCwgImRlZmF1bHRfbGV2ZWwiKTsKKyAgICAgICAgICBzZXREZWZhdWx0TGV2ZWwobGV2ZWwpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzZXREZWZhdWx0TGV2ZWwoTE9HX0lORk8pOworICAgICAgICB9CisgICAgfQorCisgIGZvciAoQ29uZmlnU2VjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXRlbSA9IHNlY3Rpb24uYmVnaW4oKTsKKyAgICAgICBpdGVtICE9IHNlY3Rpb24uZW5kKCk7CisgICAgICAgKytpdGVtKQorICAgIHsKKyAgICAgIExvZ0xldmVsIGxldmVsID0gZXh0cmFjdExldmVsKGl0ZW0tPnNlY29uZCwgaXRlbS0+Zmlyc3QpOworCisgICAgICBpZiAoaXRlbS0+Zmlyc3QgPT0gImRlZmF1bHRfbGV2ZWwiKQorICAgICAgICB7CisgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBMb2dnZXJNYXA6Oml0ZXJhdG9yIGxvZ2dlckl0ID0gbV9sb2dnZXJzLmZpbmQoaXRlbS0+Zmlyc3QpOworICAgICAgICAgIGlmIChsb2dnZXJJdCA9PSBtX2xvZ2dlcnMuZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE5GRF9MT0dfREVCVUcoIkZhaWxlZCB0byBjb25maWd1cmUgbG9nZ2luZyBsZXZlbCBmb3IgbW9kdWxlIFwiIiA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmZpcnN0IDw8ICJcIiAobW9kdWxlIG5vdCBmb3VuZCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICghaXNEcnlSdW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIHN0ZDo6Y2VyciA8PCAiY2hhbmdpbmcgbGV2ZWwgZm9yIG1vZHVsZSAiIDw8IGl0ZW0tPmZpcnN0IDw8ICIgdG8gIiA8PCBsZXZlbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIGxvZ2dlckl0LT5zZWNvbmQuc2V0TG9nTGV2ZWwobGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkCitMb2dnZXJGYWN0b3J5OjpzZXREZWZhdWx0TGV2ZWwoTG9nTGV2ZWwgbGV2ZWwpCit7CisgIC8vIHN0ZDo6Y2VyciA8PCAiY2hhbmdpbmcgdG8gZGVmYXVsdF9sZXZlbCAiIDw8IGxldmVsIDw8IHN0ZDo6ZW5kbDsKKworICBtX2RlZmF1bHRMZXZlbCA9IGxldmVsOworICBmb3IgKExvZ2dlck1hcDo6aXRlcmF0b3IgaSA9IG1fbG9nZ2Vycy5iZWdpbigpOyBpICE9IG1fbG9nZ2Vycy5lbmQoKTsgKytpKQorICAgIHsKKyAgICAgIC8vIHN0ZDo6Y2VyciA8PCAiY2hhbmdpbmcgIiA8PCBpLT5maXJzdCA8PCAiIHRvIGRlZmF1bHQgIiA8PCBtX2RlZmF1bHRMZXZlbCA8PCBzdGQ6OmVuZGw7CisgICAgICBpLT5zZWNvbmQuc2V0TG9nTGV2ZWwobV9kZWZhdWx0TGV2ZWwpOworICAgIH0KK30KKworTG9nZ2VyJgorTG9nZ2VyRmFjdG9yeTo6Y3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVOYW1lKQoreworICByZXR1cm4gTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5jcmVhdGVMb2dnZXIobW9kdWxlTmFtZSk7Cit9CisKK0xvZ2dlciYKK0xvZ2dlckZhY3Rvcnk6OmNyZWF0ZUxvZ2dlcihjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlTmFtZSkKK3sKKyAgLy8gc3RkOjpjZXJyIDw8ICJjcmVhdGluZyBsb2dnZXIgZm9yICIgPDwgbW9kdWxlTmFtZQorICAvLyAgICAgICAgICAgPDwgIiB3aXRoIGxldmVsICIgPDwgbV9kZWZhdWx0TGV2ZWwgPDwgc3RkOjplbmRsOworCisgIHN0ZDo6cGFpcjxMb2dnZXJNYXA6Oml0ZXJhdG9yLCBib29sPiBsb2dnZXJJdCA9CisgICAgbV9sb2dnZXJzLmluc2VydChOYW1lQW5kTG9nZ2VyKG1vZHVsZU5hbWUsIExvZ2dlcihtb2R1bGVOYW1lLCBtX2RlZmF1bHRMZXZlbCkpKTsKKworICByZXR1cm4gbG9nZ2VySXQuZmlyc3QtPnNlY29uZDsKK30KKworc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPgorTG9nZ2VyRmFjdG9yeTo6Z2V0TW9kdWxlcygpIGNvbnN0Cit7CisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gbW9kdWxlczsKKyAgZm9yIChMb2dnZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2xvZ2dlcnMuYmVnaW4oKTsgaSAhPSBtX2xvZ2dlcnMuZW5kKCk7ICsraSkKKyAgICB7CisgICAgICBtb2R1bGVzLnB1c2hfYmFjayhpLT5maXJzdCk7CisgICAgfQorCisgIHJldHVybiBtb2R1bGVzOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9jb3JlL2xvZ2dlci1mYWN0b3J5LmhwcCBiL05GRC9jb3JlL2xvZ2dlci1mYWN0b3J5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY3NDI0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvbG9nZ2VyLWZhY3RvcnkuaHBwCkBAIC0wLDAgKzEsMTEwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9DT1JFX0xPR0dFUl9GQUNUT1JZX0hQUAorI2RlZmluZSBORkRfQ09SRV9MT0dHRVJfRkFDVE9SWV9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisjaW5jbHVkZSAiY29uZmlnLWZpbGUuaHBwIgorI2luY2x1ZGUgImxvZ2dlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBMb2dnZXJGYWN0b3J5IDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKworICBjbGFzcyBFcnJvciA6IHB1YmxpYyBzdGQ6OnJ1bnRpbWVfZXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpCisgICAgICA6IHN0ZDo6cnVudGltZV9lcnJvcihlcnJvcikKKyAgICB7CisgICAgfQorICB9OworCisgIHN0YXRpYyBMb2dnZXJGYWN0b3J5JgorICBnZXRJbnN0YW5jZSgpOworCisgIHZvaWQKKyAgc2V0Q29uZmlnRmlsZShDb25maWdGaWxlJiBjb25maWcpOworCisgIHZvaWQKKyAgb25Db25maWcoY29uc3QgQ29uZmlnU2VjdGlvbiYgc2VjdGlvbiwgYm9vbCBpc0RyeVJ1biwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+CisgIGdldE1vZHVsZXMoKSBjb25zdDsKKworICBzdGF0aWMgTG9nZ2VyJgorICBjcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZU5hbWUpOworCisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKworICAvLyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkIGR1cmluZyB1bml0LXRlc3RpbmcKKworICBMb2dMZXZlbAorICBnZXREZWZhdWx0TGV2ZWwoKSBjb25zdDsKKworICB2b2lkCisgIHNldERlZmF1bHRMZXZlbChMb2dMZXZlbCBsZXZlbCk7CisKK3ByaXZhdGU6CisKKyAgTG9nZ2VyRmFjdG9yeSgpOworCisgIExvZ2dlciYKKyAgY3JlYXRlTG9nZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVOYW1lKTsKKworICBMb2dMZXZlbAorICBwYXJzZUxldmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBsZXZlbCk7CisKKyAgTG9nTGV2ZWwKKyAgZXh0cmFjdExldmVsKGNvbnN0IENvbmZpZ1NlY3Rpb24mIGl0ZW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOworCitwcml2YXRlOgorCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIExvZ0xldmVsPiBMZXZlbE1hcDsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIExvZ0xldmVsPiBOYW1lQW5kTGV2ZWw7CisKKyAgTGV2ZWxNYXAgbV9sZXZlbE5hbWVzOworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIExvZ2dlcj4gTG9nZ2VyTWFwOworICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgTG9nZ2VyPiBOYW1lQW5kTG9nZ2VyOworCisgIExvZ2dlck1hcCBtX2xvZ2dlcnM7CisKKyAgTG9nTGV2ZWwgbV9kZWZhdWx0TGV2ZWw7Cit9OworCitpbmxpbmUgTG9nTGV2ZWwKK0xvZ2dlckZhY3Rvcnk6OmdldERlZmF1bHRMZXZlbCgpIGNvbnN0Cit7CisgIHJldHVybiBtX2RlZmF1bHRMZXZlbDsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfQ09SRV9MT0dHRVJfRkFDVE9SWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9jb3JlL2xvZ2dlci5jcHAgYi9ORkQvY29yZS9sb2dnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9sb2dnZXIuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJsb2dnZXIuaHBwIgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC90aW1lLmhwcD4KKyNpbmNsdWRlIDxjaW50dHlwZXM+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbmZkIHsKKworTG9nZ2VyOjpMb2dnZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIExvZ0xldmVsIGxldmVsKQorICA6IG1fbW9kdWxlTmFtZShuYW1lKQorICAsIG1fZW5hYmxlZExvZ0xldmVsKGxldmVsKQoreworfQorCitjb25zdCBjaGFyKgorTG9nZ2VyOjpub3coKQoreworICB1c2luZyBuYW1lc3BhY2UgbmRuOjp0aW1lOworCisgIHN0YXRpYyBjb25zdCBtaWNyb3NlY29uZHM6OnJlcCBPTkVfU0VDT05EID0gMTAwMDAwMDsKKyAgbWljcm9zZWNvbmRzOjpyZXAgbWljcm9zZWNvbmRzU2luY2VFcG9jaCA9IGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgIC8vIDEwICh3aG9sZSBzZWNvbmRzKSArICcuJyArIDYgKGZyYWN0aW9uKSArICdcMCcKKyAgc3RhdGljIGNoYXIgYnVmZmVyWzEwICsgMSArIDYgKyAxXTsKKyAgQk9PU1RfQVNTRVJUX01TRyhtaWNyb3NlY29uZHNTaW5jZUVwb2NoIC8gT05FX1NFQ09ORCA8PSA5OTk5OTk5OTk5TCwKKyAgICAgICAgICAgICAgICAgICAid2hvbGUgc2Vjb25kcyBjYW5ub3QgZml0IGluIDEwIGNoYXJhY3RlcnMiKTsKKworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxtaWNyb3NlY29uZHM6OnJlcCwgaW50X2xlYXN0NjRfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJQUklkTEVBU1Q2NCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtaWNyb3NlY29uZHM6OnJlcCIpOworICBzdGQ6OnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlIiBQUklkTEVBU1Q2NCAiLiUwNiIgUFJJZExFQVNUNjQsCisgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzU2luY2VFcG9jaCAvIE9ORV9TRUNPTkQsCisgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzU2luY2VFcG9jaCAlIE9ORV9TRUNPTkQpOworCisgIC8vIEl0J3Mgb2theSB0byByZXR1cm4gYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBidWZmZXIsIGJlY2F1c2UgTG9nZ2VyOjpub3coKSBpcyBpbnZva2VkCisgIC8vIG9ubHkgb25jZSBwZXIgbG9nIG1hY3JvLgorICByZXR1cm4gYnVmZmVyOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9jb3JlL2xvZ2dlci5ocHAgYi9ORkQvY29yZS9sb2dnZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmVlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9sb2dnZXIuaHBwCkBAIC0wLDAgKzEsMTUyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9DT1JFX0xPR0dFUl9IUFAKKyNkZWZpbmUgTkZEX0NPUkVfTE9HR0VSX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKKy8qKiBcYnJpZWYgaW5kaWNhdGVzIGEgbG9nIGxldmVsCisgKiAgXG5vdGUgVGhpcyB0eXBlIGlzIGludGVybmFsLiBMb2dnZXIgc2hvdWxkIGJlIGFjY2Vzc2VkIHRocm91Z2ggTkZEX0xPR18qIG1hY3Jvcy4KKyAqLworZW51bSBMb2dMZXZlbCB7CisgIExPR19OT05FICAgICAgICAgICA9IDAsIC8vIG5vIG1lc3NhZ2VzCisgIExPR19FUlJPUiAgICAgICAgICA9IDEsIC8vIHNlcmlvdXMgZXJyb3IgbWVzc2FnZXMKKyAgTE9HX1dBUk4gICAgICAgICAgID0gMiwgLy8gd2FybmluZyBtZXNzYWdlcworICBMT0dfSU5GTyAgICAgICAgICAgPSAzLCAvLyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgIExPR19ERUJVRyAgICAgICAgICA9IDQsIC8vIGRlYnVnIG1lc3NhZ2VzCisgIExPR19UUkFDRSAgICAgICAgICA9IDUsIC8vIHRyYWNlIG1lc3NhZ2VzIChtb3N0IHZlcmJvc2UpCisgIC8vIExPR19GQVRBTCBpcyBub3QgYSBsZXZlbCBhbmQgaXMgbG9nZ2VkIHVuY29uZGl0aW9uYWxseQorICBMT0dfQUxMICAgICAgICAgICAgPSAyNTUgLy8gYWxsIG1lc3NhZ2VzCit9OworCisvKiogXGJyaWVmIHByb3ZpZGVzIGxvZ2dpbmcgZm9yIGEgbW9kdWxlCisgKiAgXG5vdGUgVGhpcyB0eXBlIGlzIGludGVybmFsLiBMb2dnZXIgc2hvdWxkIGJlIGFjY2Vzc2VkIHRocm91Z2ggTkZEX0xPR18qIG1hY3Jvcy4KKyAqICBcbm90ZSBUaGlzIHR5cGUgaXMgY29weWFibGUgYmVjYXVzZSBsb2dnZXIgY2FuIGJlIGRlY2xhcmVkIGFzIGEgZmllbGQgb2YKKyAqICAgICAgICAodXN1YWxseSB0ZW1wbGF0ZSkgY2xhc3NlcywgYW5kIHNob3VsZG4ndCBwcmV2ZW50IHRob3NlIGNsYXNzZXMgdG8gYmUgY29weWFibGUuCisgKi8KK2NsYXNzIExvZ2dlcgoreworcHVibGljOgorICBMb2dnZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIExvZ0xldmVsIGxldmVsKTsKKworICBib29sCisgIGlzRW5hYmxlZChMb2dMZXZlbCBsZXZlbCkgY29uc3QKKyAgeworICAgIC8vIHN0ZDo6Y2VyciA8PCBtX21vZHVsZU5hbWUgPDwKKyAgICAvLyAgICIgZW5hYmxlZCA9ICIgPDwgbV9lbmFibGVkTG9nTGV2ZWwKKyAgICAvLyAgICAgICAgICAgPDwgIiBsZXZlbCA9ICIgPDwgbGV2ZWwgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAobV9lbmFibGVkTG9nTGV2ZWwgPj0gbGV2ZWwpOworICB9CisKKyAgdm9pZAorICBzZXRMb2dMZXZlbChMb2dMZXZlbCBsZXZlbCkKKyAgeworICAgIG1fZW5hYmxlZExvZ0xldmVsID0gbGV2ZWw7CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYKKyAgZ2V0TmFtZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9tb2R1bGVOYW1lOworICB9CisKKyAgdm9pZAorICBzZXROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICB7CisgICAgbV9tb2R1bGVOYW1lID0gbmFtZTsKKyAgfQorCisgIC8qKiBccmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIHNpbmNlIGVwb2NoOiBzZWNvbmRzLm1pY3Jvc2Vjb25kcworICAgKiAgXHdhcm5pbmcgUmV0dXJuIHZhbHVlIGlzIGluIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgYnVmZmVyLAorICAgKiAgICAgICAgICAgd2hpY2ggc3Vic2VxdWVudCBjYWxscyB3aWxsIG92ZXJ3cml0ZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBjaGFyKgorICBub3coKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbV9tb2R1bGVOYW1lOworICBMb2dMZXZlbCAgICBtX2VuYWJsZWRMb2dMZXZlbDsKK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0cHV0LCBjb25zdCBMb2dnZXImIGxvZ2dlcikKK3sKKyAgb3V0cHV0IDw8IGxvZ2dlci5nZXROYW1lKCk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjaW5jbHVkZSAiY29yZS9sb2dnZXItZmFjdG9yeS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCisjZGVmaW5lIE5GRF9MT0dfSU5JVChuYW1lKSBcCitzdGF0aWMgbmZkOjpMb2dnZXImIGdfbG9nZ2VyID0gbmZkOjpMb2dnZXJGYWN0b3J5OjpjcmVhdGUobmFtZSkKKworI2RlZmluZSBORkRfTE9HX0lOQ0xBU1NfREVDTEFSRSgpIFwKK3N0YXRpYyBuZmQ6OkxvZ2dlciYgZ19sb2dnZXIKKworI2RlZmluZSBORkRfTE9HX0lOQ0xBU1NfREVGSU5FKGNscywgbmFtZSkgXAorbmZkOjpMb2dnZXImIGNsczo6Z19sb2dnZXIgPSBuZmQ6OkxvZ2dlckZhY3Rvcnk6OmNyZWF0ZShuYW1lKQorCisjZGVmaW5lIE5GRF9MT0dfSU5DTEFTU19URU1QTEFURV9ERUZJTkUoY2xzLCBuYW1lKSBcCit0ZW1wbGF0ZTxjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituZmQ6OkxvZ2dlciYgY2xzPFQ+OjpnX2xvZ2dlciA9IG5mZDo6TG9nZ2VyRmFjdG9yeTo6Y3JlYXRlKG5hbWUpCisKKyNkZWZpbmUgTkZEX0xPR19JTkNMQVNTX1RFTVBMQVRFX1NQRUNJQUxJWkFUSU9OX0RFRklORShjbHMsIHNwZWNpYWxpemF0aW9uLCBuYW1lKSBcCit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmZkOjpMb2dnZXImIGNsczxzcGVjaWFsaXphdGlvbj46OmdfbG9nZ2VyID0gbmZkOjpMb2dnZXJGYWN0b3J5OjpjcmVhdGUobmFtZSkKKworI2RlZmluZSBORkRfTE9HX0lOQ0xBU1NfMlRFTVBMQVRFX1NQRUNJQUxJWkFUSU9OX0RFRklORShjbHMsIHMxLCBzMiwgbmFtZSkgXAordGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmZkOjpMb2dnZXImIGNsczxzMSwgczI+OjpnX2xvZ2dlciA9IG5mZDo6TG9nZ2VyRmFjdG9yeTo6Y3JlYXRlKG5hbWUpCisKKworI2RlZmluZSBORkRfTE9HKGxldmVsLCBtc2csIGV4cHJlc3Npb24pICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGdfbG9nZ2VyLmlzRW5hYmxlZCg6Om5mZDo6TE9HXyMjbGV2ZWwpKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZDo6Y2xvZyA8PCA6Om5mZDo6TG9nZ2VyOjpub3coKSA8PCAiICIjbXNnIjogIiAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIDw8ICJbIiA8PCBnX2xvZ2dlciA8PCAiXSAiIDw8IGV4cHJlc3Npb24gPDwgIlxuIjsgIFwKK30gd2hpbGUgKGZhbHNlKQorCisjZGVmaW5lIE5GRF9MT0dfVFJBQ0UoZXhwcmVzc2lvbikgTkZEX0xPRyhUUkFDRSwgVFJBQ0UsICAgZXhwcmVzc2lvbikKKyNkZWZpbmUgTkZEX0xPR19ERUJVRyhleHByZXNzaW9uKSBORkRfTE9HKERFQlVHLCBERUJVRywgICBleHByZXNzaW9uKQorI2RlZmluZSBORkRfTE9HX0lORk8oZXhwcmVzc2lvbikgIE5GRF9MT0coSU5GTywgIElORk8sICAgIGV4cHJlc3Npb24pCisjZGVmaW5lIE5GRF9MT0dfV0FSTihleHByZXNzaW9uKSAgTkZEX0xPRyhXQVJOLCAgV0FSTklORywgZXhwcmVzc2lvbikKKyNkZWZpbmUgTkZEX0xPR19FUlJPUihleHByZXNzaW9uKSBORkRfTE9HKEVSUk9SLCBFUlJPUiwgICBleHByZXNzaW9uKQorCisjZGVmaW5lIE5GRF9MT0dfRkFUQUwoZXhwcmVzc2lvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGQ6OmNsb2cgPDwgOjpuZmQ6OkxvZ2dlcjo6bm93KCkgPDwgIiBGQVRBTDogIiAgICAgICAgICAgICBcCisgICAgICAgICAgICA8PCAiWyIgPDwgZ19sb2dnZXIgPDwgIl0gIiA8PCBleHByZXNzaW9uIDw8ICJcbiI7IFwKK30gd2hpbGUgKGZhbHNlKQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9DT1JFX0xPR0dFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9jb3JlL25ldHdvcmstaW50ZXJmYWNlLmNwcCBiL05GRC9jb3JlL25ldHdvcmstaW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWFkNjNlCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvbmV0d29yay1pbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAibmV0d29yay1pbnRlcmZhY2UuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4gICAvLyBmb3IgaW5ldF9udG9wKCkKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAvLyBmb3Igc3RydWN0IHNvY2thZGRyX2lueyw2fQorI2luY2x1ZGUgPGlmYWRkcnMuaD4gICAgIC8vIGZvciBnZXRpZmFkZHJzKCkKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4gICAgICAgIC8vIGZvciBBUlBIUkRfKiBjb25zdGFudHMKKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+ICAvLyBmb3Igc3RydWN0IHNvY2thZGRyX2xsCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNpbmNsdWRlIDxuZXQvaWZfZGwuaD4gICAgICAgICAvLyBmb3Igc3RydWN0IHNvY2thZGRyX2RsCisjaW5jbHVkZSA8bmV0L2lmX3R5cGVzLmg+ICAgICAgLy8gZm9yIElGVF8qIGNvbnN0YW50cworI2VuZGlmCisKK05GRF9MT0dfSU5JVCgiTmV0d29ya0ludGVyZmFjZUluZm8iKTsKKworbmFtZXNwYWNlIG5mZCB7CisKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8TmV0d29ya0ludGVyZmFjZUluZm8+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIk5ldHdvcmtJbnRlcmZhY2VJbmZvIG11c3QgYmUgYSBzdGFuZGFyZCBsYXlvdXQgdHlwZSIpOworI2lmZGVmIEhBVkVfSVNfREVGQVVMVF9DT05TVFJVQ1RJQkxFCitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPE5ldHdvcmtJbnRlcmZhY2VJbmZvPjo6dmFsdWUsCisgICAgICAgICAgICAgICJOZXR3b3JrSW50ZXJmYWNlSW5mbyBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIik7CisjZW5kaWYKKworI2lmZGVmIFdJVEhfVEVTVFMKK3N0YXRpYyBzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPE5ldHdvcmtJbnRlcmZhY2VJbmZvPj4gc19kZWJ1Z05ldHdvcmtJbnRlcmZhY2VzID0gbnVsbHB0cjsKKwordm9pZAorc2V0RGVidWdOZXR3b3JrSW50ZXJmYWNlcyhzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPE5ldHdvcmtJbnRlcmZhY2VJbmZvPj4gaW50ZXJmYWNlcykKK3sKKyAgc19kZWJ1Z05ldHdvcmtJbnRlcmZhY2VzID0gaW50ZXJmYWNlczsKK30KKyNlbmRpZgorCitzdGQ6OnZlY3RvcjxOZXR3b3JrSW50ZXJmYWNlSW5mbz4KK2xpc3ROZXR3b3JrSW50ZXJmYWNlcygpCit7CisjaWZkZWYgV0lUSF9URVNUUworICBpZiAoc19kZWJ1Z05ldHdvcmtJbnRlcmZhY2VzICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gKnNfZGVidWdOZXR3b3JrSW50ZXJmYWNlczsKKyAgfQorI2VuZGlmCisKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOjppcDsKKyAgdXNpbmcgc3RkOjpzdHJlcnJvcjsKKworICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIE5ldHdvcmtJbnRlcmZhY2VJbmZvPiBpZm1hcDsKKyAgaWZhZGRycyogaWZhX2xpc3QgPSBudWxscHRyOworCisgIGlmICg6OmdldGlmYWRkcnMoJmlmYV9saXN0KSA8IDApCisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHN0ZDo6c3RyaW5nKCJnZXRpZmFkZHJzKCkgZmFpbGVkOiAiKSArIHN0cmVycm9yKGVycm5vKSk7CisKKyAgZm9yIChpZmFkZHJzKiBpZmEgPSBpZmFfbGlzdDsgaWZhICE9IG51bGxwdHI7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKKyAgICBzdGQ6OnN0cmluZyBpZm5hbWUoaWZhLT5pZmFfbmFtZSk7CisgICAgTmV0d29ya0ludGVyZmFjZUluZm8mIG5ldGlmID0gaWZtYXBbaWZuYW1lXTsKKyAgICBuZXRpZi5uYW1lID0gaWZhLT5pZmFfbmFtZTsKKyAgICBuZXRpZi5mbGFncyA9IGlmYS0+aWZhX2ZsYWdzOworCisgICAgaWYgKGlmYS0+aWZhX2FkZHIgPT0gbnVsbHB0cikKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3dpdGNoIChpZmEtPmlmYV9hZGRyLT5zYV9mYW1pbHkpIHsKKworICAgIGNhc2UgQUZfSU5FVDogeworICAgICAgY29uc3Qgc29ja2FkZHJfaW4qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfaW4qPihpZmEtPmlmYV9hZGRyKTsKKyAgICAgIGNoYXIgYWRkcmVzc1tJTkVUX0FERFJTVFJMRU5dOworICAgICAgaWYgKDo6aW5ldF9udG9wKEFGX0lORVQsICZzaW4tPnNpbl9hZGRyLCBhZGRyZXNzLCBzaXplb2YoYWRkcmVzcykpKSB7CisgICAgICAgIG5ldGlmLmlwdjRBZGRyZXNzZXMucHVzaF9iYWNrKGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKGFkZHJlc3MpKTsKKyAgICAgICAgTkZEX0xPR19UUkFDRShpZm5hbWUgPDwgIjogYWRkZWQgSVB2NCBhZGRyZXNzICIgPDwgYWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIE5GRF9MT0dfV0FSTihpZm5hbWUgPDwgIjogaW5ldF9udG9wKEFGX0lORVQpIGZhaWxlZDogIiA8PCBzdHJlcnJvcihlcnJubykpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBBRl9JTkVUNjogeworICAgICAgY29uc3Qgc29ja2FkZHJfaW42KiBzaW42ID0gcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcl9pbjYqPihpZmEtPmlmYV9hZGRyKTsKKyAgICAgIGNoYXIgYWRkcmVzc1tJTkVUNl9BRERSU1RSTEVOXTsKKyAgICAgIGlmICg6OmluZXRfbnRvcChBRl9JTkVUNiwgJnNpbjYtPnNpbjZfYWRkciwgYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpKSkgeworICAgICAgICBuZXRpZi5pcHY2QWRkcmVzc2VzLnB1c2hfYmFjayhhZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZyhhZGRyZXNzKSk7CisgICAgICAgIE5GRF9MT0dfVFJBQ0UoaWZuYW1lIDw8ICI6IGFkZGVkIElQdjYgYWRkcmVzcyAiIDw8IGFkZHJlc3MpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBORkRfTE9HX1dBUk4oaWZuYW1lIDw8ICI6IGluZXRfbnRvcChBRl9JTkVUNikgZmFpbGVkOiAiIDw8IHN0cmVycm9yKGVycm5vKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICBjYXNlIEFGX1BBQ0tFVDogeworICAgICAgY29uc3Qgc29ja2FkZHJfbGwqIHNsbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfbGwqPihpZmEtPmlmYV9hZGRyKTsKKyAgICAgIG5ldGlmLmluZGV4ID0gc2xsLT5zbGxfaWZpbmRleDsKKyAgICAgIGlmIChzbGwtPnNsbF9oYXR5cGUgPT0gQVJQSFJEX0VUSEVSICYmIHNsbC0+c2xsX2hhbGVuID09IGV0aGVybmV0OjpBRERSX0xFTikgeworICAgICAgICBuZXRpZi5ldGhlckFkZHJlc3MgPSBldGhlcm5ldDo6QWRkcmVzcyhzbGwtPnNsbF9hZGRyKTsKKyAgICAgICAgTkZEX0xPR19UUkFDRShpZm5hbWUgPDwgIjogYWRkZWQgRXRoZXJuZXQgYWRkcmVzcyAiIDw8IG5ldGlmLmV0aGVyQWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzbGwtPnNsbF9oYXR5cGUgIT0gQVJQSFJEX0xPT1BCQUNLKSB7CisgICAgICAgIE5GRF9MT0dfREVCVUcoaWZuYW1lIDw8ICI6IGlnbm9yaW5nIGxpbmstbGF5ZXIgYWRkcmVzcyBmb3IgdW5oYW5kbGVkIGhhcmR3YXJlIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHNsbC0+c2xsX2hhdHlwZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorICAgIGNhc2UgQUZfTElOSzogeworICAgICAgY29uc3Qgc29ja2FkZHJfZGwqIHNkbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfZGwqPihpZmEtPmlmYV9hZGRyKTsKKyAgICAgIG5ldGlmLmluZGV4ID0gc2RsLT5zZGxfaW5kZXg7CisgICAgICBpZiAoc2RsLT5zZGxfdHlwZSA9PSBJRlRfRVRIRVIgJiYgc2RsLT5zZGxfYWxlbiA9PSBldGhlcm5ldDo6QUREUl9MRU4pIHsKKyAgICAgICAgbmV0aWYuZXRoZXJBZGRyZXNzID0gZXRoZXJuZXQ6OkFkZHJlc3MocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oTExBRERSKHNkbCkpKTsKKyAgICAgICAgTkZEX0xPR19UUkFDRShpZm5hbWUgPDwgIjogYWRkZWQgRXRoZXJuZXQgYWRkcmVzcyAiIDw8IG5ldGlmLmV0aGVyQWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzZGwtPnNkbF90eXBlICE9IElGVF9MT09QKSB7CisgICAgICAgIE5GRF9MT0dfREVCVUcoaWZuYW1lIDw8ICI6IGlnbm9yaW5nIGxpbmstbGF5ZXIgYWRkcmVzcyBmb3IgdW5oYW5kbGVkIGludGVyZmFjZSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBzZGwtPnNkbF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIGlmIChuZXRpZi5pc0Jyb2FkY2FzdENhcGFibGUoKSAmJiBpZmEtPmlmYV9icm9hZGFkZHIgIT0gbnVsbHB0cikgeworICAgICAgY29uc3Qgc29ja2FkZHJfaW4qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfaW4qPihpZmEtPmlmYV9icm9hZGFkZHIpOworICAgICAgY2hhciBhZGRyZXNzW0lORVRfQUREUlNUUkxFTl07CisgICAgICBpZiAoOjppbmV0X250b3AoQUZfSU5FVCwgJnNpbi0+c2luX2FkZHIsIGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSkpIHsKKyAgICAgICAgbmV0aWYuYnJvYWRjYXN0QWRkcmVzcyA9IGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKGFkZHJlc3MpOworICAgICAgICBORkRfTE9HX1RSQUNFKGlmbmFtZSA8PCAiOiBhZGRlZCBJUHY0IGJyb2FkY2FzdCBhZGRyZXNzICIgPDwgYWRkcmVzcyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIE5GRF9MT0dfV0FSTihpZm5hbWUgPDwgIjogaW5ldF9udG9wKEFGX0lORVQpIGZvciBicm9hZGFkZHIgZmFpbGVkOiAiIDw8IHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorICB9CisKKyAgOjpmcmVlaWZhZGRycyhpZmFfbGlzdCk7CisKKyAgc3RkOjp2ZWN0b3I8TmV0d29ya0ludGVyZmFjZUluZm8+IHY7CisgIHYucmVzZXJ2ZShpZm1hcC5zaXplKCkpOworICBmb3IgKGF1dG8mJiBlbGVtZW50IDogaWZtYXApIHsKKyAgICB2LnB1c2hfYmFjayhlbGVtZW50LnNlY29uZCk7CisgIH0KKworICByZXR1cm4gdjsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvY29yZS9uZXR3b3JrLWludGVyZmFjZS5ocHAgYi9ORkQvY29yZS9uZXR3b3JrLWludGVyZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzNDA1MgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb3JlL25ldHdvcmstaW50ZXJmYWNlLmhwcApAQCAtMCwwICsxLDEwNyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfQ09SRV9ORVRXT1JLX0lOVEVSRkFDRV9IUFAKKyNkZWZpbmUgTkZEX0NPUkVfTkVUV09SS19JTlRFUkZBQ0VfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2V0aGVybmV0LmhwcD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorCituYW1lc3BhY2UgbmZkIHsKKworbmFtZXNwYWNlIGV0aGVybmV0ID0gbmRuOjp1dGlsOjpldGhlcm5ldDsKKworLyoqIFxicmllZiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIG5ldHdvcmsgaW50ZXJmYWNlCisgKi8KK2NsYXNzIE5ldHdvcmtJbnRlcmZhY2VJbmZvCit7CitwdWJsaWM6CisKKyAgaW50IGluZGV4OworICBzdGQ6OnN0cmluZyBuYW1lOworICBldGhlcm5ldDo6QWRkcmVzcyBldGhlckFkZHJlc3M7CisgIHN0ZDo6dmVjdG9yPGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzc192ND4gaXB2NEFkZHJlc3NlczsKKyAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OmFzaW86OmlwOjphZGRyZXNzX3Y2PiBpcHY2QWRkcmVzc2VzOworICBib29zdDo6YXNpbzo6aXA6OmFkZHJlc3NfdjQgYnJvYWRjYXN0QWRkcmVzczsKKyAgdW5zaWduZWQgaW50IGZsYWdzOworCisgIGJvb2wKKyAgaXNMb29wYmFjaygpIGNvbnN0OworCisgIGJvb2wKKyAgaXNNdWx0aWNhc3RDYXBhYmxlKCkgY29uc3Q7CisKKyAgYm9vbAorICBpc0Jyb2FkY2FzdENhcGFibGUoKSBjb25zdDsKKworICBib29sCisgIGlzVXAoKSBjb25zdDsKKworfTsKKworaW5saW5lIGJvb2wKK05ldHdvcmtJbnRlcmZhY2VJbmZvOjppc0xvb3BiYWNrKCkgY29uc3QKK3sKKyAgcmV0dXJuIChmbGFncyAmIElGRl9MT09QQkFDSykgIT0gMDsKK30KKworaW5saW5lIGJvb2wKK05ldHdvcmtJbnRlcmZhY2VJbmZvOjppc011bHRpY2FzdENhcGFibGUoKSBjb25zdAoreworICByZXR1cm4gKGZsYWdzICYgSUZGX01VTFRJQ0FTVCkgIT0gMDsKK30KKworaW5saW5lIGJvb2wKK05ldHdvcmtJbnRlcmZhY2VJbmZvOjppc0Jyb2FkY2FzdENhcGFibGUoKSBjb25zdAoreworICByZXR1cm4gKGZsYWdzICYgSUZGX0JST0FEQ0FTVCkgIT0gMDsKK30KKworaW5saW5lIGJvb2wKK05ldHdvcmtJbnRlcmZhY2VJbmZvOjppc1VwKCkgY29uc3QKK3sKKyAgcmV0dXJuIChmbGFncyAmIElGRl9VUCkgIT0gMDsKK30KKworLyoqIFxicmllZiBMaXN0IGNvbmZpZ3VyZWQgbmV0d29yayBpbnRlcmZhY2VzIG9uIHRoZSBzeXN0ZW0gYW5kIHRoZWlyIGluZm8KKyAqICBcd2FybmluZyBpbnZhbGlkIElQIGFkZHJlc3NlcyAoZS5nLiwgMC4wLjAuMCkgbWF5IGJlIHJldHVybmVkIGluIHNvbWUgZW52aXJvbm1lbnRzCisgKi8KK3N0ZDo6dmVjdG9yPE5ldHdvcmtJbnRlcmZhY2VJbmZvPgorbGlzdE5ldHdvcmtJbnRlcmZhY2VzKCk7CisKKyNpZmRlZiBXSVRIX1RFU1RTCisvKiogXGJyaWVmIFNldCBhIGxpc3Qgb2YgbmV0d29yayBpbnRlcmZhY2VzIHRvIGJlIHJldHVybmVkIGJ5IHN1YnNlcXVlbnQgbGlzdE5ldHdvcmtJbnRlcmZhY2VzIGNhbGwKKyAqICBcbm90ZSBUbyByZXNldCB0byBub3JtYWwgYmVoYXZpb3IsIHVzZSBgc2V0RGVidWdOZXR3b3JrSW50ZXJmYWNlcyhudWxscHRyKTtgCisgKi8KK3ZvaWQKK3NldERlYnVnTmV0d29ya0ludGVyZmFjZXMoc2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxOZXR3b3JrSW50ZXJmYWNlSW5mbz4+IGludGVyZmFjZXMpOworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0NPUkVfTkVUV09SS19JTlRFUkZBQ0VfSFBQCmRpZmYgLS1naXQgYS9ORkQvY29yZS9uZXR3b3JrLmNwcCBiL05GRC9jb3JlL25ldHdvcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YTZjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9uZXR3b3JrLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJuZXR3b3JrLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK3ZvaWQKK05ldHdvcms6OnByaW50KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0Cit7CisgIG9zIDw8IG1fbWluQWRkcmVzcyA8PCAiIDwtPiAiIDw8IG1fbWF4QWRkcmVzczsKK30KKworY29uc3QgTmV0d29yayYKK05ldHdvcms6OmdldE1heFJhbmdlVjQoKQoreworICB1c2luZyBib29zdDo6YXNpbzo6aXA6OmFkZHJlc3NfdjQ7CisgIHN0YXRpYyBOZXR3b3JrIHJhbmdlID0gTmV0d29yayhhZGRyZXNzX3Y0KDApLCBhZGRyZXNzX3Y0KDB4RkZGRkZGRkYpKTsKKyAgcmV0dXJuIHJhbmdlOworfQorCitjb25zdCBOZXR3b3JrJgorTmV0d29yazo6Z2V0TWF4UmFuZ2VWNigpCit7CisgIHVzaW5nIGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzc192NjsKKyAgc3RhdGljIGFkZHJlc3NfdjY6OmJ5dGVzX3R5cGUgbWF4VjYgPSB7ezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfX07CisgIHN0YXRpYyBOZXR3b3JrIHJhbmdlID0gTmV0d29yayhhZGRyZXNzX3Y2KCksIGFkZHJlc3NfdjYobWF4VjYpKTsKKyAgcmV0dXJuIHJhbmdlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0ZDo6b3N0cmVhbSYKK29wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTmV0d29yayYgbmV0d29yaykKK3sKKyAgbmV0d29yay5wcmludChvcyk7CisgIHJldHVybiBvczsKK30KKworc3RkOjppc3RyZWFtJgorb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0mIGlzLCBOZXR3b3JrJiBuZXR3b3JrKQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmFzaW87CisKKyAgc3RkOjpzdHJpbmcgbmV0d29ya1N0cjsKKyAgaXMgPj4gbmV0d29ya1N0cjsKKworICBzaXplX3QgcG9zaXRpb24gPSBuZXR3b3JrU3RyLmZpbmQoJy8nKTsKKyAgaWYgKHBvc2l0aW9uID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgIG5ldHdvcmsubV9taW5BZGRyZXNzID0gaXA6OmFkZHJlc3M6OmZyb21fc3RyaW5nKG5ldHdvcmtTdHIpOworICAgICAgbmV0d29yay5tX21heEFkZHJlc3MgPSBpcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcobmV0d29ya1N0cik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaXA6OmFkZHJlc3MgYWRkcmVzcyA9IGlwOjphZGRyZXNzOjpmcm9tX3N0cmluZyhuZXR3b3JrU3RyLnN1YnN0cigwLCBwb3NpdGlvbikpOworICAgICAgc2l6ZV90IG1hc2sgPSBib29zdDo6bGV4aWNhbF9jYXN0PHNpemVfdD4obmV0d29ya1N0ci5zdWJzdHIocG9zaXRpb24rMSkpOworCisgICAgICBpZiAoYWRkcmVzcy5pc192NCgpKQorICAgICAgICB7CisgICAgICAgICAgaXA6OmFkZHJlc3NfdjQ6OmJ5dGVzX3R5cGUgbWFza0J5dGVzID0gYm9vc3Q6OmluaXRpYWxpemVkX3ZhbHVlOworICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWFzazsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzaXplX3QgYnl0ZUlkID0gaSAvIDg7CisgICAgICAgICAgICAgIHNpemVfdCBiaXRJbmRleCA9IDcgLSBpICUgODsKKyAgICAgICAgICAgICAgbWFza0J5dGVzW2J5dGVJZF0gfD0gKDEgPDwgYml0SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaXA6OmFkZHJlc3NfdjQ6OmJ5dGVzX3R5cGUgYWRkcmVzc0J5dGVzID0gYWRkcmVzcy50b192NCgpLnRvX2J5dGVzKCk7CisgICAgICAgICAgaXA6OmFkZHJlc3NfdjQ6OmJ5dGVzX3R5cGUgbWluOworICAgICAgICAgIGlwOjphZGRyZXNzX3Y0OjpieXRlc190eXBlIG1heDsKKworICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWRkcmVzc0J5dGVzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtaW5baV0gPSBhZGRyZXNzQnl0ZXNbaV0gJiBtYXNrQnl0ZXNbaV07CisgICAgICAgICAgICAgIG1heFtpXSA9IGFkZHJlc3NCeXRlc1tpXSB8IH4obWFza0J5dGVzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIG5ldHdvcmsubV9taW5BZGRyZXNzID0gaXA6OmFkZHJlc3NfdjQobWluKTsKKyAgICAgICAgICBuZXR3b3JrLm1fbWF4QWRkcmVzcyA9IGlwOjphZGRyZXNzX3Y0KG1heCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlwOjphZGRyZXNzX3Y2OjpieXRlc190eXBlIG1hc2tCeXRlcyA9IGJvb3N0Ojppbml0aWFsaXplZF92YWx1ZTsKKyAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hc2s7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVJZCA9IGkgLyA4OworICAgICAgICAgICAgICBzaXplX3QgYml0SW5kZXggPSA3IC0gaSAlIDg7CisgICAgICAgICAgICAgIG1hc2tCeXRlc1tieXRlSWRdIHw9ICgxIDw8IGJpdEluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlwOjphZGRyZXNzX3Y2OjpieXRlc190eXBlIGFkZHJlc3NCeXRlcyA9IGFkZHJlc3MudG9fdjYoKS50b19ieXRlcygpOworICAgICAgICAgIGlwOjphZGRyZXNzX3Y2OjpieXRlc190eXBlIG1pbjsKKyAgICAgICAgICBpcDo6YWRkcmVzc192Njo6Ynl0ZXNfdHlwZSBtYXg7CisKKyAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFkZHJlc3NCeXRlcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWluW2ldID0gYWRkcmVzc0J5dGVzW2ldICYgbWFza0J5dGVzW2ldOworICAgICAgICAgICAgICBtYXhbaV0gPSBhZGRyZXNzQnl0ZXNbaV0gfCB+KG1hc2tCeXRlc1tpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBuZXR3b3JrLm1fbWluQWRkcmVzcyA9IGlwOjphZGRyZXNzX3Y2KG1pbik7CisgICAgICAgICAgbmV0d29yay5tX21heEFkZHJlc3MgPSBpcDo6YWRkcmVzc192NihtYXgpOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gaXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2NvcmUvbmV0d29yay5ocHAgYi9ORkQvY29yZS9uZXR3b3JrLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBmNmQzCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvbmV0d29yay5ocHAKQEAgLTAsMCArMSw5NSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0NPUkVfTkVUV09SS19IUFAKKyNkZWZpbmUgTkZEX0NPUkVfTkVUV09SS19IUFAKKworI2luY2x1ZGUgPGJvb3N0L2FzaW8uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK2NsYXNzIE5ldHdvcmsKK3sKK3B1YmxpYzoKKyAgTmV0d29yaygpCisgIHsKKyAgfQorCisgIE5ldHdvcmsoY29uc3QgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzJiBtaW5BZGRyZXNzLAorICAgICAgICAgIGNvbnN0IGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzcyYgbWF4QWRkcmVzcykKKyAgICA6IG1fbWluQWRkcmVzcyhtaW5BZGRyZXNzKQorICAgICwgbV9tYXhBZGRyZXNzKG1heEFkZHJlc3MpCisgIHsKKyAgfQorCisgIHZvaWQKKyAgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Q7CisKKyAgYm9vbAorICBkb2VzQ29udGFpbihjb25zdCBib29zdDo6YXNpbzo6aXA6OmFkZHJlc3MmIGFkZHJlc3MpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKG1fbWluQWRkcmVzcyA8PSBhZGRyZXNzICYmIGFkZHJlc3MgPD0gbV9tYXhBZGRyZXNzKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBOZXR3b3JrJgorICBnZXRNYXhSYW5nZVY0KCk7CisKKyAgc3RhdGljIGNvbnN0IE5ldHdvcmsmCisgIGdldE1heFJhbmdlVjYoKTsKKworICBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgTmV0d29yayYgcmhzKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fbWluQWRkcmVzcyA9PSByaHMubV9taW5BZGRyZXNzICYmIG1fbWF4QWRkcmVzcyA9PSByaHMubV9tYXhBZGRyZXNzOworICB9CisKKyAgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IE5ldHdvcmsmIHJocykgY29uc3QKKyAgeworICAgIHJldHVybiAhKCp0aGlzID09IHJocyk7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzIG1fbWluQWRkcmVzczsKKyAgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzIG1fbWF4QWRkcmVzczsKKworICBmcmllbmQgc3RkOjppc3RyZWFtJgorICBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYgaXMsIE5ldHdvcmsmIG5ldHdvcmspOworCisgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mCisgIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTmV0d29yayYgbmV0d29yayk7Cit9OworCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE5ldHdvcmsmIG5ldHdvcmspOworCitzdGQ6OmlzdHJlYW0mCitvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYgaXMsIE5ldHdvcmsmIG5ldHdvcmspOworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9DT1JFX05FVFdPUktfSFBQCmRpZmYgLS1naXQgYS9ORkQvY29yZS9ub3RpZmljYXRpb24tc3RyZWFtLmhwcCBiL05GRC9jb3JlL25vdGlmaWNhdGlvbi1zdHJlYW0uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODliNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9ub3RpZmljYXRpb24tc3RyZWFtLmhwcApAQCAtMCwwICsxLDgxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9DT1JFX05PVElGSUNBVElPTl9TVFJFQU1fSFBQCisjZGVmaW5lIE5GRF9DT1JFX05PVElGSUNBVElPTl9TVFJFQU1fSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9lbmNvZGluZy9lbmNvZGluZy1idWZmZXIuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkva2V5LWNoYWluLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKKy8qKiBcYnJpZWYgcHJvdmlkZXMgYSBwdWJsaXNoZXIgb2YgTm90aWZpY2F0aW9uIFN0cmVhbQorICogIFxzYSBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9Ob3RpZmljYXRpb24KKyAqLwordGVtcGxhdGUgPGNsYXNzIEZhY2VCYXNlPgorY2xhc3MgTm90aWZpY2F0aW9uU3RyZWFtIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgTm90aWZpY2F0aW9uU3RyZWFtKEZhY2VCYXNlJiBmYWNlLCBjb25zdCBOYW1lJiBwcmVmaXgsIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKQorICAgIDogbV9mYWNlKGZhY2UpCisgICAgLCBtX3ByZWZpeChwcmVmaXgpCisgICAgLCBtX2tleUNoYWluKGtleUNoYWluKQorICAgICwgbV9zZXF1ZW5jZU5vKDApCisgIHsKKyAgfQorCisgIHZpcnR1YWwKKyAgfk5vdGlmaWNhdGlvblN0cmVhbSgpCisgIHsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQKKyAgcG9zdE5vdGlmaWNhdGlvbihjb25zdCBUJiBub3RpZmljYXRpb24pCisgIHsKKyAgICBOYW1lIGRhdGFOYW1lID0gbV9wcmVmaXg7CisgICAgZGF0YU5hbWUuYXBwZW5kU2VxdWVuY2VOdW1iZXIobV9zZXF1ZW5jZU5vKTsKKworICAgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2Vfc2hhcmVkPERhdGE+KGRhdGFOYW1lKTsKKyAgICBkYXRhLT5zZXRDb250ZW50KG5vdGlmaWNhdGlvbi53aXJlRW5jb2RlKCkpOworICAgIGRhdGEtPnNldEZyZXNobmVzc1BlcmlvZCh0aW1lOjpzZWNvbmRzKDEpKTsKKworICAgIG1fa2V5Q2hhaW4uc2lnbigqZGF0YSk7CisgICAgbV9mYWNlLnB1dCgqZGF0YSk7CisKKyAgICArK21fc2VxdWVuY2VObzsKKyAgfQorCitwcml2YXRlOgorICBGYWNlQmFzZSYgbV9mYWNlOworICBjb25zdCBOYW1lIG1fcHJlZml4OworICBuZG46OktleUNoYWluJiBtX2tleUNoYWluOworICB1aW50NjRfdCBtX3NlcXVlbmNlTm87Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9DT1JFX05PVElGSUNBVElPTl9TVFJFQU1fSFBQCmRpZmYgLS1naXQgYS9ORkQvY29yZS9wcml2aWxlZ2UtaGVscGVyLmNwcCBiL05GRC9jb3JlL3ByaXZpbGVnZS1oZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODdmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9wcml2aWxlZ2UtaGVscGVyLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgInByaXZpbGVnZS1oZWxwZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGdycC5oPgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJQcml2aWxlZ2VIZWxwZXIiKTsKKwordWlkX3QgUHJpdmlsZWdlSGVscGVyOjpzX25vcm1hbFVpZCA9IDo6Z2V0ZXVpZCgpOworZ2lkX3QgUHJpdmlsZWdlSGVscGVyOjpzX25vcm1hbEdpZCA9IDo6Z2V0ZWdpZCgpOworCit1aWRfdCBQcml2aWxlZ2VIZWxwZXI6OnNfcHJpdmlsZWdlZFVpZCA9IDo6Z2V0ZXVpZCgpOworZ2lkX3QgUHJpdmlsZWdlSGVscGVyOjpzX3ByaXZpbGVnZWRHaWQgPSA6OmdldGVnaWQoKTsKKwordm9pZAorUHJpdmlsZWdlSGVscGVyOjppbml0aWFsaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGdyb3VwTmFtZSkKK3sKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBNQVhfR1JPVVBfQlVGRkVSX1NJWkUgPSAxNjM4NDsgLy8gMTZrQgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9QQVNTV0RfQlVGRkVSX1NJWkUgPSAxNjM4NDsKKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZBTExCQUNLX0dST1VQX0JVRkZFUl9TSVpFID0gMTAyNDsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBGQUxMQkFDS19QQVNTV0RfQlVGRkVSX1NJWkUgPSAxMDI0OworCisgIE5GRF9MT0dfVFJBQ0UoImluaXRpYWxpemluZyBwcml2aWxlZ2UgaGVscGVyIHdpdGggdXNlciBcIiIgPDwgdXNlck5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgIDw8ICIgZ3JvdXAgXCIiIDw8IGdyb3VwTmFtZSA8PCAiXCIiKTsKKworICAvLyB3b3JrZmxvdyBmcm9tIG1hbiBnZXRwd25hbV9yCisKKyAgaWYgKCFncm91cE5hbWUuZW1wdHkoKSkKKyAgICB7CisgICAgICBzdGF0aWMgaW50IGdyb3VwU2l6ZSA9IDo6c3lzY29uZihfU0NfR0VUR1JfUl9TSVpFX01BWCk7CisKKyAgICAgIGlmIChncm91cFNpemUgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBncm91cFNpemUgPSBGQUxMQkFDS19HUk9VUF9CVUZGRVJfU0laRTsKKyAgICAgICAgfQorCisgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBncm91cEJ1ZmZlcihncm91cFNpemUpOworICAgICAgc3RydWN0IGdyb3VwIGdyb3VwOworICAgICAgc3RydWN0IGdyb3VwKiBncm91cFJlc3VsdCA9IDA7CisKKyAgICAgIGludCBlcnJvckNvZGUgPSBnZXRncm5hbV9yKGdyb3VwTmFtZS5jX3N0cigpLCAmZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JvdXBCdWZmZXJbMF0sIGdyb3VwU2l6ZSwgJmdyb3VwUmVzdWx0KTsKKworICAgICAgd2hpbGUgKGVycm9yQ29kZSA9PSBFUkFOR0UpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZ3JvdXBCdWZmZXIuc2l6ZSgpICogMiA+IE1BWF9HUk9VUF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhyb3cgUHJpdmlsZWdlSGVscGVyOjpFcnJvcigiQ2Fubm90IGFsbG9jYXRlIGxhcmdlIGVub3VnaCBidWZmZXIgZm9yIHN0cnVjdCBncm91cCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZ3JvdXBCdWZmZXIucmVzaXplKGdyb3VwQnVmZmVyLnNpemUoKSAqIDIpOworCisgICAgICAgICAgZXJyb3JDb2RlID0gZ2V0Z3JuYW1fcihncm91cE5hbWUuY19zdHIoKSwgJmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwQnVmZmVyWzBdLCBncm91cEJ1ZmZlci5zaXplKCksICZncm91cFJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgaWYgKGVycm9yQ29kZSAhPSAwIHx8ICFncm91cFJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IFByaXZpbGVnZUhlbHBlcjo6RXJyb3IoIkZhaWxlZCB0byBnZXQgZ2lkIGZvciBcIiIgKyBncm91cE5hbWUgKyAiXCIiKTsKKyAgICAgICAgfQorCisgICAgICBzX25vcm1hbEdpZCA9IGdyb3VwLmdyX2dpZDsKKyAgICB9CisKKyAgaWYgKCF1c2VyTmFtZS5lbXB0eSgpKQorICAgIHsKKyAgICAgIHN0YXRpYyBpbnQgcGFzc3dkU2l6ZSA9IDo6c3lzY29uZihfU0NfR0VUUFdfUl9TSVpFX01BWCk7CisKKyAgICAgIGlmIChwYXNzd2RTaXplID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgcGFzc3dkU2l6ZSA9IEZBTExCQUNLX1BBU1NXRF9CVUZGRVJfU0laRTsKKyAgICAgICAgfQorCisgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBwYXNzd2RCdWZmZXIocGFzc3dkU2l6ZSk7CisgICAgICBzdHJ1Y3QgcGFzc3dkIHBhc3N3ZDsKKyAgICAgIHN0cnVjdCBwYXNzd2QqIHBhc3N3ZFJlc3VsdCA9IDA7CisKKyAgICAgIGludCBlcnJvckNvZGUgPQorICAgICAgICBnZXRwd25hbV9yKHVzZXJOYW1lLmNfc3RyKCksICZwYXNzd2QsCisgICAgICAgICAgICAgICAgICAgJnBhc3N3ZEJ1ZmZlclswXSwgcGFzc3dkQnVmZmVyLnNpemUoKSwgJnBhc3N3ZFJlc3VsdCk7CisKKyAgICAgIHdoaWxlIChlcnJvckNvZGUgPT0gRVJBTkdFKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHBhc3N3ZEJ1ZmZlci5zaXplKCkgKiAyID4gTUFYX1BBU1NXRF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhyb3cgUHJpdmlsZWdlSGVscGVyOjpFcnJvcigiQ2Fubm90IGFsbG9jYXRlIGxhcmdlIGVub3VnaCBidWZmZXIgZm9yIHN0cnVjdCBwYXNzd2QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHBhc3N3ZEJ1ZmZlci5yZXNpemUocGFzc3dkQnVmZmVyLnNpemUoKSAqIDIpOworCisgICAgICAgICAgZXJyb3JDb2RlID0gZ2V0cHduYW1fcih1c2VyTmFtZS5jX3N0cigpLCAmcGFzc3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhc3N3ZEJ1ZmZlclswXSwgcGFzc3dkQnVmZmVyLnNpemUoKSwgJnBhc3N3ZFJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgaWYgKGVycm9yQ29kZSAhPSAwIHx8ICFwYXNzd2RSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBQcml2aWxlZ2VIZWxwZXI6OkVycm9yKCJGYWlsZWQgdG8gZ2V0IHVpZCBmb3IgXCIiICsgdXNlck5hbWUgKyAiXCIiKTsKKyAgICAgICAgfQorCisgICAgICBzX25vcm1hbFVpZCA9IHBhc3N3ZC5wd191aWQ7CisgICAgfQorfQorCit2b2lkCitQcml2aWxlZ2VIZWxwZXI6OmRyb3AoKQoreworICBORkRfTE9HX1RSQUNFKCJkcm9wcGluZyB0byBlZmZlY3RpdmUgZ2lkPSIgPDwgc19ub3JtYWxHaWQpOworICBpZiAoOjpzZXRlZ2lkKHNfbm9ybWFsR2lkKSAhPSAwKQorICAgIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yOworICAgICAgZXJyb3IgPDwgIkZhaWxlZCB0byBkcm9wIHRvIGVmZmVjdGl2ZSBnaWQ9IiA8PCBzX25vcm1hbEdpZDsKKworICAgICAgdGhyb3cgUHJpdmlsZWdlSGVscGVyOjpFcnJvcihlcnJvci5zdHIoKSk7CisgICAgfQorCisgIE5GRF9MT0dfVFJBQ0UoImRyb3BwaW5nIHRvIGVmZmVjdGl2ZSB1aWQ9IiA8PCBzX25vcm1hbFVpZCk7CisgIGlmICg6OnNldGV1aWQoc19ub3JtYWxVaWQpICE9IDApCisgICAgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3I7CisgICAgICBlcnJvciA8PCAiRmFpbGVkIHRvIGRyb3AgdG8gZWZmZWN0aXZlIHVpZD0iIDw8IHNfbm9ybWFsVWlkOworCisgICAgICB0aHJvdyBQcml2aWxlZ2VIZWxwZXI6OkVycm9yKGVycm9yLnN0cigpKTsKKyAgICB9CisKKyAgTkZEX0xPR19JTkZPKCJkcm9wcGVkIHRvIGVmZmVjdGl2ZSB1aWQ9IiA8PCA6OmdldGV1aWQoKSA8PCAiIGdpZD0iIDw8IDo6Z2V0ZWdpZCgpKTsKK30KKwordm9pZAorUHJpdmlsZWdlSGVscGVyOjpyYWlzZSgpCit7CisgIE5GRF9MT0dfVFJBQ0UoImVsZXZhdGluZyB0byBlZmZlY3RpdmUgdWlkPSIgPDwgc19wcml2aWxlZ2VkVWlkKTsKKyAgaWYgKDo6c2V0ZXVpZChzX3ByaXZpbGVnZWRVaWQpICE9IDApCisgICAgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3I7CisgICAgICBlcnJvciA8PCAiRmFpbGVkIHRvIGVsZXZhdGUgdG8gZWZmZWN0aXZlIHVpZD0iIDw8IHNfcHJpdmlsZWdlZFVpZDsKKworICAgICAgdGhyb3cgUHJpdmlsZWdlSGVscGVyOjpFcnJvcihlcnJvci5zdHIoKSk7CisgICAgfQorCisgIE5GRF9MT0dfVFJBQ0UoImVsZXZhdGluZyB0byBlZmZlY3RpdmUgZ2lkPSIgPDwgc19wcml2aWxlZ2VkR2lkKTsKKyAgaWYgKDo6c2V0ZWdpZChzX3ByaXZpbGVnZWRHaWQpICE9IDApCisgICAgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3I7CisgICAgICBlcnJvciA8PCAiRmFpbGVkIHRvIGVsZXZhdGUgdG8gZWZmZWN0aXZlIGdpZD0iIDw8IHNfcHJpdmlsZWdlZEdpZDsKKworICAgICAgdGhyb3cgUHJpdmlsZWdlSGVscGVyOjpFcnJvcihlcnJvci5zdHIoKSk7CisgICAgfQorICBORkRfTE9HX0lORk8oImVsZXZhdGVkIHRvIGVmZmVjdGl2ZSB1aWQ9IiA8PCA6OmdldGV1aWQoKSA8PCAiIGdpZD0iIDw8IDo6Z2V0ZWdpZCgpKTsKK30KKwordm9pZAorUHJpdmlsZWdlSGVscGVyOjpydW5FbGV2YXRlZChmdW5jdGlvbjx2b2lkKCk+IGYpCit7CisgIHJhaXNlKCk7CisKKyAgdHJ5CisgICAgeworICAgICAgZigpOworICAgIH0KKyAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICBkcm9wKCk7CisgICAgICB0aHJvdzsKKyAgICB9CisgIGRyb3AoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvY29yZS9wcml2aWxlZ2UtaGVscGVyLmhwcCBiL05GRC9jb3JlL3ByaXZpbGVnZS1oZWxwZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmQ1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9wcml2aWxlZ2UtaGVscGVyLmhwcApAQCAtMCwwICsxLDg0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9DT1JFX1BSSVZJTEVHRV9IRUxQRVJfSFBQCisjZGVmaW5lIE5GRF9DT1JFX1BSSVZJTEVHRV9IRUxQRVJfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBQcml2aWxlZ2VIZWxwZXIKK3sKK3B1YmxpYzoKKworICAvLy8gXGJyaWVmIFByaXZpbGVnZUhlbHBlcjo6RXJyb3IgcmVwcmVzZW50cyBhIHNlcmlvdXMgc2V0ZXVpZC9naWQgZmFpbHVyZSBhbmQKKyAgLy8vICAgICAgICBzaG91bGQgb25seSBiZSBjYXVnaHQgYnkgbWFpbiBpbiBhcyBwYXJ0IG9mIGEgZ3JhY2VmdWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbi4KKyAgY2xhc3MgRXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgd2hhdCkKKyAgICAgIDogbV93aGF0TWVzc2FnZSh3aGF0KQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKgorICAgIHdoYXQoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3doYXRNZXNzYWdlLmNfc3RyKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbV93aGF0TWVzc2FnZTsKKyAgfTsKKworICBzdGF0aWMgdm9pZAorICBpbml0aWFsaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGdyb3VwTmFtZSk7CisKKyAgc3RhdGljIHZvaWQKKyAgZHJvcCgpOworCisgIHN0YXRpYyB2b2lkCisgIHJ1bkVsZXZhdGVkKGZ1bmN0aW9uPHZvaWQoKT4gZik7CisKK3ByaXZhdGU6CisKKyAgc3RhdGljIHZvaWQKKyAgcmFpc2UoKTsKKworcHJpdmF0ZToKKworICBzdGF0aWMgdWlkX3Qgc19ub3JtYWxVaWQ7CisgIHN0YXRpYyBnaWRfdCBzX25vcm1hbEdpZDsKKworICBzdGF0aWMgdWlkX3Qgc19wcml2aWxlZ2VkVWlkOworICBzdGF0aWMgZ2lkX3Qgc19wcml2aWxlZ2VkR2lkOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfQ09SRV9QUklWSUxFR0VfSEVMUEVSX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2NvcmUvcmFuZG9tLmNwcCBiL05GRC9jb3JlL3JhbmRvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiMTM3ZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb3JlL3JhbmRvbS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInJhbmRvbS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitzdGF0aWMgYm9vc3Q6OnJhbmRvbTo6bXQxOTkzNyBnX3JuZzsKKworYm9vc3Q6OnJhbmRvbTo6bXQxOTkzNyYKK2dldEdsb2JhbFJuZygpCit7CisgIHJldHVybiBnX3JuZzsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvY29yZS9yYW5kb20uaHBwIGIvTkZEL2NvcmUvcmFuZG9tLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTE1YjcyCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvcmFuZG9tLmhwcApAQCAtMCwwICsxLDQ5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKioKKyAqIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZ2xvYmFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKiBBbGwgcmFuZG9tIG51bWJlcnMgaW4gTkZEIHNob3VsZCB1c2UgdGhpcyBnbG9iYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsCisgKiBzbyB0aGF0IHRoZSBnZW5lcmF0b3IgY2FuIGJlIHByb3Blcmx5IHNlZWRlZCB3aGVuIG5lY2Vzc2FyeS4KKyAqCisgKiBUaGlzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIG5vdCBzdWl0YWJsZSBmb3Igc2VjdXJpdHkgcHVycG9zZXM7CisgKiBzZWN1cml0eS1jcml0aWNhbCBjb2RlIHNob3VsZCB1c2UgQ3J5cHRvUFAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaW5zdGVhZC4KKyAqLworCisjaWZuZGVmIE5GRF9DT1JFX1JBTkRPTV9IUFAKKyNkZWZpbmUgTkZEX0NPUkVfUkFORE9NX0hQUAorCisjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tL21lcnNlbm5lX3R3aXN0ZXIuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqIFxyZXR1cm4gdGhlIGdsb2JhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpbnN0YW5jZQorICovCitib29zdDo6cmFuZG9tOjptdDE5OTM3JgorZ2V0R2xvYmFsUm5nKCk7CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0NPUkVfUkFORE9NX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2NvcmUvcmVzb2x2ZXIuaHBwIGIvTkZEL2NvcmUvcmVzb2x2ZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGMzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvY29yZS9yZXNvbHZlci5ocHAKQEAgLTAsMCArMSwyMTQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0NPUkVfUkVTT0xWRVJfSAorI2RlZmluZSBORkRfQ09SRV9SRVNPTFZFUl9ICisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgImNvcmUvZ2xvYmFsLWlvLmhwcCIKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJlc29sdmVyIHsKKwordHlwZWRlZiBmdW5jdGlvbjxib29sIChjb25zdCBib29zdDo6YXNpbzo6aXA6OmFkZHJlc3MmIGFkZHJlc3MpPiBBZGRyZXNzU2VsZWN0b3I7CisKK3N0cnVjdCBBbnlBZGRyZXNzIHsKKyAgYm9vbAorICBvcGVyYXRvcigpKGNvbnN0IGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzcyYgYWRkcmVzcykKKyAgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCitzdHJ1Y3QgSXB2NEFkZHJlc3MgeworICBib29sCisgIG9wZXJhdG9yKCkoY29uc3QgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzJiBhZGRyZXNzKQorICB7CisgICAgcmV0dXJuIGFkZHJlc3MuaXNfdjQoKTsKKyAgfQorfTsKKworc3RydWN0IElwdjZBZGRyZXNzIHsKKyAgYm9vbAorICBvcGVyYXRvcigpKGNvbnN0IGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzcyYgYWRkcmVzcykKKyAgeworICAgIHJldHVybiBhZGRyZXNzLmlzX3Y2KCk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIHJlc29sdmVyCisKK3RlbXBsYXRlPGNsYXNzIFByb3RvY29sPgorY2xhc3MgUmVzb2x2ZXIKK3sKK3B1YmxpYzoKKyAgc3RydWN0IEVycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpIDogc3RkOjpydW50aW1lX2Vycm9yKHdoYXQpIHt9CisgIH07CisKKyAgdHlwZWRlZiBmdW5jdGlvbjx2b2lkIChjb25zdCB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQmIGVuZHBvaW50KT4gU3VjY2Vzc0NhbGxiYWNrOworICB0eXBlZGVmIGZ1bmN0aW9uPHZvaWQgKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pPiBFcnJvckNhbGxiYWNrOworCisgIHR5cGVkZWYgYm9vc3Q6OmFzaW86OmlwOjpiYXNpY19yZXNvbHZlcjwgUHJvdG9jb2wgPiByZXNvbHZlcjsKKworICAvKiogXGJyaWVmIEFzeW5jaHJvbm91c2x5IHJlc29sdmUgaG9zdCBhbmQgcG9ydAorICAgKgorICAgKiBJZiBhbiBhZGRyZXNzIHNlbGVjdG9yIHByZWRpY2F0ZSBpcyBzcGVjaWZpZWQsIHRoZW4gZWFjaCByZXNvbHZlZCBJUCBhZGRyZXNzCisgICAqIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGljYXRlLgorICAgKgorICAgKiBBdmFpbGFibGUgYWRkcmVzcyBzZWxlY3RvciBwcmVkaWNhdGVzOgorICAgKgorICAgKiAtIHJlc29sdmVyOjpBbnlBZGRyZXNzKCkKKyAgICogLSByZXNvbHZlcjo6SXB2NEFkZHJlc3MoKQorICAgKiAtIHJlc29sdmVyOjpJcHY2QWRkcmVzcygpCisgICAqLworICBzdGF0aWMgdm9pZAorICBhc3luY1Jlc29sdmUoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwb3J0LAorICAgICAgICAgICAgICAgY29uc3QgU3VjY2Vzc0NhbGxiYWNrJiBvblN1Y2Nlc3MsCisgICAgICAgICAgICAgICBjb25zdCBFcnJvckNhbGxiYWNrJiBvbkVycm9yLAorICAgICAgICAgICAgICAgY29uc3QgbmZkOjpyZXNvbHZlcjo6QWRkcmVzc1NlbGVjdG9yJiBhZGRyZXNzU2VsZWN0b3IgPSBuZmQ6OnJlc29sdmVyOjpBbnlBZGRyZXNzKCksCisgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiB0aW1lb3V0ID0gdGltZTo6c2Vjb25kcyg0KSkKKyAgeworICAgIHNoYXJlZF9wdHI8UmVzb2x2ZXI+IHJlc29sdmVyID0KKyAgICAgIHNoYXJlZF9wdHI8UmVzb2x2ZXI+KG5ldyBSZXNvbHZlcihvblN1Y2Nlc3MsIG9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1NlbGVjdG9yKSk7CisKKyAgICByZXNvbHZlci0+YXN5bmNSZXNvbHZlKGhvc3QsIHBvcnQsIHRpbWVvdXQsIHJlc29sdmVyKTsKKyAgICAvLyByZXNvbHZlciB3aWxsIGJlIGRlc3Ryb3llZCB3aGVuIGFzeW5jIG9wZXJhdGlvbiBmaW5pc2hlcyBvciBnbG9iYWwgSU8gc2VydmljZSBzdG9wcworICB9CisKKyAgLyoqIFxicmllZiBTeW5jaHJvbm91c2x5IHJlc29sdmUgaG9zdCBhbmQgcG9ydAorICAgKgorICAgKiBJZiBhbiBhZGRyZXNzIHNlbGVjdG9yIHByZWRpY2F0ZSBpcyBzcGVjaWZpZWQsIHRoZW4gZWFjaCByZXNvbHZlZCBJUCBhZGRyZXNzCisgICAqIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGljYXRlLgorICAgKgorICAgKiBBdmFpbGFibGUgYWRkcmVzcyBzZWxlY3RvciBwcmVkaWNhdGVzOgorICAgKgorICAgKiAtIHJlc29sdmVyOjpBbnlBZGRyZXNzKCkKKyAgICogLSByZXNvbHZlcjo6SXB2NEFkZHJlc3MoKQorICAgKiAtIHJlc29sdmVyOjpJcHY2QWRkcmVzcygpCisgICAqLworICBzdGF0aWMgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50CisgIHN5bmNSZXNvbHZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBzdGQ6OnN0cmluZyYgcG9ydCwKKyAgICAgICAgICAgICAgY29uc3QgbmZkOjpyZXNvbHZlcjo6QWRkcmVzc1NlbGVjdG9yJiBhZGRyZXNzU2VsZWN0b3IgPSBuZmQ6OnJlc29sdmVyOjpBbnlBZGRyZXNzKCkpCisgIHsKKyAgICBSZXNvbHZlciByZXNvbHZlcihTdWNjZXNzQ2FsbGJhY2soKSwgRXJyb3JDYWxsYmFjaygpLCBhZGRyZXNzU2VsZWN0b3IpOworCisgICAgdHlwZW5hbWUgcmVzb2x2ZXI6OnF1ZXJ5IHF1ZXJ5KGhvc3QsIHBvcnQKKyNpZiBub3QgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXNvbHZlcjo6cXVlcnk6OmFsbF9tYXRjaGluZworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICB0eXBlbmFtZSByZXNvbHZlcjo6aXRlcmF0b3IgcmVtb3RlRW5kcG9pbnQgPSByZXNvbHZlci5tX3Jlc29sdmVyLnJlc29sdmUocXVlcnkpOworICAgIHR5cGVuYW1lIHJlc29sdmVyOjppdGVyYXRvciBlbmQ7CisgICAgZm9yICg7IHJlbW90ZUVuZHBvaW50ICE9IGVuZDsgKytyZW1vdGVFbmRwb2ludCkKKyAgICAgIHsKKyAgICAgICAgaWYgKGFkZHJlc3NTZWxlY3Rvcih0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQoKnJlbW90ZUVuZHBvaW50KS5hZGRyZXNzKCkpKQorICAgICAgICAgIHJldHVybiAqcmVtb3RlRW5kcG9pbnQ7CisgICAgICB9CisgICAgdGhyb3cgRXJyb3IoIk5vIGVuZHBvaW50IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBzZWxlY3RvciBmb3VuZCIpOworICB9CisKK3ByaXZhdGU6CisgIFJlc29sdmVyKGNvbnN0IFN1Y2Nlc3NDYWxsYmFjayYgb25TdWNjZXNzLAorICAgICAgICAgICBjb25zdCBFcnJvckNhbGxiYWNrJiBvbkVycm9yLAorICAgICAgICAgICBjb25zdCBuZmQ6OnJlc29sdmVyOjpBZGRyZXNzU2VsZWN0b3ImIGFkZHJlc3NTZWxlY3RvcikKKyAgICA6IG1fcmVzb2x2ZXIoZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpCisgICAgLCBtX2FkZHJlc3NTZWxlY3RvcihhZGRyZXNzU2VsZWN0b3IpCisgICAgLCBtX29uU3VjY2VzcyhvblN1Y2Nlc3MpCisgICAgLCBtX29uRXJyb3Iob25FcnJvcikKKyAgeworICB9CisKKyAgdm9pZAorICBhc3luY1Jlc29sdmUoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwb3J0LAorICAgICAgICAgICAgICAgY29uc3QgdGltZTo6c2Vjb25kcyYgdGltZW91dCwKKyAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8UmVzb2x2ZXI+JiBzZWxmKQorICB7CisgICAgdHlwZW5hbWUgcmVzb2x2ZXI6OnF1ZXJ5IHF1ZXJ5KGhvc3QsIHBvcnQKKyNpZiBub3QgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXNvbHZlcjo6cXVlcnk6OmFsbF9tYXRjaGluZworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBtX3Jlc29sdmVyLmFzeW5jX3Jlc29sdmUocXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyOjpvblJlc29sdmVTdWNjZXNzLCB0aGlzLCBfMSwgXzIsIHNlbGYpKTsKKworICAgIG1fcmVzb2x2ZVRpbWVvdXQgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXI6Om9uUmVzb2x2ZUVycm9yLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVvdXQiLCBzZWxmKSk7CisgIH0KKworICB2b2lkCisgIG9uUmVzb2x2ZVN1Y2Nlc3MoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgcmVzb2x2ZXI6Oml0ZXJhdG9yIHJlbW90ZUVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8UmVzb2x2ZXI+JiBzZWxmKQorICB7CisgICAgc2NoZWR1bGVyOjpjYW5jZWwobV9yZXNvbHZlVGltZW91dCk7CisKKyAgICBpZiAoZXJyb3IpCisgICAgICB7CisgICAgICAgIGlmIChlcnJvciA9PSBib29zdDo6c3lzdGVtOjplcnJjOjpvcGVyYXRpb25fY2FuY2VsZWQpCisgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJldHVybiBtX29uRXJyb3IoIlJlbW90ZSBlbmRwb2ludCBob3N0bmFtZSBvciBwb3J0IGNhbm5vdCBiZSByZXNvbHZlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY2F0ZWdvcnkoKS5tZXNzYWdlKGVycm9yLnZhbHVlKCkpKTsKKyAgICAgIH0KKworICAgIHR5cGVuYW1lIHJlc29sdmVyOjppdGVyYXRvciBlbmQ7CisgICAgZm9yICg7IHJlbW90ZUVuZHBvaW50ICE9IGVuZDsgKytyZW1vdGVFbmRwb2ludCkKKyAgICAgIHsKKyAgICAgICAgaWYgKG1fYWRkcmVzc1NlbGVjdG9yKHR5cGVuYW1lIFByb3RvY29sOjplbmRwb2ludCgqcmVtb3RlRW5kcG9pbnQpLmFkZHJlc3MoKSkpCisgICAgICAgICAgcmV0dXJuIG1fb25TdWNjZXNzKCpyZW1vdGVFbmRwb2ludCk7CisgICAgICB9CisKKyAgICBtX29uRXJyb3IoIk5vIGVuZHBvaW50IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBzZWxlY3RvciBmb3VuZCIpOworICB9CisKKyAgdm9pZAorICBvblJlc29sdmVFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JJbmZvLAorICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFJlc29sdmVyPiYgc2VsZikKKyAgeworICAgIG1fcmVzb2x2ZXIuY2FuY2VsKCk7CisgICAgbV9vbkVycm9yKGVycm9ySW5mbyk7CisgIH0KKworcHJpdmF0ZToKKyAgcmVzb2x2ZXIgbV9yZXNvbHZlcjsKKyAgRXZlbnRJZCBtX3Jlc29sdmVUaW1lb3V0OworCisgIG5mZDo6cmVzb2x2ZXI6OkFkZHJlc3NTZWxlY3RvciBtX2FkZHJlc3NTZWxlY3RvcjsKKyAgU3VjY2Vzc0NhbGxiYWNrIG1fb25TdWNjZXNzOworICBFcnJvckNhbGxiYWNrIG1fb25FcnJvcjsKK307CisKK3R5cGVkZWYgUmVzb2x2ZXI8Ym9vc3Q6OmFzaW86OmlwOjp0Y3A+IFRjcFJlc29sdmVyOwordHlwZWRlZiBSZXNvbHZlcjxib29zdDo6YXNpbzo6aXA6OnVkcD4gVWRwUmVzb2x2ZXI7CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0NPUkVfUkVTT0xWRVJfSApkaWZmIC0tZ2l0IGEvTkZEL2NvcmUvc2NoZWR1bGVyLmNwcCBiL05GRC9jb3JlL3NjaGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3OWY5NwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9jb3JlL3NjaGVkdWxlci5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJzY2hlZHVsZXIuaHBwIgorI2luY2x1ZGUgImdsb2JhbC1pby5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHNjaGVkdWxlciB7CisKK3N0YXRpYyBzaGFyZWRfcHRyPFNjaGVkdWxlcj4gZ19zY2hlZHVsZXI7CisKK2lubGluZSBTY2hlZHVsZXImCitnZXRHbG9iYWxTY2hlZHVsZXIoKQoreworICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KGdfc2NoZWR1bGVyKSkgeworICAgIGdfc2NoZWR1bGVyID0gbWFrZV9zaGFyZWQ8U2NoZWR1bGVyPihyZWYoZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpKTsKKyAgfQorICByZXR1cm4gKmdfc2NoZWR1bGVyOworfQorCitFdmVudElkCitzY2hlZHVsZShjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgYWZ0ZXIsIGNvbnN0IFNjaGVkdWxlcjo6RXZlbnQmIGV2ZW50KQoreworICByZXR1cm4gZ2V0R2xvYmFsU2NoZWR1bGVyKCkuc2NoZWR1bGVFdmVudChhZnRlciwgZXZlbnQpOworfQorCit2b2lkCitjYW5jZWwoY29uc3QgRXZlbnRJZCYgZXZlbnRJZCkKK3sKKyAgZ2V0R2xvYmFsU2NoZWR1bGVyKCkuY2FuY2VsRXZlbnQoZXZlbnRJZCk7Cit9CisKK3ZvaWQKK3Jlc2V0R2xvYmFsU2NoZWR1bGVyKCkKK3sKKyAgZ19zY2hlZHVsZXIucmVzZXQoKTsKK30KKworU2NvcGVkRXZlbnRJZDo6U2NvcGVkRXZlbnRJZCgpCit7Cit9CisKK1Njb3BlZEV2ZW50SWQ6OlNjb3BlZEV2ZW50SWQoY29uc3QgRXZlbnRJZCYgZXZlbnQpCisgIDogbV9ldmVudChldmVudCkKK3sKK30KKworU2NvcGVkRXZlbnRJZDo6U2NvcGVkRXZlbnRJZChTY29wZWRFdmVudElkJiYgb3RoZXIpCisgIDogbV9ldmVudChvdGhlci5tX2V2ZW50KQoreworICBvdGhlci5yZWxlYXNlKCk7Cit9CisKK1Njb3BlZEV2ZW50SWQmCitTY29wZWRFdmVudElkOjpvcGVyYXRvcj0oY29uc3QgRXZlbnRJZCYgZXZlbnQpCit7CisgIGlmIChtX2V2ZW50ICE9IGV2ZW50KSB7CisgICAgc2NoZWR1bGVyOjpjYW5jZWwobV9ldmVudCk7CisgICAgbV9ldmVudCA9IGV2ZW50OworICB9CisgIHJldHVybiAqdGhpczsKK30KKworU2NvcGVkRXZlbnRJZDo6flNjb3BlZEV2ZW50SWQoKQoreworICBzY2hlZHVsZXI6OmNhbmNlbChtX2V2ZW50KTsKK30KKwordm9pZAorU2NvcGVkRXZlbnRJZDo6Y2FuY2VsKCkKK3sKKyAgc2NoZWR1bGVyOjpjYW5jZWwobV9ldmVudCk7Cit9CisKK3ZvaWQKK1Njb3BlZEV2ZW50SWQ6OnJlbGVhc2UoKQoreworICBtX2V2ZW50LnJlc2V0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHNjaGVkdWxlcgorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvY29yZS9zY2hlZHVsZXIuaHBwIGIvTkZEL2NvcmUvc2NoZWR1bGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI0M2MxCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvc2NoZWR1bGVyLmhwcApAQCAtMCwwICsxLDEwMSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfQ09SRV9TQ0hFRFVMRVJfSFBQCisjZGVmaW5lIE5GRF9DT1JFX1NDSEVEVUxFUl9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3NjaGVkdWxlci5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHNjaGVkdWxlciB7CisKK3VzaW5nIG5kbjo6U2NoZWR1bGVyOworCisvKiogXGNsYXNzIEV2ZW50SWQKKyAqICBcYnJpZWYgT3BhcXVlIHR5cGUgKHNoYXJlZF9wdHIpIHJlcHJlc2VudGluZyBJRCBvZiBhIHNjaGVkdWxlZCBldmVudAorICovCit1c2luZyBuZG46OkV2ZW50SWQ7CisKKy8qKiBcYnJpZWYgc2NoZWR1bGUgYW4gZXZlbnQKKyAqLworRXZlbnRJZAorc2NoZWR1bGUoY29uc3QgdGltZTo6bmFub3NlY29uZHMmIGFmdGVyLCBjb25zdCBTY2hlZHVsZXI6OkV2ZW50JiBldmVudCk7CisKKy8qKiBcYnJpZWYgY2FuY2VsIGEgc2NoZWR1bGVkIGV2ZW50CisgKi8KK3ZvaWQKK2NhbmNlbChjb25zdCBFdmVudElkJiBldmVudElkKTsKKworLyoqIFxicmllZiBjYW5jZWxzIGFuIGV2ZW50IGF1dG9tYXRpY2FsbHkgdXBvbiBkZXN0cnVjdGlvbgorICovCitjbGFzcyBTY29wZWRFdmVudElkIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgU2NvcGVkRXZlbnRJZCgpOworCisgIC8qKiBcYnJpZWYgaW1wbGljaXQgY29uc3RydWN0b3IgZnJvbSBFdmVudElkCisgICAqICBccGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIGJlIGNhbmNlbGxlZCB1cG9uIGRlc3RydWN0aW9uCisgICAqLworICBTY29wZWRFdmVudElkKGNvbnN0IEV2ZW50SWQmIGV2ZW50KTsKKworICAvKiogXGJyaWVmIG1vdmUgY29uc3RydWN0b3IKKyAgICovCisgIFNjb3BlZEV2ZW50SWQoU2NvcGVkRXZlbnRJZCYmIG90aGVyKTsKKworICAvKiogXGJyaWVmIGFzc2lnbnMgYW4gZXZlbnQKKyAgICoKKyAgICogIElmIGEgZGlmZmVyZW50IGV2ZW50IGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRoaXMgaW5zdGFuY2UgcHJldmlvdXNseSwKKyAgICogIHRoYXQgZXZlbnQgd2lsbCBiZSBjYW5jZWxsZWQgaW1tZWRpYXRlbHkuCisgICAqLworICBTY29wZWRFdmVudElkJgorICBvcGVyYXRvcj0oY29uc3QgRXZlbnRJZCYgZXZlbnQpOworCisgIC8qKiBcYnJpZWYgY2FuY2VscyB0aGUgZXZlbnQKKyAgICovCisgIH5TY29wZWRFdmVudElkKCk7CisKKyAgLyoqIFxicmllZiBjYW5jZWxzIHRoZSBldmVudCBtYW51YWxseQorICAgKi8KKyAgdm9pZAorICBjYW5jZWwoKTsKKworICAvKiogXGJyaWVmIHJlbGVhc2VzIHRoZSBldmVudCBzbyB0aGF0IGl0IHdvbid0IGJlIGRpc2Nvbm5lY3RlZAorICAgKiAgICAgICAgIHdoZW4gdGhpcyBTY29wZWRFdmVudElkIGlzIGRlc3RydWN0ZWQKKyAgICovCisgIHZvaWQKKyAgcmVsZWFzZSgpOworCitwcml2YXRlOgorICBFdmVudElkIG1fZXZlbnQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBzY2hlZHVsZXIKKwordXNpbmcgc2NoZWR1bGVyOjpFdmVudElkOworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9DT1JFX1NDSEVEVUxFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9jb3JlL3NlZ21lbnQtcHVibGlzaGVyLmhwcCBiL05GRC9jb3JlL3NlZ21lbnQtcHVibGlzaGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IzNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2NvcmUvc2VnbWVudC1wdWJsaXNoZXIuaHBwCkBAIC0wLDAgKzEsMTIwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9DT1JFX1NFR01FTlRfUFVCTElTSEVSX0hQUAorI2RlZmluZSBORkRfQ09SRV9TRUdNRU5UX1BVQkxJU0hFUl9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisKKyNpbmNsdWRlIDxuZG4tY3h4L2VuY29kaW5nL2VuY29kaW5nLWJ1ZmZlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9rZXktY2hhaW4uaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqIFxicmllZiBwcm92aWRlcyBhIHB1Ymxpc2hlciBvZiBTdGF0dXMgRGF0YXNldCBvciBvdGhlciBzZWdtZW50ZWQgb2N0ZXQgc3RyZWFtCisgKiAgXHNhIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1N0YXR1c0RhdGFzZXQKKyAqLwordGVtcGxhdGUgPGNsYXNzIEZhY2VCYXNlPgorY2xhc3MgU2VnbWVudFB1Ymxpc2hlciA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIFNlZ21lbnRQdWJsaXNoZXIoRmFjZUJhc2UmIGZhY2UsIGNvbnN0IE5hbWUmIHByZWZpeCwgbmRuOjpLZXlDaGFpbiYga2V5Q2hhaW4pCisgICAgOiBtX2ZhY2UoZmFjZSkKKyAgICAsIG1fcHJlZml4KHByZWZpeCkKKyAgICAsIG1fa2V5Q2hhaW4oa2V5Q2hhaW4pCisgIHsKKyAgfQorCisgIHZpcnR1YWwKKyAgflNlZ21lbnRQdWJsaXNoZXIoKQorICB7CisgIH0KKworICBzdGF0aWMgc2l6ZV90CisgIGdldE1heFNlZ21lbnRTaXplKCkKKyAgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX1NFR01FTlRfU0laRSA9IG5kbjo6TUFYX05ETl9QQUNLRVRfU0laRSA+PiAxOworICAgIHJldHVybiBNQVhfU0VHTUVOVF9TSVpFOworICB9CisKKyAgdm9pZAorICBwdWJsaXNoKCkKKyAgeworICAgIG5kbjo6RW5jb2RpbmdCdWZmZXIgYnVmZmVyOworICAgIGdlbmVyYXRlKGJ1ZmZlcik7CisKKyAgICBjb25zdCB1aW50OF90KiByYXdCdWZmZXIgPSBidWZmZXIuYnVmKCk7CisgICAgY29uc3QgdWludDhfdCogc2VnbWVudEJlZ2luID0gcmF3QnVmZmVyOworICAgIGNvbnN0IHVpbnQ4X3QqIGVuZCA9IHJhd0J1ZmZlciArIGJ1ZmZlci5zaXplKCk7CisKKyAgICBOYW1lIHNlZ21lbnRQcmVmaXgobV9wcmVmaXgpOworICAgIHNlZ21lbnRQcmVmaXguYXBwZW5kVmVyc2lvbigpOworCisgICAgdWludDY0X3Qgc2VnbWVudE5vID0gMDsKKyAgICBkbyB7CisgICAgICBjb25zdCB1aW50OF90KiBzZWdtZW50RW5kID0gc2VnbWVudEJlZ2luICsgZ2V0TWF4U2VnbWVudFNpemUoKTsKKyAgICAgIGlmIChzZWdtZW50RW5kID4gZW5kKSB7CisgICAgICAgIHNlZ21lbnRFbmQgPSBlbmQ7CisgICAgICB9CisKKyAgICAgIE5hbWUgc2VnbWVudE5hbWUoc2VnbWVudFByZWZpeCk7CisgICAgICBzZWdtZW50TmFtZS5hcHBlbmRTZWdtZW50KHNlZ21lbnRObyk7CisKKyAgICAgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2Vfc2hhcmVkPERhdGE+KHNlZ21lbnROYW1lKTsKKyAgICAgIGRhdGEtPnNldENvbnRlbnQoc2VnbWVudEJlZ2luLCBzZWdtZW50RW5kIC0gc2VnbWVudEJlZ2luKTsKKworICAgICAgc2VnbWVudEJlZ2luID0gc2VnbWVudEVuZDsKKyAgICAgIGlmIChzZWdtZW50QmVnaW4gPj0gZW5kKSB7CisgICAgICAgIGRhdGEtPnNldEZpbmFsQmxvY2tJZChzZWdtZW50TmFtZVstMV0pOworICAgICAgfQorCisgICAgICBwdWJsaXNoU2VnbWVudChkYXRhKTsKKyAgICAgICsrc2VnbWVudE5vOworICAgIH0gd2hpbGUgKHNlZ21lbnRCZWdpbiA8IGVuZCk7CisgIH0KKworcHJvdGVjdGVkOgorICAvKiogXGJyaWVmIEluIGEgZGVyaXZlZCBjbGFzcywgd3JpdGUgdGhlIG9jdGV0cyBpbnRvIG91dEJ1ZmZlci4KKyAgICovCisgIHZpcnR1YWwgc2l6ZV90CisgIGdlbmVyYXRlKG5kbjo6RW5jb2RpbmdCdWZmZXImIG91dEJ1ZmZlcikgPSAwOworCitwcml2YXRlOgorICB2b2lkCisgIHB1Ymxpc2hTZWdtZW50KHNoYXJlZF9wdHI8RGF0YT4mIGRhdGEpCisgIHsKKyAgICBtX2tleUNoYWluLnNpZ24oKmRhdGEpOworICAgIG1fZmFjZS5wdXQoKmRhdGEpOworICB9CisKK3ByaXZhdGU6CisgIEZhY2VCYXNlJiBtX2ZhY2U7CisgIGNvbnN0IE5hbWUgbV9wcmVmaXg7CisgIG5kbjo6S2V5Q2hhaW4mIG1fa2V5Q2hhaW47Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9DT1JFX1NFR01FTlRfUFVCTElTSEVSX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL2NoYW5uZWwuY3BwIGIvTkZEL2RhZW1vbi9mYWNlL2NoYW5uZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjE1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvY2hhbm5lbC5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImNoYW5uZWwuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworQ2hhbm5lbDo6fkNoYW5uZWwoKQoreworfQorCit2b2lkCitDaGFubmVsOjpzZXRVcmkoY29uc3QgRmFjZVVyaSYgdXJpKQoreworICBtX3VyaSA9IHVyaTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvY2hhbm5lbC5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvY2hhbm5lbC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwZDcyNgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9jaGFubmVsLmhwcApAQCAtMCwwICsxLDY4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9EQUVNT05fRkFDRV9DSEFOTkVMX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfQ0hBTk5FTF9IUFAKKworI2luY2x1ZGUgImZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgQ2hhbm5lbCA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIC8qKiBcYnJpZWYgUHJvdG90eXBlIGZvciB0aGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gZmFjZSBpcyBjcmVhdGVkCisgICAqICAgICAgICAgKGFzIGEgcmVzcG9uc2UgdG8gaW5jb21pbmcgY29ubmVjdGlvbiBvciBhZnRlciBjb25uZWN0aW9uCisgICAqICAgICAgICAgaXMgZXN0YWJsaXNoZWQpCisgICAqLworICB0eXBlZGVmIGZ1bmN0aW9uPHZvaWQoY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgbmV3RmFjZSk+IEZhY2VDcmVhdGVkQ2FsbGJhY2s7CisKKyAgLyoqIFxicmllZiBQcm90b3R5cGUgZm9yIHRoZSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIGZhY2UgaXMgZmFpbGVkIHRvCisgICAqICAgICAgICAgZ2V0IGNyZWF0ZWQKKyAgICovCisgIHR5cGVkZWYgZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKT4gQ29ubmVjdEZhaWxlZENhbGxiYWNrOworCisgIHZpcnR1YWwKKyAgfkNoYW5uZWwoKTsKKworICBjb25zdCBGYWNlVXJpJgorICBnZXRVcmkoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICB2b2lkCisgIHNldFVyaShjb25zdCBGYWNlVXJpJiB1cmkpOworCitwcml2YXRlOgorICBGYWNlVXJpIG1fdXJpOworfTsKKworaW5saW5lIGNvbnN0IEZhY2VVcmkmCitDaGFubmVsOjpnZXRVcmkoKSBjb25zdAoreworICByZXR1cm4gbV91cmk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX0NIQU5ORUxfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvZGF0YWdyYW0tZmFjZS5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvZGF0YWdyYW0tZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxYjNkOQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9kYXRhZ3JhbS1mYWNlLmhwcApAQCAtMCwwICsxLDM0MiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfREFUQUdSQU1fRkFDRV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX0RBVEFHUkFNX0ZBQ0VfSFBQCisKKyNpbmNsdWRlICJmYWNlLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBVbmljYXN0IHt9OworY2xhc3MgTXVsdGljYXN0IHt9OworCit0ZW1wbGF0ZTxjbGFzcyBQcm90b2NvbCwgY2xhc3MgVHlwZSA9IFVuaWNhc3Q+CitjbGFzcyBEYXRhZ3JhbUZhY2UgOiBwdWJsaWMgRmFjZQoreworcHVibGljOgorICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sOworCisgIC8qKiBcYnJpZWYgQ29uc3RydWN0IGRhdGFncmFtIGZhY2UKKyAgICoKKyAgICogXHBhcmFtIHNvY2tldCAgICAgIFByb3RvY29sLXNwZWNpZmljIHNvY2tldCBmb3IgdGhlIGNyZWF0ZWQgZmFjZQorICAgKiBccGFyYW0gaXNPbkRlbWFuZCAgSWYgdHJ1ZSwgdGhlIGZhY2UgY2FuIGJlIGNsb3NlZCBhZnRlciBpdCByZW1haW5zCisgICAqICAgICAgICAgICAgICAgICAgICB1bnVzZWQgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZQorICAgKi8KKyAgRGF0YWdyYW1GYWNlKGNvbnN0IEZhY2VVcmkmIHJlbW90ZVVyaSwgY29uc3QgRmFjZVVyaSYgbG9jYWxVcmksCisgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPHR5cGVuYW1lIHByb3RvY29sOjpzb2NrZXQ+JiBzb2NrZXQsCisgICAgICAgICAgICAgICBib29sIGlzT25EZW1hbmQpOworCisgIHZpcnR1YWwKKyAgfkRhdGFncmFtRmFjZSgpOworCisgIC8vIGZyb20gRmFjZQorICB2aXJ0dWFsIHZvaWQKKyAgc2VuZEludGVyZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCk7CisKKyAgdmlydHVhbCB2b2lkCisgIHNlbmREYXRhKGNvbnN0IERhdGEmIGRhdGEpOworCisgIHZpcnR1YWwgdm9pZAorICBjbG9zZSgpOworCisgIHZvaWQKKyAgcmVjZWl2ZURhdGFncmFtKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBuQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yKTsKKworICAvKioKKyAgICogXGJyaWVmIFNldCBtX2hhc0JlZW5Vc2VkUmVjZW50bHkgdG8gZmFsc2UKKyAgICovCisgIHZvaWQKKyAgcmVzZXRSZWNlbnRVc2FnZSgpOworCisgIGJvb2wKKyAgaGFzQmVlblVzZWRSZWNlbnRseSgpIGNvbnN0OworCisgIHZvaWQKKyAgc2V0T25EZW1hbmQoYm9vbCBpc09uRGVtYW5kKTsKKworcHJvdGVjdGVkOgorICB2b2lkCisgIGhhbmRsZVNlbmQoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsCisgICAgICAgICAgICAgc2l6ZV90IG5CeXRlc1NlbnQsCisgICAgICAgICAgICAgY29uc3QgQmxvY2smIHBheWxvYWQpOworCisgIHZvaWQKKyAgaGFuZGxlUmVjZWl2ZShjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICBzaXplX3QgbkJ5dGVzUmVjZWl2ZWQpOworCisgIHZvaWQKKyAga2VlcEZhY2VBbGl2ZVVudGlsQWxsSGFuZGxlcnNFeGVjdXRlZChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBmYWNlKTsKKworICB2b2lkCisgIGNsb3NlU29ja2V0KCk7CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjx0eXBlbmFtZSBwcm90b2NvbDo6c29ja2V0PiBtX3NvY2tldDsKKyAgdWludDhfdCBtX2lucHV0QnVmZmVyW25kbjo6TUFYX05ETl9QQUNLRVRfU0laRV07CisgIGJvb2wgbV9oYXNCZWVuVXNlZFJlY2VudGx5OworCisgIE5GRF9MT0dfSU5DTEFTU19ERUNMQVJFKCk7Cit9OworCisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUKK0RhdGFncmFtRmFjZTxULCBVPjo6RGF0YWdyYW1GYWNlKGNvbnN0IEZhY2VVcmkmIHJlbW90ZVVyaSwgY29uc3QgRmFjZVVyaSYgbG9jYWxVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPHR5cGVuYW1lIERhdGFncmFtRmFjZTo6cHJvdG9jb2w6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPbkRlbWFuZCkKKyAgOiBGYWNlKHJlbW90ZVVyaSwgbG9jYWxVcmkpCisgICwgbV9zb2NrZXQoc29ja2V0KQoreworICBzZXRPbkRlbWFuZChpc09uRGVtYW5kKTsKKworICBtX3NvY2tldC0+YXN5bmNfcmVjZWl2ZShib29zdDo6YXNpbzo6YnVmZmVyKG1faW5wdXRCdWZmZXIsIG5kbjo6TUFYX05ETl9QQUNLRVRfU0laRSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkRhdGFncmFtRmFjZTxULCBVPjo6aGFuZGxlUmVjZWl2ZSwgdGhpcywgXzEsIF8yKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUKK0RhdGFncmFtRmFjZTxULCBVPjo6fkRhdGFncmFtRmFjZSgpCit7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorRGF0YWdyYW1GYWNlPFQsIFU+OjpzZW5kSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQoreworICB0aGlzLT5vblNlbmRJbnRlcmVzdChpbnRlcmVzdCk7CisgIGNvbnN0IEJsb2NrJiBwYXlsb2FkID0gaW50ZXJlc3Qud2lyZUVuY29kZSgpOworICBtX3NvY2tldC0+YXN5bmNfc2VuZChib29zdDo6YXNpbzo6YnVmZmVyKHBheWxvYWQud2lyZSgpLCBwYXlsb2FkLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkRhdGFncmFtRmFjZTxULCBVPjo6aGFuZGxlU2VuZCwgdGhpcywgXzEsIF8yLCBwYXlsb2FkKSk7CisKKyAgLy8gYW55dGhpbmcgZWxzZSBzaG91bGQgYmUgZG9uZSBoZXJlPworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIHZvaWQKK0RhdGFncmFtRmFjZTxULCBVPjo6c2VuZERhdGEoY29uc3QgRGF0YSYgZGF0YSkKK3sKKyAgdGhpcy0+b25TZW5kRGF0YShkYXRhKTsKKyAgY29uc3QgQmxvY2smIHBheWxvYWQgPSBkYXRhLndpcmVFbmNvZGUoKTsKKyAgbV9zb2NrZXQtPmFzeW5jX3NlbmQoYm9vc3Q6OmFzaW86OmJ1ZmZlcihwYXlsb2FkLndpcmUoKSwgcGF5bG9hZC5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZEYXRhZ3JhbUZhY2U8VCwgVT46OmhhbmRsZVNlbmQsIHRoaXMsIF8xLCBfMiwgcGF5bG9hZCkpOworCisgIC8vIGFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGRvbmUgaGVyZT8KK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSB2b2lkCitEYXRhZ3JhbUZhY2U8VCwgVT46OmhhbmRsZVNlbmQoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5CeXRlc1NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2smIHBheWxvYWQpCisvLyAncGF5bG9hZCcgaXMgdW51c2VkOyBpdCdzIG5lZWRlZCB0byByZXRhaW4gdGhlIHVuZGVybHlpbmcgQnVmZmVyCit7CisgIGlmIChlcnJvciAhPSAwKSB7CisgICAgaWYgKGVycm9yID09IGJvb3N0OjpzeXN0ZW06OmVycmM6Om9wZXJhdGlvbl9jYW5jZWxlZCkgLy8gd2hlbiBzb2NrZXQgaXMgY2xvc2VkIGJ5IHNvbWVvbmUKKyAgICAgIHJldHVybjsKKworICAgIGlmICghbV9zb2NrZXQtPmlzX29wZW4oKSkgeworICAgICAgZmFpbCgiVHVubmVsIGNsb3NlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgdGhpcy0+Z2V0SWQoKQorICAgICAgICAgICAgICAgICAgPDwgIix1cmk6IiA8PCB0aGlzLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgICAgPDwgIl0gU2VuZCBvcGVyYXRpb24gZmFpbGVkLCBjbG9zaW5nIHNvY2tldDogIgorICAgICAgICAgICAgICAgICAgPDwgZXJyb3IuY2F0ZWdvcnkoKS5tZXNzYWdlKGVycm9yLnZhbHVlKCkpKTsKKworICAgIGNsb3NlU29ja2V0KCk7CisKKyAgICBpZiAoZXJyb3IgPT0gYm9vc3Q6OmFzaW86OmVycm9yOjplb2YpIHsKKyAgICAgIGZhaWwoIlR1bm5lbCBjbG9zZWQiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmYWlsKCJTZW5kIG9wZXJhdGlvbiBmYWlsZWQsIGNsb3Npbmcgc29ja2V0OiAiICsKKyAgICAgICAgICAgICBlcnJvci5jYXRlZ29yeSgpLm1lc3NhZ2UoZXJyb3IudmFsdWUoKSkpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBORkRfTE9HX1RSQUNFKCJbaWQ6IiA8PCB0aGlzLT5nZXRJZCgpCisgICAgICAgICAgICAgICAgPDwgIix1cmk6IiA8PCB0aGlzLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgIDw8ICJdIFN1Y2Nlc3NmdWxseSBzZW50OiAiIDw8IG5CeXRlc1NlbnQgPDwgIiBieXRlcyIpOworICB0aGlzLT5nZXRNdXRhYmxlQ291bnRlcnMoKS5nZXROT3V0Qnl0ZXMoKSArPSBuQnl0ZXNTZW50OworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIHZvaWQKK0RhdGFncmFtRmFjZTxULCBVPjo6Y2xvc2UoKQoreworICBpZiAoIW1fc29ja2V0LT5pc19vcGVuKCkpCisgICAgcmV0dXJuOworCisgIE5GRF9MT0dfSU5GTygiW2lkOiIgPDwgdGhpcy0+Z2V0SWQoKQorICAgICAgICAgICAgICAgPDwgIix1cmk6IiA8PCB0aGlzLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgPDwgIl0gQ2xvc2UgdHVubmVsIik7CisKKyAgY2xvc2VTb2NrZXQoKTsKKyAgZmFpbCgiQ2xvc2UgdHVubmVsIik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorRGF0YWdyYW1GYWNlPFQsIFU+OjpoYW5kbGVSZWNlaXZlKGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuQnl0ZXNSZWNlaXZlZCkKK3sKKyAgTkZEX0xPR19ERUJVRygiaGFuZGxlUmVjZWl2ZTogIiA8PCBuQnl0ZXNSZWNlaXZlZCk7CisgIHJlY2VpdmVEYXRhZ3JhbShtX2lucHV0QnVmZmVyLCBuQnl0ZXNSZWNlaXZlZCwgZXJyb3IpOworICBpZiAobV9zb2NrZXQtPmlzX29wZW4oKSkKKyAgICBtX3NvY2tldC0+YXN5bmNfcmVjZWl2ZShib29zdDo6YXNpbzo6YnVmZmVyKG1faW5wdXRCdWZmZXIsIG5kbjo6TUFYX05ETl9QQUNLRVRfU0laRSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRGF0YWdyYW1GYWNlPFQsIFU+OjpoYW5kbGVSZWNlaXZlLCB0aGlzLCBfMSwgXzIpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSB2b2lkCitEYXRhZ3JhbUZhY2U8VCwgVT46OnJlY2VpdmVEYXRhZ3JhbShjb25zdCB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbkJ5dGVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvcikKK3sKKyAgaWYgKGVycm9yICE9IDAgfHwgbkJ5dGVzUmVjZWl2ZWQgPT0gMCkgeworICAgIGlmIChlcnJvciA9PSBib29zdDo6c3lzdGVtOjplcnJjOjpvcGVyYXRpb25fY2FuY2VsZWQpIC8vIHdoZW4gc29ja2V0IGlzIGNsb3NlZCBieSBzb21lb25lCisgICAgICByZXR1cm47CisKKyAgICAvLyB0aGlzIHNob3VsZCBiZSB1bm5lY2Vzc2FyeSwgYnV0IGp1c3QgaW4gY2FzZQorICAgIGlmICghbV9zb2NrZXQtPmlzX29wZW4oKSkgeworICAgICAgZmFpbCgiVHVubmVsIGNsb3NlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgdGhpcy0+Z2V0SWQoKQorICAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgIDw8ICJdIFJlY2VpdmUgb3BlcmF0aW9uIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICA8PCBlcnJvci5jYXRlZ29yeSgpLm1lc3NhZ2UoZXJyb3IudmFsdWUoKSkpOworCisgICAgY2xvc2VTb2NrZXQoKTsKKworICAgIGlmIChlcnJvciA9PSBib29zdDo6YXNpbzo6ZXJyb3I6OmVvZikgeworICAgICAgZmFpbCgiVHVubmVsIGNsb3NlZCIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZhaWwoIlJlY2VpdmUgb3BlcmF0aW9uIGZhaWxlZCwgY2xvc2luZyBzb2NrZXQ6ICIgKworICAgICAgICAgICAgIGVycm9yLmNhdGVnb3J5KCkubWVzc2FnZShlcnJvci52YWx1ZSgpKSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIE5GRF9MT0dfVFJBQ0UoIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgPDwgIl0gUmVjZWl2ZWQ6ICIgPDwgbkJ5dGVzUmVjZWl2ZWQgPDwgIiBieXRlcyIpOworICB0aGlzLT5nZXRNdXRhYmxlQ291bnRlcnMoKS5nZXROSW5CeXRlcygpICs9IG5CeXRlc1JlY2VpdmVkOworCisgIEJsb2NrIGVsZW1lbnQ7CisgIGJvb2wgaXNPayA9IEJsb2NrOjpmcm9tQnVmZmVyKGJ1ZmZlciwgbkJ5dGVzUmVjZWl2ZWQsIGVsZW1lbnQpOworICBpZiAoIWlzT2spCisgICAgeworICAgICAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCB0aGlzLT5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgPDwgIix1cmk6IiA8PCB0aGlzLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgICAgIDw8ICJdIEZhaWxlZCB0byBwYXJzZSBpbmNvbWluZyBwYWNrZXQiKTsKKyAgICAgIC8vIFRoaXMgbWVzc2FnZSB3b24ndCBleHRlbmQgdGhlIGZhY2UgbGlmZXRpbWUKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGVsZW1lbnQuc2l6ZSgpICE9IG5CeXRlc1JlY2VpdmVkKQorICAgIHsKKyAgICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgdGhpcy0+Z2V0SWQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIsdXJpOiIgPDwgdGhpcy0+Z2V0UmVtb3RlVXJpKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiXSBSZWNlaXZlZCBkYXRhZ3JhbSBzaXplIGFuZCBkZWNvZGVkICIKKyAgICAgICAgICAgICAgICAgICA8PCAiZWxlbWVudCBzaXplIGRvbid0IG1hdGNoIik7CisgICAgICAvLyBUaGlzIG1lc3NhZ2Ugd29uJ3QgZXh0ZW5kIHRoZSBmYWNlIGxpZmV0aW1lCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghdGhpcy0+ZGVjb2RlQW5kRGlzcGF0Y2hJbnB1dChlbGVtZW50KSkKKyAgICB7CisgICAgICBORkRfTE9HX1dBUk4oIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgICAgPDwgIl0gUmVjZWl2ZWQgdW5yZWNvZ25pemVkIGJsb2NrIG9mIHR5cGUgWyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbGVtZW50LnR5cGUoKSA8PCAiXSIpOworICAgICAgLy8gVGhpcyBtZXNzYWdlIHdvbid0IGV4dGVuZCB0aGUgZmFjZSBsaWZldGltZQorICAgICAgcmV0dXJuOworICAgIH0KKworICBtX2hhc0JlZW5Vc2VkUmVjZW50bHkgPSB0cnVlOworfQorCisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorRGF0YWdyYW1GYWNlPFQsIFU+OjprZWVwRmFjZUFsaXZlVW50aWxBbGxIYW5kbGVyc0V4ZWN1dGVkKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIGZhY2UpCit7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorRGF0YWdyYW1GYWNlPFQsIFU+OjpjbG9zZVNvY2tldCgpCit7CisgIE5GRF9MT0dfREVCVUcoIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgPDwgIl0gY2xvc2VTb2NrZXQiKTsKKworICBib29zdDo6YXNpbzo6aW9fc2VydmljZSYgaW8gPSBtX3NvY2tldC0+Z2V0X2lvX3NlcnZpY2UoKTsKKworICAvLyB1c2UgdGhlIG5vbi10aHJvd2luZyB2YXJpYW50cyBhbmQgaWdub3JlIGVycm9ycywgaWYgYW55CisgIGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZXJyb3I7CisgIG1fc29ja2V0LT5zaHV0ZG93bihwcm90b2NvbDo6c29ja2V0OjpzaHV0ZG93bl9ib3RoLCBlcnJvcik7CisgIG1fc29ja2V0LT5jbG9zZShlcnJvcik7CisgIC8vIGFmdGVyIHRoaXMsIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gZXJyb3IgY29kZQorCisgIC8vIGVuc3VyZSB0aGF0IHRoZSBGYWNlIG9iamVjdCBpcyBhbGl2ZSBhdCBsZWFzdCB1bnRpbCBhbGwgcGVuZGluZworICAvLyBoYW5kbGVycyBhcmUgZGlzcGF0Y2hlZAorICBpby5wb3N0KGJpbmQoJkRhdGFncmFtRmFjZTxULCBVPjo6a2VlcEZhY2VBbGl2ZVVudGlsQWxsSGFuZGxlcnNFeGVjdXRlZCwKKyAgICAgICAgICAgICAgIHRoaXMsIHRoaXMtPnNoYXJlZF9mcm9tX3RoaXMoKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIHZvaWQKK0RhdGFncmFtRmFjZTxULCBVPjo6c2V0T25EZW1hbmQoYm9vbCBpc09uRGVtYW5kKQoreworICBGYWNlOjpzZXRPbkRlbWFuZChpc09uRGVtYW5kKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSB2b2lkCitEYXRhZ3JhbUZhY2U8VCwgVT46OnJlc2V0UmVjZW50VXNhZ2UoKQoreworICBtX2hhc0JlZW5Vc2VkUmVjZW50bHkgPSBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBib29sCitEYXRhZ3JhbUZhY2U8VCwgVT46Omhhc0JlZW5Vc2VkUmVjZW50bHkoKSBjb25zdAoreworICByZXR1cm4gbV9oYXNCZWVuVXNlZFJlY2VudGx5OworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9EQVRBR1JBTV9GQUNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL2V0aGVybmV0LWZhY2UuY3BwIGIvTkZEL2RhZW1vbi9mYWNlL2V0aGVybmV0LWZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2UzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvZXRoZXJuZXQtZmFjZS5jcHAKQEAgLTAsMCArMSw0NjQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJldGhlcm5ldC1mYWNlLmhwcCIKKyNpbmNsdWRlICJjb3JlL2dsb2JhbC1pby5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisKKyNpbmNsdWRlIDxjZXJybm8+ICAgICAgICAgLy8gZm9yIGVycm5vCisjaW5jbHVkZSA8Y3N0ZGlvPiAgICAgICAgIC8vIGZvciBzdGQ6OnNucHJpbnRmKCkKKyNpbmNsdWRlIDxjc3RyaW5nPiAgICAgICAgLy8gZm9yIHN0ZDo6c3RyZXJyb3IoKSBhbmQgc3RkOjpzdHJuY3B5KCkKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4gICAgLy8gZm9yIGh0b25zKCkgYW5kIG50b2hzKCkKKyNpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4gLy8gZm9yIHN0cnVjdCBldGhlcl9oZWFkZXIKKyNpbmNsdWRlIDxuZXQvaWYuaD4gICAgICAgLy8gZm9yIHN0cnVjdCBpZnJlcQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPiAgICAvLyBmb3IgaW9jdGwoKQorI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAvLyBmb3IgZHVwKCkKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4gLy8gZm9yIHN0cnVjdCBwYWNrZXRfbXJlcQorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gICAgICAgLy8gZm9yIHNldHNvY2tvcHQoKQorI2VuZGlmCisKKyNpZmRlZiBTSU9DQURETVVMVEkKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNpbmNsdWRlIDxuZXQvaWZfZGwuaD4gICAgLy8gZm9yIHN0cnVjdCBzb2NrYWRkcl9kbAorI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBDQVBfTkVUTUFTS19VTktOT1dOKQorLyoKKyAqIFZhbHVlIHRvIHBhc3MgdG8gcGNhcF9jb21waWxlKCkgYXMgdGhlIG5ldG1hc2sgaWYgeW91IGRvbid0IGtub3cgd2hhdAorICogdGhlIG5ldG1hc2sgaXMuCisgKi8KKyNkZWZpbmUgUENBUF9ORVRNQVNLX1VOS05PV04gICAgMHhmZmZmZmZmZgorI2VuZGlmCisKK25hbWVzcGFjZSBuZmQgeworCitORkRfTE9HX0lOSVQoIkV0aGVybmV0RmFjZSIpOworCitjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBFdGhlcm5ldEZhY2U6OlJFQVNTRU1CTEVSX0xJRkVUSU1FID0gdGltZTo6c2Vjb25kcyg2MCk7CisKK0V0aGVybmV0RmFjZTo6RXRoZXJuZXRGYWNlKGNvbnN0IHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OnBvc2l4OjpzdHJlYW1fZGVzY3JpcHRvcj4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5ldHdvcmtJbnRlcmZhY2VJbmZvJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldGhlcm5ldDo6QWRkcmVzcyYgYWRkcmVzcykKKyAgOiBGYWNlKEZhY2VVcmkoYWRkcmVzcyksIEZhY2VVcmk6OmZyb21EZXYoaW50ZXJmYWNlLm5hbWUpKQorICAsIG1fcGNhcChudWxscHRyLCBwY2FwX2Nsb3NlKQorICAsIG1fc29ja2V0KHNvY2tldCkKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgLCBtX2ludGVyZmFjZUluZGV4KGludGVyZmFjZS5pbmRleCkKKyNlbmRpZgorICAsIG1faW50ZXJmYWNlTmFtZShpbnRlcmZhY2UubmFtZSkKKyAgLCBtX3NyY0FkZHJlc3MoaW50ZXJmYWNlLmV0aGVyQWRkcmVzcykKKyAgLCBtX2Rlc3RBZGRyZXNzKGFkZHJlc3MpCit7CisgIE5GRF9MT0dfSU5GTygiQ3JlYXRpbmcgZXRoZXJuZXQgZmFjZSBvbiAiIDw8IG1faW50ZXJmYWNlTmFtZSA8PCAiOiAiCisgICAgICAgICAgICAgICA8PCBtX3NyY0FkZHJlc3MgPDwgIiA8LS0+ICIgPDwgbV9kZXN0QWRkcmVzcyk7CisgIHBjYXBJbml0KCk7CisKKyAgaW50IGZkID0gcGNhcF9nZXRfc2VsZWN0YWJsZV9mZChtX3BjYXAuZ2V0KCkpOworICBpZiAoZmQgPCAwKQorICAgIHRocm93IEVycm9yKCJwY2FwX2dldF9zZWxlY3RhYmxlX2ZkIGZhaWxlZCIpOworCisgIC8vIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBmZCwgb3RoZXJ3aXNlIGJvdGggcGNhcF9jbG9zZSgpCisgIC8vIGFuZCBzdHJlYW1fZGVzY3JpcHRvcjo6Y2xvc2UoKSB3aWxsIHRyeSB0byBjbG9zZSB0aGUKKyAgLy8gc2FtZSBmZCBhbmQgb25lIG9mIHRoZW0gd2lsbCBmYWlsCisgIG1fc29ja2V0LT5hc3NpZ24oOjpkdXAoZmQpKTsKKworICBtX2ludGVyZmFjZU10dSA9IGdldEludGVyZmFjZU10dSgpOworICBORkRfTE9HX0RFQlVHKCJbaWQ6IiA8PCBnZXRJZCgpIDw8ICIsZW5kcG9pbnQ6IiA8PCBtX2ludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgICA8PCAiXSBJbnRlcmZhY2UgTVRVIGlzOiAiIDw8IG1faW50ZXJmYWNlTXR1KTsKKworICBtX3NsaWNlci5yZXNldChuZXcgbmRubHA6OlNsaWNlcihtX2ludGVyZmFjZU10dSkpOworCisgIGNoYXIgZmlsdGVyWzEwMF07CisgIHN0ZDo6c25wcmludGYoZmlsdGVyLCBzaXplb2YoZmlsdGVyKSwKKyAgICAgICAgICAgICAgICAiKGV0aGVyIHByb3RvIDB4JXgpICYmIChldGhlciBkc3QgJXMpICYmIChub3QgZXRoZXIgc3JjICVzKSIsCisgICAgICAgICAgICAgICAgZXRoZXJuZXQ6OkVUSEVSVFlQRV9ORE4sCisgICAgICAgICAgICAgICAgbV9kZXN0QWRkcmVzcy50b1N0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgbV9zcmNBZGRyZXNzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgIHNldFBhY2tldEZpbHRlcihmaWx0ZXIpOworCisgIGlmICghbV9kZXN0QWRkcmVzcy5pc0Jyb2FkY2FzdCgpICYmICFqb2luTXVsdGljYXN0R3JvdXAoKSkKKyAgICB7CisgICAgICBORkRfTE9HX1dBUk4oIltpZDoiIDw8IGdldElkKCkgPDwgIixlbmRwb2ludDoiIDw8IG1faW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICAgIDw8ICJdIEZhbGxpbmcgYmFjayB0byBwcm9taXNjdW91cyBtb2RlIik7CisgICAgICBwY2FwX3NldF9wcm9taXNjKG1fcGNhcC5nZXQoKSwgMSk7CisgICAgfQorCisgIG1fc29ja2V0LT5hc3luY19yZWFkX3NvbWUoYm9vc3Q6OmFzaW86Om51bGxfYnVmZmVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkV0aGVybmV0RmFjZTo6aGFuZGxlUmVhZCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojphc2lvOjpwbGFjZWhvbGRlcnM6OmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmFzaW86OnBsYWNlaG9sZGVyczo6Ynl0ZXNfdHJhbnNmZXJyZWQpKTsKK30KKworRXRoZXJuZXRGYWNlOjp+RXRoZXJuZXRGYWNlKCkKK3sKK30KKwordm9pZAorRXRoZXJuZXRGYWNlOjpzZW5kSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQoreworICBvblNlbmRJbnRlcmVzdChpbnRlcmVzdCk7CisgIG5kbmxwOjpQYWNrZXRBcnJheSBwYSA9IG1fc2xpY2VyLT5zbGljZShpbnRlcmVzdC53aXJlRW5jb2RlKCkpOworICBmb3IgKGNvbnN0IGF1dG8mIHBhY2tldCA6ICpwYSkgeworICAgIHNlbmRQYWNrZXQocGFja2V0KTsKKyAgfQorfQorCit2b2lkCitFdGhlcm5ldEZhY2U6OnNlbmREYXRhKGNvbnN0IERhdGEmIGRhdGEpCit7CisgIG9uU2VuZERhdGEoZGF0YSk7CisgIG5kbmxwOjpQYWNrZXRBcnJheSBwYSA9IG1fc2xpY2VyLT5zbGljZShkYXRhLndpcmVFbmNvZGUoKSk7CisgIGZvciAoY29uc3QgYXV0byYgcGFja2V0IDogKnBhKSB7CisgICAgc2VuZFBhY2tldChwYWNrZXQpOworICB9Cit9CisKK3ZvaWQKK0V0aGVybmV0RmFjZTo6Y2xvc2UoKQoreworICBpZiAoIW1fcGNhcCkKKyAgICByZXR1cm47CisKKyAgTkZEX0xPR19JTkZPKCJbaWQ6IiA8PCBnZXRJZCgpIDw8ICIsZW5kcG9pbnQ6IiA8PCBtX2ludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJdIENsb3NpbmcgZmFjZSIpOworCisgIGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZXJyb3I7CisgIG1fc29ja2V0LT5jYW5jZWwoZXJyb3IpOyAvLyBpZ25vcmUgZXJyb3JzCisgIG1fc29ja2V0LT5jbG9zZShlcnJvcik7ICAvLyBpZ25vcmUgZXJyb3JzCisgIG1fcGNhcC5yZXNldChudWxscHRyKTsKKworICBmYWlsKCJGYWNlIGNsb3NlZCIpOworfQorCit2b2lkCitFdGhlcm5ldEZhY2U6OnBjYXBJbml0KCkKK3sKKyAgY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV0gPSB7fTsKKyAgbV9wY2FwLnJlc2V0KHBjYXBfY3JlYXRlKG1faW50ZXJmYWNlTmFtZS5jX3N0cigpLCBlcnJidWYpKTsKKyAgaWYgKCFtX3BjYXApCisgICAgdGhyb3cgRXJyb3IoInBjYXBfY3JlYXRlOiAiICsgc3RkOjpzdHJpbmcoZXJyYnVmKSk7CisKKyNpZmRlZiBIQVZFX1BDQVBfU0VUX0lNTUVESUFURV9NT0RFCisgIC8vIEVuYWJsZSAiaW1tZWRpYXRlIG1vZGUiLCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgYW55IHJlYWQgYnVmZmVyaW5nIGluIHRoZSBrZXJuZWwuCisgIC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIEJJT0NJTU1FRElBVEUgaW9jdGwgb24gQlNELWxpa2Ugc3lzdGVtcyAoaW5jbHVkaW5nIE9TIFgpCisgIC8vIHdoZXJlIGxpYnBjYXAgdXNlcyBhIEJQRiBkZXZpY2UuIE9uIExpbnV4IHRoaXMgZm9yY2VzIGxpYnBjYXAgbm90IHRvIHVzZSBUUEFDS0VUX1YzLAorICAvLyBldmVuIGlmIHRoZSBrZXJuZWwgc3VwcG9ydHMgaXQsIHRodXMgcHJldmVudGluZyBidWcgIzE1MTEuCisgIHBjYXBfc2V0X2ltbWVkaWF0ZV9tb2RlKG1fcGNhcC5nZXQoKSwgMSk7CisjZW5kaWYKKworICBpZiAocGNhcF9hY3RpdmF0ZShtX3BjYXAuZ2V0KCkpIDwgMCkKKyAgICB0aHJvdyBFcnJvcigicGNhcF9hY3RpdmF0ZSBmYWlsZWQiKTsKKworICBpZiAocGNhcF9zZXRfZGF0YWxpbmsobV9wY2FwLmdldCgpLCBETFRfRU4xME1CKSA8IDApCisgICAgdGhyb3cgRXJyb3IoInBjYXBfc2V0X2RhdGFsaW5rOiAiICsgc3RkOjpzdHJpbmcocGNhcF9nZXRlcnIobV9wY2FwLmdldCgpKSkpOworCisgIGlmIChwY2FwX3NldGRpcmVjdGlvbihtX3BjYXAuZ2V0KCksIFBDQVBfRF9JTikgPCAwKQorICAgIC8vIG5vIG5lZWQgdG8gdGhyb3cgb24gZmFpbHVyZSwgQlBGIHdpbGwgZmlsdGVyIHVud2FudGVkIHBhY2tldHMgYW55d2F5CisgICAgTkZEX0xPR19XQVJOKCJwY2FwX3NldGRpcmVjdGlvbjogIiA8PCBwY2FwX2dldGVycihtX3BjYXAuZ2V0KCkpKTsKK30KKwordm9pZAorRXRoZXJuZXRGYWNlOjpzZXRQYWNrZXRGaWx0ZXIoY29uc3QgY2hhciogZmlsdGVyU3RyaW5nKQoreworICBicGZfcHJvZ3JhbSBmaWx0ZXI7CisgIGlmIChwY2FwX2NvbXBpbGUobV9wY2FwLmdldCgpLCAmZmlsdGVyLCBmaWx0ZXJTdHJpbmcsIDEsIFBDQVBfTkVUTUFTS19VTktOT1dOKSA8IDApCisgICAgdGhyb3cgRXJyb3IoInBjYXBfY29tcGlsZTogIiArIHN0ZDo6c3RyaW5nKHBjYXBfZ2V0ZXJyKG1fcGNhcC5nZXQoKSkpKTsKKworICBpbnQgcmV0ID0gcGNhcF9zZXRmaWx0ZXIobV9wY2FwLmdldCgpLCAmZmlsdGVyKTsKKyAgcGNhcF9mcmVlY29kZSgmZmlsdGVyKTsKKyAgaWYgKHJldCA8IDApCisgICAgdGhyb3cgRXJyb3IoInBjYXBfc2V0ZmlsdGVyOiAiICsgc3RkOjpzdHJpbmcocGNhcF9nZXRlcnIobV9wY2FwLmdldCgpKSkpOworfQorCitib29sCitFdGhlcm5ldEZhY2U6OmpvaW5NdWx0aWNhc3RHcm91cCgpCit7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgIHBhY2tldF9tcmVxIG1ye307CisgIG1yLm1yX2lmaW5kZXggPSBtX2ludGVyZmFjZUluZGV4OworICBtci5tcl90eXBlID0gUEFDS0VUX01SX01VTFRJQ0FTVDsKKyAgbXIubXJfYWxlbiA9IG1fZGVzdEFkZHJlc3Muc2l6ZSgpOworICBzdGQ6OmNvcHkobV9kZXN0QWRkcmVzcy5iZWdpbigpLCBtX2Rlc3RBZGRyZXNzLmVuZCgpLCBtci5tcl9hZGRyZXNzKTsKKworICBpZiAoOjpzZXRzb2Nrb3B0KG1fc29ja2V0LT5uYXRpdmVfaGFuZGxlKCksIFNPTF9QQUNLRVQsCisgICAgICAgICAgICAgICAgICAgUEFDS0VUX0FERF9NRU1CRVJTSElQLCAmbXIsIHNpemVvZihtcikpID09IDApCisgICAgcmV0dXJuIHRydWU7IC8vIHN1Y2Nlc3MKKworICBORkRfTE9HX1dBUk4oIltpZDoiIDw8IGdldElkKCkgPDwgIixlbmRwb2ludDoiIDw8IG1faW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIl0gc2V0c29ja29wdChQQUNLRVRfQUREX01FTUJFUlNISVApIGZhaWxlZDogIiA8PCBzdGQ6OnN0cmVycm9yKGVycm5vKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoU0lPQ0FERE1VTFRJKQorICBpZnJlcSBpZnJ7fTsKKyAgc3RkOjpzdHJuY3B5KGlmci5pZnJfbmFtZSwgbV9pbnRlcmZhY2VOYW1lLmNfc3RyKCksIHNpemVvZihpZnIuaWZyX25hbWUpIC0gMSk7CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgLy8gc2VlIGJ1ZyAjMjMyNworICB1c2luZyBib29zdDo6YXNpbzo6aXA6OnVkcDsKKyAgdWRwOjpzb2NrZXQgc29jayhyZWYoZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpLCB1ZHA6OnY0KCkpOworICBpbnQgZmQgPSBzb2NrLm5hdGl2ZV9oYW5kbGUoKTsKKworICAvKgorICAgKiBEaWZmZXJlbmNlcyBiZXR3ZWVuIExpbnV4IGFuZCB0aGUgQlNEcyAoaW5jbHVkaW5nIE9TIFgpOgorICAgKiAgIG8gQlNEIGRvZXMgbm90IGhhdmUgaWZyX2h3YWRkcjsgdXNlIGlmcl9hZGRyIGluc3RlYWQuCisgICAqICAgbyBXaGlsZSBPUyBYIHNlZW1zIHRvIGFjY2VwdCBib3RoIEFGX0xJTksgYW5kIEFGX1VOU1BFQyBhcyB0aGUgYWRkcmVzcworICAgKiAgICAgZmFtaWx5LCBGcmVlQlNEIGV4cGxpY2l0bHkgcmVxdWlyZXMgQUZfTElOSywgc28gd2UgaGF2ZSB0byB1c2UgQUZfTElOSworICAgKiAgICAgYW5kIHNvY2thZGRyX2RsIGluc3RlYWQgb2YgdGhlIGdlbmVyaWMgc29ja2FkZHIgc3RydWN0dXJlLgorICAgKiAgIG8gQlNEJ3Mgc29ja2FkZHIgKGFuZCBzb2NrYWRkcl9kbCBpbiBwYXJ0aWN1bGFyKSBjb250YWlucyBhbiBhZGRpdGlvbmFsCisgICAqICAgICBmaWVsZCwgc2FfbGVuIChzZGxfbGVuKSwgd2hpY2ggbXVzdCBiZSBzZXQgdG8gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUKKyAgICogICAgIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmLgorICAgKiAgIG8gV2UgZG8gbm90IHNwZWNpZnkgdGhlIGludGVyZmFjZSBuYW1lLCB0aHVzIHNkbF9ubGVuIGlzIGxlZnQgYXQgMCBhbmQKKyAgICogICAgIExMQUREUiBpcyBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyBzZGxfZGF0YS4KKyAgICovCisgIHNvY2thZGRyX2RsKiBzZGwgPSByZWludGVycHJldF9jYXN0PHNvY2thZGRyX2RsKj4oJmlmci5pZnJfYWRkcik7CisgIHNkbC0+c2RsX2xlbiA9IHNpemVvZihpZnIuaWZyX2FkZHIpOworICBzZGwtPnNkbF9mYW1pbHkgPSBBRl9MSU5LOworICBzZGwtPnNkbF9hbGVuID0gbV9kZXN0QWRkcmVzcy5zaXplKCk7CisgIHN0ZDo6Y29weShtX2Rlc3RBZGRyZXNzLmJlZ2luKCksIG1fZGVzdEFkZHJlc3MuZW5kKCksIExMQUREUihzZGwpKTsKKworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpZnIuaWZyX2FkZHIpID49IG9mZnNldG9mKHNvY2thZGRyX2RsLCBzZGxfZGF0YSkgKyBldGhlcm5ldDo6QUREUl9MRU4sCisgICAgICAgICAgICAgICAgImlmcl9hZGRyIGluIHN0cnVjdCBpZnJlcSBpcyB0b28gc21hbGwgb24gdGhpcyBwbGF0Zm9ybSIpOworI2Vsc2UKKyAgaW50IGZkID0gbV9zb2NrZXQtPm5hdGl2ZV9oYW5kbGUoKTsKKworICBpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIHN0ZDo6Y29weShtX2Rlc3RBZGRyZXNzLmJlZ2luKCksIG1fZGVzdEFkZHJlc3MuZW5kKCksIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEpOworCisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGlmci5pZnJfaHdhZGRyKSA+PSBvZmZzZXRvZihzb2NrYWRkciwgc2FfZGF0YSkgKyBldGhlcm5ldDo6QUREUl9MRU4sCisgICAgICAgICAgICAgICAgImlmcl9od2FkZHIgaW4gc3RydWN0IGlmcmVxIGlzIHRvbyBzbWFsbCBvbiB0aGlzIHBsYXRmb3JtIik7CisjZW5kaWYKKworICBpZiAoOjppb2N0bChmZCwgU0lPQ0FERE1VTFRJLCAmaWZyKSA9PSAwKQorICAgIHJldHVybiB0cnVlOyAvLyBzdWNjZXNzCisKKyAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCBnZXRJZCgpIDw8ICIsZW5kcG9pbnQ6IiA8PCBtX2ludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJdIGlvY3RsKFNJT0NBRERNVUxUSSkgZmFpbGVkOiAiIDw8IHN0ZDo6c3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZgorCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZAorRXRoZXJuZXRGYWNlOjpzZW5kUGFja2V0KGNvbnN0IG5kbjo6QmxvY2smIGJsb2NrKQoreworICBpZiAoIW1fcGNhcCkKKyAgICB7CisgICAgICBORkRfTE9HX1dBUk4oIltpZDoiIDw8IGdldElkKCkgPDwgIixlbmRwb2ludDoiIDw8IG1faW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICAgIDw8ICJdIFRyeWluZyB0byBzZW5kIG9uIGNsb3NlZCBmYWNlIik7CisgICAgICByZXR1cm4gZmFpbCgiRmFjZSBjbG9zZWQiKTsKKyAgICB9CisKKyAgQk9PU1RfQVNTRVJUKGJsb2NrLnNpemUoKSA8PSBtX2ludGVyZmFjZU10dSk7CisKKyAgLy8vIFx0b2RvIFJpZ2h0IG5vdyB0aGVyZSBpcyBubyByZXNlcnZlIHdoZW4gcGFja2V0IGlzIHJlY2VpdmVkLCBidXQKKyAgLy8vICAgICAgIHdlIHNob3VsZCByZXNlcnZlIHNvbWUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgYXQgdGhlIGVuZAorICBuZG46OkVuY29kaW5nQnVmZmVyIGJ1ZmZlcihibG9jayk7CisKKyAgLy8gcGFkIHdpdGggemVyb2VzIGlmIHRoZSBwYXlsb2FkIGlzIHRvbyBzaG9ydAorICBpZiAoYmxvY2suc2l6ZSgpIDwgZXRoZXJuZXQ6Ok1JTl9EQVRBX0xFTikKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwYWRkaW5nW2V0aGVybmV0OjpNSU5fREFUQV9MRU5dID0ge307CisgICAgICBidWZmZXIuYXBwZW5kQnl0ZUFycmF5KHBhZGRpbmcsIGV0aGVybmV0OjpNSU5fREFUQV9MRU4gLSBibG9jay5zaXplKCkpOworICAgIH0KKworICAvLyBjb25zdHJ1Y3QgYW5kIHByZXBlbmQgdGhlIGV0aGVybmV0IGhlYWRlcgorICBzdGF0aWMgdWludDE2X3QgZXRoZXJ0eXBlID0gaHRvbnMoZXRoZXJuZXQ6OkVUSEVSVFlQRV9ORE4pOworICBidWZmZXIucHJlcGVuZEJ5dGVBcnJheShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmZXRoZXJ0eXBlKSwgZXRoZXJuZXQ6OlRZUEVfTEVOKTsKKyAgYnVmZmVyLnByZXBlbmRCeXRlQXJyYXkobV9zcmNBZGRyZXNzLmRhdGEoKSwgbV9zcmNBZGRyZXNzLnNpemUoKSk7CisgIGJ1ZmZlci5wcmVwZW5kQnl0ZUFycmF5KG1fZGVzdEFkZHJlc3MuZGF0YSgpLCBtX2Rlc3RBZGRyZXNzLnNpemUoKSk7CisKKyAgLy8gc2VuZCB0aGUgcGFja2V0CisgIGludCBzZW50ID0gcGNhcF9pbmplY3QobV9wY2FwLmdldCgpLCBidWZmZXIuYnVmKCksIGJ1ZmZlci5zaXplKCkpOworICBpZiAoc2VudCA8IDApCisgICAgeworICAgICAgcmV0dXJuIGZhaWwoInBjYXBfaW5qZWN0OiAiICsgc3RkOjpzdHJpbmcocGNhcF9nZXRlcnIobV9wY2FwLmdldCgpKSkpOworICAgIH0KKyAgZWxzZSBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihzZW50KSA8IGJ1ZmZlci5zaXplKCkpCisgICAgeworICAgICAgcmV0dXJuIGZhaWwoIkZhaWxlZCB0byBpbmplY3QgZnJhbWUiKTsKKyAgICB9CisKKyAgTkZEX0xPR19UUkFDRSgiW2lkOiIgPDwgZ2V0SWQoKSA8PCAiLGVuZHBvaW50OiIgPDwgbV9pbnRlcmZhY2VOYW1lCisgICAgICAgICAgICAgICAgPDwgIl0gU3VjY2Vzc2Z1bGx5IHNlbnQ6ICIgPDwgYmxvY2suc2l6ZSgpIDw8ICIgYnl0ZXMiKTsKKyAgdGhpcy0+Z2V0TXV0YWJsZUNvdW50ZXJzKCkuZ2V0Tk91dEJ5dGVzKCkgKz0gYmxvY2suc2l6ZSgpOworfQorCit2b2lkCitFdGhlcm5ldEZhY2U6OmhhbmRsZVJlYWQoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsIHNpemVfdCkKK3sKKyAgaWYgKCFtX3BjYXApCisgICAgcmV0dXJuIGZhaWwoIkZhY2UgY2xvc2VkIik7CisKKyAgaWYgKGVycm9yKQorICAgIHJldHVybiBwcm9jZXNzRXJyb3JDb2RlKGVycm9yKTsKKworICBwY2FwX3BrdGhkciogaGVhZGVyOworICBjb25zdCB1aW50OF90KiBwYWNrZXQ7CisgIGludCByZXQgPSBwY2FwX25leHRfZXgobV9wY2FwLmdldCgpLCAmaGVhZGVyLCAmcGFja2V0KTsKKyAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgcmV0dXJuIGZhaWwoInBjYXBfbmV4dF9leDogIiArIHN0ZDo6c3RyaW5nKHBjYXBfZ2V0ZXJyKG1fcGNhcC5nZXQoKSkpKTsKKyAgICB9CisgIGVsc2UgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgZ2V0SWQoKSA8PCAiLGVuZHBvaW50OiIgPDwgbV9pbnRlcmZhY2VOYW1lIDw8ICJdIFJlYWQgdGltZW91dCIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByb2Nlc3NJbmNvbWluZ1BhY2tldChoZWFkZXIsIHBhY2tldCk7CisgICAgfQorCisgIG1fc29ja2V0LT5hc3luY19yZWFkX3NvbWUoYm9vc3Q6OmFzaW86Om51bGxfYnVmZmVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkV0aGVybmV0RmFjZTo6aGFuZGxlUmVhZCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojphc2lvOjpwbGFjZWhvbGRlcnM6OmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmFzaW86OnBsYWNlaG9sZGVyczo6Ynl0ZXNfdHJhbnNmZXJyZWQpKTsKK30KKwordm9pZAorRXRoZXJuZXRGYWNlOjpwcm9jZXNzSW5jb21pbmdQYWNrZXQoY29uc3QgcGNhcF9wa3RoZHIqIGhlYWRlciwgY29uc3QgdWludDhfdCogcGFja2V0KQoreworICBzaXplX3QgbGVuZ3RoID0gaGVhZGVyLT5jYXBsZW47CisgIGlmIChsZW5ndGggPCBldGhlcm5ldDo6SERSX0xFTiArIGV0aGVybmV0OjpNSU5fREFUQV9MRU4pCisgICAgeworICAgICAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCBnZXRJZCgpIDw8ICIsZW5kcG9pbnQ6IiA8PCBtX2ludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiXSBSZWNlaXZlZCBmcmFtZSBpcyB0b28gc2hvcnQgKCIgPDwgbGVuZ3RoIDw8ICIgYnl0ZXMpIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbnN0IGV0aGVyX2hlYWRlciogZWggPSByZWludGVycHJldF9jYXN0PGNvbnN0IGV0aGVyX2hlYWRlcio+KHBhY2tldCk7CisgIGNvbnN0IGV0aGVybmV0OjpBZGRyZXNzIHNvdXJjZUFkZHJlc3MoZWgtPmV0aGVyX3Nob3N0KTsKKworICAvLyBhc3NlcnQgaW4gY2FzZSBCUEYgZmFpbHMgdG8gZmlsdGVyIHVud2FudGVkIGZyYW1lcworICBCT09TVF9BU1NFUlRfTVNHKGV0aGVybmV0OjpBZGRyZXNzKGVoLT5ldGhlcl9kaG9zdCkgPT0gbV9kZXN0QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgZnJhbWUgYWRkcmVzc2VkIHRvIGEgZGlmZmVyZW50IG11bHRpY2FzdCBncm91cCIpOworICBCT09TVF9BU1NFUlRfTVNHKHNvdXJjZUFkZHJlc3MgIT0gbV9zcmNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBmcmFtZSBzZW50IGJ5IHRoaXMgaG9zdCIpOworICBCT09TVF9BU1NFUlRfTVNHKG50b2hzKGVoLT5ldGhlcl90eXBlKSA9PSBldGhlcm5ldDo6RVRIRVJUWVBFX05ETiwKKyAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgZnJhbWUgd2l0aCB1bnJlY29nbml6ZWQgZXRoZXJ0eXBlIik7CisKKyAgcGFja2V0ICs9IGV0aGVybmV0OjpIRFJfTEVOOworICBsZW5ndGggLT0gZXRoZXJuZXQ6OkhEUl9MRU47CisKKyAgLy8vIFx0b2RvIFJlc2VydmUgc3BhY2UgaW4gZnJvbnQgYW5kIGF0IHRoZSBiYWNrIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlcgorICBCbG9jayBmcmFnbWVudDsKKyAgYm9vbCBpc09rID0gQmxvY2s6OmZyb21CdWZmZXIocGFja2V0LCBsZW5ndGgsIGZyYWdtZW50KTsKKyAgaWYgKCFpc09rKQorICAgIHsKKyAgICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgZ2V0SWQoKSA8PCAiLGVuZHBvaW50OiIgPDwgbV9pbnRlcmZhY2VOYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIl0gQmxvY2sgcmVjZWl2ZWQgZnJvbSAiIDw8IHNvdXJjZUFkZHJlc3MudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgaW52YWxpZCBvciB0b28gbGFyZ2UgdG8gcHJvY2VzcyIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBORkRfTE9HX1RSQUNFKCJbaWQ6IiA8PCBnZXRJZCgpIDw8ICIsZW5kcG9pbnQ6IiA8PCBtX2ludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgICA8PCAiXSBSZWNlaXZlZDogIiA8PCBmcmFnbWVudC5zaXplKCkgPDwgIiBieXRlcyBmcm9tICIKKyAgICAgICAgICAgICAgICA8PCBzb3VyY2VBZGRyZXNzLnRvU3RyaW5nKCkpOworICB0aGlzLT5nZXRNdXRhYmxlQ291bnRlcnMoKS5nZXROSW5CeXRlcygpICs9IGZyYWdtZW50LnNpemUoKTsKKworICBSZWFzc2VtYmxlciYgcmVhc3NlbWJsZXIgPSBtX3JlYXNzZW1ibGVyc1tzb3VyY2VBZGRyZXNzXTsKKyAgaWYgKCFyZWFzc2VtYmxlci5wbXMpCisgICAgeworICAgICAgLy8gbmV3IHNlbmRlciwgc2V0dXAgYSBQYXJ0aWFsTWVzc2FnZVN0b3JlIGZvciBpdAorICAgICAgcmVhc3NlbWJsZXIucG1zLnJlc2V0KG5ldyBuZG5scDo6UGFydGlhbE1lc3NhZ2VTdG9yZSk7CisgICAgICByZWFzc2VtYmxlci5wbXMtPm9uUmVjZWl2ZSArPQorICAgICAgICBbdGhpcywgc291cmNlQWRkcmVzc10gKGNvbnN0IEJsb2NrJiBibG9jaykgeworICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoIltpZDoiIDw8IGdldElkKCkgPDwgIixlbmRwb2ludDoiIDw8IG1faW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0gQWxsIGZyYWdtZW50cyByZWNlaXZlZCBmcm9tICIgPDwgc291cmNlQWRkcmVzcy50b1N0cmluZygpKTsKKyAgICAgICAgICBpZiAoIWRlY29kZUFuZERpc3BhdGNoSW5wdXQoYmxvY2spKQorICAgICAgICAgICAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCBnZXRJZCgpIDw8ICIsZW5kcG9pbnQ6IiA8PCBtX2ludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSBSZWNlaXZlZCB1bnJlY29nbml6ZWQgVExWIGJsb2NrIG9mIHR5cGUgIiA8PCBibG9jay50eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZyb20gIiA8PCBzb3VyY2VBZGRyZXNzLnRvU3RyaW5nKCkpOworICAgICAgICB9OworICAgIH0KKworICBzY2hlZHVsZXI6OmNhbmNlbChyZWFzc2VtYmxlci5leHBpcmVFdmVudCk7CisgIHJlYXNzZW1ibGVyLmV4cGlyZUV2ZW50ID0gc2NoZWR1bGVyOjpzY2hlZHVsZShSRUFTU0VNQkxFUl9MSUZFVElNRSwKKyAgICBbdGhpcywgc291cmNlQWRkcmVzc10geworICAgICAgQk9PU1RfVkVSSUZZKG1fcmVhc3NlbWJsZXJzLmVyYXNlKHNvdXJjZUFkZHJlc3MpID09IDEpOworICAgIH0pOworCisgIHRyeSB7CisgICAgcmVhc3NlbWJsZXIucG1zLT5yZWNlaXZlTmRubHBEYXRhKGZyYWdtZW50KTsKKyAgfQorICBjYXRjaCAoY29uc3QgbmRubHA6OlBhcnNlRXJyb3ImIGUpIHsKKyAgICBORkRfTE9HX1dBUk4oIltpZDoiIDw8IGdldElkKCkgPDwgIixlbmRwb2ludDoiIDw8IG1faW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICA8PCAiXSBSZWNlaXZlZCBpbnZhbGlkIE5ETkxQIGZyYWdtZW50IGZyb20gIgorICAgICAgICAgICAgICAgICA8PCBzb3VyY2VBZGRyZXNzLnRvU3RyaW5nKCkgPDwgIiA6ICIgPDwgZS53aGF0KCkpOworICB9Cit9CisKK3ZvaWQKK0V0aGVybmV0RmFjZTo6cHJvY2Vzc0Vycm9yQ29kZShjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvcikKK3sKKyAgaWYgKGVycm9yID09IGJvb3N0Ojphc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQpCisgICAgLy8gY2FuY2VsKCkgaGFzIGJlZW4gY2FsbGVkIG9uIHRoZSBzb2NrZXQKKyAgICByZXR1cm47CisKKyAgc3RkOjpzdHJpbmcgbXNnOworICBpZiAoZXJyb3IgPT0gYm9vc3Q6OmFzaW86OmVycm9yOjplb2YpCisgICAgeworICAgICAgbXNnID0gIkZhY2UgY2xvc2VkIjsKKyAgICAgIE5GRF9MT0dfREVCVUcoIltpZDoiIDw8IGdldElkKCkgPDwgIixlbmRwb2ludDoiIDw8IG1faW50ZXJmYWNlTmFtZSA8PCAiXSAiIDw8IG1zZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXNnID0gIlJlY2VpdmUgb3BlcmF0aW9uIGZhaWxlZDogIiArIGVycm9yLm1lc3NhZ2UoKTsKKyAgICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgZ2V0SWQoKSA8PCAiLGVuZHBvaW50OiIgPDwgbV9pbnRlcmZhY2VOYW1lIDw8ICJdICIgPDwgbXNnKTsKKyAgICB9CisgIGZhaWwobXNnKTsKK30KKworc2l6ZV90CitFdGhlcm5ldEZhY2U6OmdldEludGVyZmFjZU10dSgpIGNvbnN0Cit7CisjaWZkZWYgU0lPQ0dJRk1UVQorI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorICAvLyBzZWUgYnVnICMyMzI4CisgIHVzaW5nIGJvb3N0Ojphc2lvOjppcDo6dWRwOworICB1ZHA6OnNvY2tldCBzb2NrKHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSksIHVkcDo6djQoKSk7CisgIGludCBmZCA9IHNvY2submF0aXZlX2hhbmRsZSgpOworI2Vsc2UKKyAgaW50IGZkID0gbV9zb2NrZXQtPm5hdGl2ZV9oYW5kbGUoKTsKKyNlbmRpZgorCisgIGlmcmVxIGlmcnt9OworICBzdGQ6OnN0cm5jcHkoaWZyLmlmcl9uYW1lLCBtX2ludGVyZmFjZU5hbWUuY19zdHIoKSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkgLSAxKTsKKworICBpZiAoOjppb2N0bChmZCwgU0lPQ0dJRk1UVSwgJmlmcikgPT0gMCkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihpZnIuaWZyX210dSk7CisKKyAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCBnZXRJZCgpIDw8ICIsZW5kcG9pbnQ6IiA8PCBtX2ludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJdIEZhaWxlZCB0byBnZXQgaW50ZXJmYWNlIE1UVTogIiA8PCBzdGQ6OnN0cmVycm9yKGVycm5vKSk7CisjZW5kaWYKKworICByZXR1cm4gZXRoZXJuZXQ6Ok1BWF9EQVRBX0xFTjsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvZXRoZXJuZXQtZmFjZS5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvZXRoZXJuZXQtZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmE2MgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9ldGhlcm5ldC1mYWNlLmhwcApAQCAtMCwwICsxLDE2OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfRVRIRVJORVRfRkFDRV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX0VUSEVSTkVUX0ZBQ0VfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgImZhY2UuaHBwIgorI2luY2x1ZGUgIm5kbmxwLXBhcnRpYWwtbWVzc2FnZS1zdG9yZS5ocHAiCisjaW5jbHVkZSAibmRubHAtc2xpY2VyLmhwcCIKKyNpbmNsdWRlICJjb3JlL25ldHdvcmstaW50ZXJmYWNlLmhwcCIKKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpZm5kZWYgSEFWRV9MSUJQQ0FQCisjZXJyb3IgIkNhbm5vdCBpbmNsdWRlIHRoaXMgZmlsZSB3aGVuIGxpYnBjYXAgaXMgbm90IGF2YWlsYWJsZSIKKyNlbmRpZgorCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucworc3RydWN0IHBjYXA7Cit0eXBlZGVmIHBjYXAgcGNhcF90Oworc3RydWN0IHBjYXBfcGt0aGRyOworCituYW1lc3BhY2UgbmZkIHsKKworLyoqCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgRmFjZSBhYnN0cmFjdGlvbiB0aGF0IHVzZXMgcmF3CisgKiAgICAgICAgRXRoZXJuZXQgZnJhbWVzIGFzIHVuZGVybHlpbmcgdHJhbnNwb3J0IG1lY2hhbmlzbQorICovCitjbGFzcyBFdGhlcm5ldEZhY2UgOiBwdWJsaWMgRmFjZQoreworcHVibGljOgorICAvKioKKyAgICogQGJyaWVmIEV0aGVybmV0RmFjZS1yZWxhdGVkIGVycm9yCisgICAqLworICBzdHJ1Y3QgRXJyb3IgOiBwdWJsaWMgRmFjZTo6RXJyb3IKKyAgeworICAgIEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0KSA6IEZhY2U6OkVycm9yKHdoYXQpIHt9CisgIH07CisKKyAgRXRoZXJuZXRGYWNlKGNvbnN0IHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OnBvc2l4OjpzdHJlYW1fZGVzY3JpcHRvcj4mIHNvY2tldCwKKyAgICAgICAgICAgICAgIGNvbnN0IE5ldHdvcmtJbnRlcmZhY2VJbmZvJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICBjb25zdCBldGhlcm5ldDo6QWRkcmVzcyYgYWRkcmVzcyk7CisKKyAgdmlydHVhbAorICB+RXRoZXJuZXRGYWNlKCk7CisKKyAgLy8vIHNlbmQgYW4gSW50ZXJlc3QKKyAgdmlydHVhbCB2b2lkCisgIHNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpOworCisgIC8vLyBzZW5kIGEgRGF0YQorICB2aXJ0dWFsIHZvaWQKKyAgc2VuZERhdGEoY29uc3QgRGF0YSYgZGF0YSk7CisKKyAgLyoqCisgICAqIEBicmllZiBDbG9zZXMgdGhlIGZhY2UKKyAgICoKKyAgICogVGhpcyB0ZXJtaW5hdGVzIGFsbCBjb21tdW5pY2F0aW9uIG9uIHRoZSBmYWNlIGFuZCB0cmlnZ2VycyB0aGUgb25GYWlsKCkgZXZlbnQuCisgICAqLworICB2aXJ0dWFsIHZvaWQKKyAgY2xvc2UoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEBicmllZiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEgbGlicGNhcCBjb250ZXh0IGZvciBsaXZlIGNhcHR1cmUKKyAgICovCisgIHZvaWQKKyAgcGNhcEluaXQoKTsKKworICAvKioKKyAgICogQGJyaWVmIEluc3RhbGxzIGEgQlBGIGZpbHRlciBvbiB0aGUgcmVjZWl2aW5nIHNvY2tldAorICAgKgorICAgKiBAcGFyYW0gZmlsdGVyU3RyaW5nIHN0cmluZyBjb250YWluaW5nIHRoZSBzb3VyY2UgQlBGIHByb2dyYW0KKyAgICovCisgIHZvaWQKKyAgc2V0UGFja2V0RmlsdGVyKGNvbnN0IGNoYXIqIGZpbHRlclN0cmluZyk7CisKKyAgLyoqCisgICAqIEBicmllZiBFbmFibGVzIHJlY2VpdmluZyBmcmFtZXMgYWRkcmVzc2VkIHRvIG91ciBNQUMgbXVsdGljYXN0IGdyb3VwCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIGJvb2wKKyAgam9pbk11bHRpY2FzdEdyb3VwKCk7CisKKyAgLyoqCisgICAqIEBicmllZiBTZW5kcyB0aGUgc3BlY2lmaWVkIFRMViBibG9jayBvbiB0aGUgbmV0d29yayB3cmFwcGVkIGluIGFuIEV0aGVybmV0IGZyYW1lCisgICAqLworICB2b2lkCisgIHNlbmRQYWNrZXQoY29uc3QgbmRuOjpCbG9jayYgYmxvY2spOworCisgIC8qKgorICAgKiBAYnJpZWYgUmVjZWl2ZSBjYWxsYmFjaworICAgKi8KKyAgdm9pZAorICBoYW5kbGVSZWFkKGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLCBzaXplX3QgbkJ5dGVzUmVhZCk7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKyAgLyoqCisgICAqIEBicmllZiBQcm9jZXNzZXMgYW4gaW5jb21pbmcgZnJhbWUgYXMgY2FwdHVyZWQgYnkgbGlicGNhcAorICAgKgorICAgKiBAcGFyYW0gaGVhZGVyIHBvaW50ZXIgdG8gY2FwdHVyZSBtZXRhZGF0YQorICAgKiBAcGFyYW0gcGFja2V0IHBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIGZyYW1lLCBpbmNsdWRpbmcgdGhlIGxpbmstbGF5ZXIgaGVhZGVyCisgICAqLworICB2b2lkCisgIHByb2Nlc3NJbmNvbWluZ1BhY2tldChjb25zdCBwY2FwX3BrdGhkciogaGVhZGVyLCBjb25zdCB1aW50OF90KiBwYWNrZXQpOworCitwcml2YXRlOgorICAvKioKKyAgICogQGJyaWVmIEhhbmRsZXMgZXJyb3JzIGVuY291bnRlcmVkIGJ5IEJvb3N0LkFzaW8gb24gdGhlIHJlY2VpdmUgcGF0aAorICAgKi8KKyAgdm9pZAorICBwcm9jZXNzRXJyb3JDb2RlKGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yKTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybnMgdGhlIE1UVSBvZiB0aGUgdW5kZXJseWluZyBuZXR3b3JrIGludGVyZmFjZQorICAgKi8KKyAgc2l6ZV90CisgIGdldEludGVyZmFjZU10dSgpIGNvbnN0OworCitwcml2YXRlOgorICBzdHJ1Y3QgUmVhc3NlbWJsZXIKKyAgeworICAgIHVuaXF1ZV9wdHI8bmRubHA6OlBhcnRpYWxNZXNzYWdlU3RvcmU+IHBtczsKKyAgICBFdmVudElkIGV4cGlyZUV2ZW50OworICB9OworCisgIHVuaXF1ZV9wdHI8cGNhcF90LCB2b2lkKCopKHBjYXBfdCopPiBtX3BjYXA7CisgIHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OnBvc2l4OjpzdHJlYW1fZGVzY3JpcHRvcj4gbV9zb2NrZXQ7CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgaW50IG1faW50ZXJmYWNlSW5kZXg7CisjZW5kaWYKKyAgc3RkOjpzdHJpbmcgbV9pbnRlcmZhY2VOYW1lOworICBldGhlcm5ldDo6QWRkcmVzcyBtX3NyY0FkZHJlc3M7CisgIGV0aGVybmV0OjpBZGRyZXNzIG1fZGVzdEFkZHJlc3M7CisKKyAgc2l6ZV90IG1faW50ZXJmYWNlTXR1OworICB1bmlxdWVfcHRyPG5kbmxwOjpTbGljZXI+IG1fc2xpY2VyOworICBzdGQ6OnVub3JkZXJlZF9tYXA8ZXRoZXJuZXQ6OkFkZHJlc3MsIFJlYXNzZW1ibGVyPiBtX3JlYXNzZW1ibGVyczsKKyAgc3RhdGljIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzIFJFQVNTRU1CTEVSX0xJRkVUSU1FOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZBQ0VfRVRIRVJORVRfRkFDRV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9ldGhlcm5ldC1mYWN0b3J5LmNwcCBiL05GRC9kYWVtb24vZmFjZS9ldGhlcm5ldC1mYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU3OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL2V0aGVybmV0LWZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJldGhlcm5ldC1mYWN0b3J5LmhwcCIKKyNpbmNsdWRlICJmYWNlL2V0aGVybmV0LWZhY2UuaHBwIgorCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvZ2xvYmFsLWlvLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiRXRoZXJuZXRGYWN0b3J5Iik7CisKK3NoYXJlZF9wdHI8RXRoZXJuZXRGYWNlPgorRXRoZXJuZXRGYWN0b3J5OjpjcmVhdGVNdWx0aWNhc3RGYWNlKGNvbnN0IE5ldHdvcmtJbnRlcmZhY2VJbmZvJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXRoZXJuZXQ6OkFkZHJlc3MgJmFkZHJlc3MpCit7CisgIGlmICghYWRkcmVzcy5pc011bHRpY2FzdCgpKQorICAgIHRocm93IEVycm9yKGFkZHJlc3MudG9TdHJpbmcoKSArICIgaXMgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MiKTsKKworICBzaGFyZWRfcHRyPEV0aGVybmV0RmFjZT4gZmFjZSA9IGZpbmRNdWx0aWNhc3RGYWNlKGludGVyZmFjZS5uYW1lLCBhZGRyZXNzKTsKKyAgaWYgKGZhY2UpCisgICAgcmV0dXJuIGZhY2U7CisKKyAgYXV0byBzb2NrZXQgPSBtYWtlX3NoYXJlZDxib29zdDo6YXNpbzo6cG9zaXg6OnN0cmVhbV9kZXNjcmlwdG9yPihyZWYoZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpKTsKKyAgZmFjZSA9IG1ha2Vfc2hhcmVkPEV0aGVybmV0RmFjZT4oc29ja2V0LCBpbnRlcmZhY2UsIGFkZHJlc3MpOworCisgIGF1dG8ga2V5ID0gc3RkOjptYWtlX3BhaXIoaW50ZXJmYWNlLm5hbWUsIGFkZHJlc3MpOworICBmYWNlLT5vbkZhaWwgKz0gW3RoaXMsIGtleV0gKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pIHsKKyAgICBtX211bHRpY2FzdEZhY2VzLmVyYXNlKGtleSk7CisgIH07CisgIG1fbXVsdGljYXN0RmFjZXMuaW5zZXJ0KHtrZXksIGZhY2V9KTsKKworICByZXR1cm4gZmFjZTsKK30KKworc2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+CitFdGhlcm5ldEZhY3Rvcnk6OmZpbmRNdWx0aWNhc3RGYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldGhlcm5ldDo6QWRkcmVzcyYgYWRkcmVzcykgY29uc3QKK3sKKyAgYXV0byBpdCA9IG1fbXVsdGljYXN0RmFjZXMuZmluZCh7aW50ZXJmYWNlTmFtZSwgYWRkcmVzc30pOworICBpZiAoaXQgIT0gbV9tdWx0aWNhc3RGYWNlcy5lbmQoKSkKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgZWxzZQorICAgIHJldHVybiB7fTsKK30KKwordm9pZAorRXRoZXJuZXRGYWN0b3J5OjpjcmVhdGVGYWNlKGNvbnN0IEZhY2VVcmkmIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKQoreworICB0aHJvdyBFcnJvcigiRXRoZXJuZXRGYWN0b3J5IGRvZXMgbm90IHN1cHBvcnQgJ2NyZWF0ZUZhY2UnIG9wZXJhdGlvbiIpOworfQorCitzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPj4KK0V0aGVybmV0RmFjdG9yeTo6Z2V0Q2hhbm5lbHMoKSBjb25zdAoreworICByZXR1cm4ge307Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL2V0aGVybmV0LWZhY3RvcnkuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL2V0aGVybmV0LWZhY3RvcnkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODFmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvZXRoZXJuZXQtZmFjdG9yeS5ocHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX0VUSEVSTkVUX0ZBQ1RPUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9FVEhFUk5FVF9GQUNUT1JZX0hQUAorCisjaW5jbHVkZSAicHJvdG9jb2wtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAiY29yZS9uZXR3b3JrLWludGVyZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBFdGhlcm5ldEZhY2U7CisKK2NsYXNzIEV0aGVybmV0RmFjdG9yeSA6IHB1YmxpYyBQcm90b2NvbEZhY3RvcnkKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIFxicmllZiBFeGNlcHRpb24gb2YgRXRoZXJuZXRGYWN0b3J5CisgICAqLworICBjbGFzcyBFcnJvciA6IHB1YmxpYyBQcm90b2NvbEZhY3Rvcnk6OkVycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IFByb3RvY29sRmFjdG9yeTo6RXJyb3Iod2hhdCkKKyAgICB7CisgICAgfQorICB9OworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBldGhlcm5ldDo6QWRkcmVzcz4sCisgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+PiBNdWx0aWNhc3RGYWNlTWFwOworCisgIC8vIGZyb20gUHJvdG9jb2xGYWN0b3J5CisgIHZpcnR1YWwgdm9pZAorICBjcmVhdGVGYWNlKGNvbnN0IEZhY2VVcmkmIHVyaSwKKyAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkNyZWF0ZWQsCisgICAgICAgICAgICAgY29uc3QgRmFjZUNvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKTsKKworICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBhbiBFdGhlcm5ldEZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZ2l2ZW4gbXVsdGljYXN0IGdyb3VwCisgICAqCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0d2ljZSB3aXRoIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZ3JvdXAsIG9ubHkKKyAgICogb25lIGZhY2Ugd2lsbCBiZSBjcmVhdGVkLiBJbnN0ZWFkLCB0aGUgc2Vjb25kIGNhbGwgd2lsbCBqdXN0IHJldHJpZXZlCisgICAqIHRoZSBleGlzdGluZyBmYWNlLgorICAgKgorICAgKiBccGFyYW0gaW50ZXJmYWNlIExvY2FsIG5ldHdvcmsgaW50ZXJmYWNlCisgICAqIFxwYXJhbSBhZGRyZXNzICAgRXRoZXJuZXQgYnJvYWRjYXN0L211bHRpY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzCisgICAqCisgICAqIFxyZXR1cm5zIGFsd2F5cyBhIHZhbGlkIHNoYXJlZCBwb2ludGVyIHRvIGFuIEV0aGVybmV0RmFjZSBvYmplY3QsCisgICAqICAgICAgICAgIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgY3JlYXRpb24gZmFpbHMKKyAgICoKKyAgICogXHRocm93cyBFdGhlcm5ldEZhY3Rvcnk6OkVycm9yIG9yIEV0aGVybmV0RmFjZTo6RXJyb3IKKyAgICovCisgIHNoYXJlZF9wdHI8RXRoZXJuZXRGYWNlPgorICBjcmVhdGVNdWx0aWNhc3RGYWNlKGNvbnN0IE5ldHdvcmtJbnRlcmZhY2VJbmZvJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXRoZXJuZXQ6OkFkZHJlc3MmIGFkZHJlc3MpOworCisgIC8qKgorICAgKiBcYnJpZWYgR2V0IG1hcCBvZiBjb25maWd1cmVkIG11bHRpY2FzdCBmYWNlcworICAgKi8KKyAgY29uc3QgTXVsdGljYXN0RmFjZU1hcCYKKyAgZ2V0TXVsdGljYXN0RmFjZXMoKSBjb25zdDsKKworICB2aXJ0dWFsIHN0ZDo6bGlzdDxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+PgorICBnZXRDaGFubmVscygpIGNvbnN0OworCitwcml2YXRlOgorICAvKioKKyAgICogXGJyaWVmIExvb2sgdXAgRXRoZXJuZXRGYWNlIHVzaW5nIHNwZWNpZmllZCBpbnRlcmZhY2UgYW5kIGFkZHJlc3MKKyAgICoKKyAgICogXHJldHVybnMgc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIEV0aGVybmV0RmFjZSBvYmplY3Qgb3IKKyAgICogICAgICAgICAgZW1wdHkgc2hhcmVkIHBvaW50ZXIgd2hlbiBzdWNoIGZhY2UgZG9lcyBub3QgZXhpc3QKKyAgICoKKyAgICogXHRocm93cyBuZXZlcgorICAgKi8KKyAgc2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+CisgIGZpbmRNdWx0aWNhc3RGYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBldGhlcm5ldDo6QWRkcmVzcyYgYWRkcmVzcykgY29uc3Q7CisKK3ByaXZhdGU6CisgIE11bHRpY2FzdEZhY2VNYXAgbV9tdWx0aWNhc3RGYWNlczsKK307CisKK2lubGluZSBjb25zdCBFdGhlcm5ldEZhY3Rvcnk6Ok11bHRpY2FzdEZhY2VNYXAmCitFdGhlcm5ldEZhY3Rvcnk6OmdldE11bHRpY2FzdEZhY2VzKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbXVsdGljYXN0RmFjZXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX0VUSEVSTkVUX0ZBQ1RPUllfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvZmFjZS1jb3VudGVycy5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvZmFjZS1jb3VudGVycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjMWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9mYWNlLWNvdW50ZXJzLmhwcApAQCAtMCwwICsxLDI1MSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfRkFDRV9DT1VOVEVSU19IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX0ZBQ0VfQ09VTlRFUlNfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqIFxicmllZiByZXByZXNlbnRzIGEgY291bnRlciBvZiBudW1iZXIgb2YgcGFja2V0cworICovCisvLyBQYWNrZXRDb3VudGVyIGlzIG5vbmNvcHlhYmxlLCBiZWNhdXNlIGluY3JlbWVudCBzaG91bGQgYmUgY2FsbGVkIG9uIHRoZSBjb3VudGVyLAorLy8gbm90IGEgY29weSBvZiBpdDsgaXQncyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIHVpbnQ2NF90IHRvIGJlIG9ic2VydmVkCitjbGFzcyBQYWNrZXRDb3VudGVyIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB1aW50NjRfdCByZXA7CisKKyAgUGFja2V0Q291bnRlcigpCisgICAgOiBtX3ZhbHVlKDApCisgIHsKKyAgfQorCisgIG9wZXJhdG9yIHJlcCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV92YWx1ZTsKKyAgfQorCisgIFBhY2tldENvdW50ZXImCisgIG9wZXJhdG9yKysoKQorICB7CisgICAgKyttX3ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLyBwb3N0Zml4ICsrIG9wZXJhdG9yIGlzIG5vdCBwcm92aWRlZCBiZWNhdXNlIGl0J3Mgbm90IG5lZWRlZAorCisgIHZvaWQKKyAgc2V0KHJlcCB2YWx1ZSkKKyAgeworICAgIG1fdmFsdWUgPSB2YWx1ZTsKKyAgfQorCitwcml2YXRlOgorICByZXAgbV92YWx1ZTsKK307CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyBhIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGJ5dGVzCisgKi8KKy8vIEJ5dGVDb3VudGVyIGlzIG5vbmNvcHlhYmxlLCBiZWNhdXNlIGluY3JlbWVudCBzaG91bGQgYmUgY2FsbGVkIG9uIHRoZSBjb3VudGVyLAorLy8gbm90IGEgY29weSBvZiBpdDsgaXQncyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIHVpbnQ2NF90IHRvIGJlIG9ic2VydmVkCitjbGFzcyBCeXRlQ291bnRlciA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIHR5cGVkZWYgdWludDY0X3QgcmVwOworCisgIEJ5dGVDb3VudGVyKCkKKyAgICA6IG1fdmFsdWUoMCkKKyAgeworICB9CisKKyAgb3BlcmF0b3IgcmVwKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX3ZhbHVlOworICB9CisKKyAgQnl0ZUNvdW50ZXImCisgIG9wZXJhdG9yKz0ocmVwIG4pCisgIHsKKyAgICBtX3ZhbHVlICs9IG47CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZAorICBzZXQocmVwIHZhbHVlKQorICB7CisgICAgbV92YWx1ZSA9IHZhbHVlOworICB9CisKK3ByaXZhdGU6CisgIHJlcCBtX3ZhbHVlOworfTsKKworLyoqIFxicmllZiBjb250YWlucyBuZXR3b3JrIGxheWVyIHBhY2tldCBjb3VudGVycworICovCitjbGFzcyBOZXR3b3JrTGF5ZXJDb3VudGVycyA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIC8vLyBpbmNvbWluZyBJbnRlcmVzdAorICBjb25zdCBQYWNrZXRDb3VudGVyJgorICBnZXROSW5JbnRlcmVzdHMoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fbkluSW50ZXJlc3RzOworICB9CisKKyAgUGFja2V0Q291bnRlciYKKyAgZ2V0TkluSW50ZXJlc3RzKCkKKyAgeworICAgIHJldHVybiBtX25JbkludGVyZXN0czsKKyAgfQorCisgIC8vLyBpbmNvbWluZyBEYXRhCisgIGNvbnN0IFBhY2tldENvdW50ZXImCisgIGdldE5JbkRhdGFzKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX25JbkRhdGFzOworICB9CisKKyAgUGFja2V0Q291bnRlciYKKyAgZ2V0TkluRGF0YXMoKQorICB7CisgICAgcmV0dXJuIG1fbkluRGF0YXM7CisgIH0KKworICAvLy8gb3V0Z29pbmcgSW50ZXJlc3QKKyAgY29uc3QgUGFja2V0Q291bnRlciYKKyAgZ2V0Tk91dEludGVyZXN0cygpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9uT3V0SW50ZXJlc3RzOworICB9CisKKyAgUGFja2V0Q291bnRlciYKKyAgZ2V0Tk91dEludGVyZXN0cygpCisgIHsKKyAgICByZXR1cm4gbV9uT3V0SW50ZXJlc3RzOworICB9CisKKyAgLy8vIG91dGdvaW5nIERhdGEKKyAgY29uc3QgUGFja2V0Q291bnRlciYKKyAgZ2V0Tk91dERhdGFzKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX25PdXREYXRhczsKKyAgfQorCisgIFBhY2tldENvdW50ZXImCisgIGdldE5PdXREYXRhcygpCisgIHsKKyAgICByZXR1cm4gbV9uT3V0RGF0YXM7CisgIH0KKworcHJvdGVjdGVkOgorICAvKiogXGJyaWVmIGNvcHkgY3VycmVudCBvYnNldmVyYXRpb25zIHRvIGEgc3RydWN0CisgICAqICBccGFyYW0gcmVjaXBpZW50IGFuIG9iamVjdCB3aXRoIHNldCBtZXRob2RzIGZvciBjb3VudGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUj4KKyAgdm9pZAorICBjb3B5VG8oUiYgcmVjaXBpZW50KSBjb25zdAorICB7CisgICAgcmVjaXBpZW50LnNldE5JbkludGVyZXN0cyh0aGlzLT5nZXROSW5JbnRlcmVzdHMoKSk7CisgICAgcmVjaXBpZW50LnNldE5JbkRhdGFzKHRoaXMtPmdldE5JbkRhdGFzKCkpOworICAgIHJlY2lwaWVudC5zZXROT3V0SW50ZXJlc3RzKHRoaXMtPmdldE5PdXRJbnRlcmVzdHMoKSk7CisgICAgcmVjaXBpZW50LnNldE5PdXREYXRhcyh0aGlzLT5nZXROT3V0RGF0YXMoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgUGFja2V0Q291bnRlciBtX25JbkludGVyZXN0czsKKyAgUGFja2V0Q291bnRlciBtX25JbkRhdGFzOworICBQYWNrZXRDb3VudGVyIG1fbk91dEludGVyZXN0czsKKyAgUGFja2V0Q291bnRlciBtX25PdXREYXRhczsKK307CisKKy8qKiBcYnJpZWYgY29udGFpbnMgbGluayBsYXllciBieXRlIGNvdW50ZXJzCisgKi8KK2NsYXNzIExpbmtMYXllckNvdW50ZXJzIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgLy8vIHJlY2VpdmVkIGJ5dGVzCisgIGNvbnN0IEJ5dGVDb3VudGVyJgorICBnZXROSW5CeXRlcygpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9uSW5CeXRlczsKKyAgfQorCisgIEJ5dGVDb3VudGVyJgorICBnZXROSW5CeXRlcygpCisgIHsKKyAgICByZXR1cm4gbV9uSW5CeXRlczsKKyAgfQorCisgIC8vLyBzZW50IGJ5dGVzCisgIGNvbnN0IEJ5dGVDb3VudGVyJgorICBnZXROT3V0Qnl0ZXMoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fbk91dEJ5dGVzOworICB9CisKKyAgQnl0ZUNvdW50ZXImCisgIGdldE5PdXRCeXRlcygpCisgIHsKKyAgICByZXR1cm4gbV9uT3V0Qnl0ZXM7CisgIH0KKworcHJvdGVjdGVkOgorICAvKiogXGJyaWVmIGNvcHkgY3VycmVudCBvYnNldmVyYXRpb25zIHRvIGEgc3RydWN0CisgICAqICBccGFyYW0gcmVjaXBpZW50IGFuIG9iamVjdCB3aXRoIHNldCBtZXRob2RzIGZvciBjb3VudGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUj4KKyAgdm9pZAorICBjb3B5VG8oUiYgcmVjaXBpZW50KSBjb25zdAorICB7CisgICAgcmVjaXBpZW50LnNldE5JbkJ5dGVzKHRoaXMtPmdldE5JbkJ5dGVzKCkpOworICAgIHJlY2lwaWVudC5zZXROT3V0Qnl0ZXModGhpcy0+Z2V0Tk91dEJ5dGVzKCkpOworICB9CisKK3ByaXZhdGU6CisgIEJ5dGVDb3VudGVyIG1fbkluQnl0ZXM7CisgIEJ5dGVDb3VudGVyIG1fbk91dEJ5dGVzOworfTsKKworLyoqIFxicmllZiBjb250YWlucyBjb3VudGVycyBvbiBmYWNlCisgKi8KK2NsYXNzIEZhY2VDb3VudGVycyA6IHB1YmxpYyBOZXR3b3JrTGF5ZXJDb3VudGVycywgcHVibGljIExpbmtMYXllckNvdW50ZXJzCit7CitwdWJsaWM6CisgIC8qKiBcYnJpZWYgY29weSBjdXJyZW50IG9ic2V2ZXJhdGlvbnMgdG8gYSBzdHJ1Y3QKKyAgICogIFxwYXJhbSByZWNpcGllbnQgYW4gb2JqZWN0IHdpdGggc2V0IG1ldGhvZHMgZm9yIGNvdW50ZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSPgorICB2b2lkCisgIGNvcHlUbyhSJiByZWNpcGllbnQpIGNvbnN0CisgIHsKKyAgICB0aGlzLT5OZXR3b3JrTGF5ZXJDb3VudGVyczo6Y29weVRvKHJlY2lwaWVudCk7CisgICAgdGhpcy0+TGlua0xheWVyQ291bnRlcnM6OmNvcHlUbyhyZWNpcGllbnQpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9GQUNFX0NPVU5URVJTX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL2ZhY2UuY3BwIGIvTkZEL2RhZW1vbi9mYWNlL2ZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkM2MxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvZmFjZS5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJmYWNlLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitGYWNlOjpGYWNlKGNvbnN0IEZhY2VVcmkmIHJlbW90ZVVyaSwgY29uc3QgRmFjZVVyaSYgbG9jYWxVcmksIGJvb2wgaXNMb2NhbCkKKyAgOiBtX2lkKElOVkFMSURfRkFDRUlEKQorICAsIG1faXNMb2NhbChpc0xvY2FsKQorICAsIG1fcmVtb3RlVXJpKHJlbW90ZVVyaSkKKyAgLCBtX2xvY2FsVXJpKGxvY2FsVXJpKQorICAsIG1faXNPbkRlbWFuZChmYWxzZSkKKyAgLCBtX2lzRmFpbGVkKGZhbHNlKQoreworICBvblJlY2VpdmVJbnRlcmVzdCArPSBbdGhpc10oY29uc3QgbmRuOjpJbnRlcmVzdCYpIHsgKyttX2NvdW50ZXJzLmdldE5JbkludGVyZXN0cygpOyB9OworICBvblJlY2VpdmVEYXRhICAgICArPSBbdGhpc10oY29uc3QgbmRuOjpEYXRhJikgeyAgICAgKyttX2NvdW50ZXJzLmdldE5JbkRhdGFzKCk7IH07CisgIG9uU2VuZEludGVyZXN0ICAgICs9IFt0aGlzXShjb25zdCBuZG46OkludGVyZXN0JikgeyArK21fY291bnRlcnMuZ2V0Tk91dEludGVyZXN0cygpOyB9OworICBvblNlbmREYXRhICAgICAgICArPSBbdGhpc10oY29uc3QgbmRuOjpEYXRhJikgeyAgICAgKyttX2NvdW50ZXJzLmdldE5PdXREYXRhcygpOyB9OworfQorCitGYWNlOjp+RmFjZSgpCit7Cit9CisKK0ZhY2VJZAorRmFjZTo6Z2V0SWQoKSBjb25zdAoreworICByZXR1cm4gbV9pZDsKK30KKworLy8gdGhpcyBtZXRob2QgaXMgcHJpdmF0ZSBhbmQgc2hvdWxkIGJlIHVzZWQgb25seSBieSB0aGUgRmFjZVRhYmxlCit2b2lkCitGYWNlOjpzZXRJZChGYWNlSWQgZmFjZUlkKQoreworICBtX2lkID0gZmFjZUlkOworfQorCit2b2lkCitGYWNlOjpzZXREZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pCit7CisgIG1fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmCitGYWNlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0Cit7CisgIHJldHVybiBtX2Rlc2NyaXB0aW9uOworfQorCitib29sCitGYWNlOjppc011bHRpQWNjZXNzKCkgY29uc3QKK3sKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sCitGYWNlOjppc1VwKCkgY29uc3QKK3sKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK0ZhY2U6OmRlY29kZUFuZERpc3BhdGNoSW5wdXQoY29uc3QgQmxvY2smIGVsZW1lbnQpCit7CisgIHRyeSB7CisgICAgLy8vIFx0b2RvIEVuc3VyZSBsYXp5IGZpZWxkIGRlY29kaW5nIHByb2Nlc3MKKworICAgIGlmIChlbGVtZW50LnR5cGUoKSA9PSB0bHY6OkludGVyZXN0KQorICAgICAgeworICAgICAgICBzaGFyZWRfcHRyPEludGVyZXN0PiBpID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCk7CisgICAgICAgIGktPndpcmVEZWNvZGUoZWxlbWVudCk7CisgICAgICAgIHRoaXMtPm9uUmVjZWl2ZUludGVyZXN0KCppKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChlbGVtZW50LnR5cGUoKSA9PSB0bHY6OkRhdGEpCisgICAgICB7CisgICAgICAgIHNoYXJlZF9wdHI8RGF0YT4gZCA9IG1ha2Vfc2hhcmVkPERhdGE+KCk7CisgICAgICAgIGQtPndpcmVEZWNvZGUoZWxlbWVudCk7CisgICAgICAgIHRoaXMtPm9uUmVjZWl2ZURhdGEoKmQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhdGNoICh0bHY6OkVycm9yJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkCitGYWNlOjpmYWlsKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCit7CisgIGlmIChtX2lzRmFpbGVkKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgbV9pc0ZhaWxlZCA9IHRydWU7CisgIHRoaXMtPm9uRmFpbChyZWFzb24pOworCisgIHRoaXMtPm9uRmFpbC5jbGVhcigpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGYWNlVHJhaXRzPgordm9pZAorRmFjZTo6Y29weVN0YXR1c1RvKEZhY2VUcmFpdHMmIHRyYWl0cykgY29uc3QKK3sKKyAgdHJhaXRzLnNldEZhY2VJZChnZXRJZCgpKQorICAgIC5zZXRSZW1vdGVVcmkoZ2V0UmVtb3RlVXJpKCkudG9TdHJpbmcoKSkKKyAgICAuc2V0TG9jYWxVcmkoZ2V0TG9jYWxVcmkoKS50b1N0cmluZygpKTsKKworICBpZiAoaXNMb2NhbCgpKSB7CisgICAgdHJhaXRzLnNldEZhY2VTY29wZShuZG46Om5mZDo6RkFDRV9TQ09QRV9MT0NBTCk7CisgIH0KKyAgZWxzZSB7CisgICAgdHJhaXRzLnNldEZhY2VTY29wZShuZG46Om5mZDo6RkFDRV9TQ09QRV9OT05fTE9DQUwpOworICB9CisKKyAgaWYgKGlzT25EZW1hbmQoKSkgeworICAgIHRyYWl0cy5zZXRGYWNlUGVyc2lzdGVuY3kobmRuOjpuZmQ6OkZBQ0VfUEVSU0lTVEVOQ1lfT05fREVNQU5EKTsKKyAgfQorICBlbHNlIHsKKyAgICB0cmFpdHMuc2V0RmFjZVBlcnNpc3RlbmN5KG5kbjo6bmZkOjpGQUNFX1BFUlNJU1RFTkNZX1BFUlNJU1RFTlQpOworICB9Cit9CisKK3RlbXBsYXRlIHZvaWQKK0ZhY2U6OmNvcHlTdGF0dXNUbzxuZG46Om5mZDo6RmFjZVN0YXR1cz4obmRuOjpuZmQ6OkZhY2VTdGF0dXMmKSBjb25zdDsKKwordGVtcGxhdGUgdm9pZAorRmFjZTo6Y29weVN0YXR1c1RvPG5kbjo6bmZkOjpGYWNlRXZlbnROb3RpZmljYXRpb24+KG5kbjo6bmZkOjpGYWNlRXZlbnROb3RpZmljYXRpb24mKSBjb25zdDsKKworbmRuOjpuZmQ6OkZhY2VTdGF0dXMKK0ZhY2U6OmdldEZhY2VTdGF0dXMoKSBjb25zdAoreworICBuZG46Om5mZDo6RmFjZVN0YXR1cyBzdGF0dXM7CisgIGNvcHlTdGF0dXNUbyhzdGF0dXMpOworCisgIHRoaXMtPmdldENvdW50ZXJzKCkuY29weVRvKHN0YXR1cyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworfSAvL25hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9mYWNlLmhwcCBiL05GRC9kYWVtb24vZmFjZS9mYWNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE3N2ExCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL2ZhY2UuaHBwCkBAIC0wLDAgKzEsMjUyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fRkFDRV9GQUNFX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfRkFDRV9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisjaW5jbHVkZSAiZmFjZS1jb3VudGVycy5ocHAiCisKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvZmFjZS11cmkuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmFjZS1zdGF0dXMuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmFjZS1ldmVudC1ub3RpZmljYXRpb24uaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqIFxjbGFzcyBGYWNlSWQKKyAqICBcYnJpZWYgaWRlbnRpZmllcyBhIGZhY2UKKyAqLwordHlwZWRlZiBpbnQgRmFjZUlkOworCisvLy8gaW5kaWNhdGVzIGFuIGludmFsaWQgRmFjZUlkCitjb25zdCBGYWNlSWQgSU5WQUxJRF9GQUNFSUQgPSAtMTsKKworLy8vIGlkZW50aWZpZXMgdGhlIEludGVybmFsRmFjZSB1c2VkIGluIG1hbmFnZW1lbnQKK2NvbnN0IEZhY2VJZCBGQUNFSURfSU5URVJOQUxfRkFDRSA9IDE7CisvLy8gaWRlbnRpZmllcyBhIHBhY2tldCBjb21lcyBmcm9tIHRoZSBDb250ZW50U3RvcmUsIGluIExvY2FsQ29udHJvbEhlYWRlciBpbmNvbWluZ0ZhY2VJZAorY29uc3QgRmFjZUlkIEZBQ0VJRF9DT05URU5UX1NUT1JFID0gMjU0OworLy8vIGlkZW50aWZpZXMgdGhlIE51bGxGYWNlIHRoYXQgZHJvcHMgZXZlcnkgcGFja2V0Citjb25zdCBGYWNlSWQgRkFDRUlEX05VTEwgPSAyNTU7CisvLy8gdXBwZXIgYm91bmQgb2YgcmVzZXJ2ZWQgRmFjZUlkcworY29uc3QgRmFjZUlkIEZBQ0VJRF9SRVNFUlZFRF9NQVggPSAyNTU7CisKK3VzaW5nIG5kbjo6dXRpbDo6RmFjZVVyaTsKKworLyoqIFxicmllZiByZXByZXNlbnRzIGEgZmFjZQorICovCitjbGFzcyBGYWNlIDogbm9uY29weWFibGUsIHB1YmxpYyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxGYWNlPgoreworcHVibGljOgorICAvKioKKyAgICogXGJyaWVmIEZhY2UtcmVsYXRlZCBlcnJvcgorICAgKi8KKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IHN0ZDo6cnVudGltZV9lcnJvcih3aGF0KQorICAgIHsKKyAgICB9CisgIH07CisKKyAgRmFjZShjb25zdCBGYWNlVXJpJiByZW1vdGVVcmksIGNvbnN0IEZhY2VVcmkmIGxvY2FsVXJpLCBib29sIGlzTG9jYWwgPSBmYWxzZSk7CisKKyAgdmlydHVhbAorICB+RmFjZSgpOworCisgIC8vLyBmaXJlcyB3aGVuIGFuIEludGVyZXN0IGlzIHJlY2VpdmVkCisgIEV2ZW50RW1pdHRlcjxJbnRlcmVzdD4gb25SZWNlaXZlSW50ZXJlc3Q7CisKKyAgLy8vIGZpcmVzIHdoZW4gYSBEYXRhIGlzIHJlY2VpdmVkCisgIEV2ZW50RW1pdHRlcjxEYXRhPiBvblJlY2VpdmVEYXRhOworCisgIC8vLyBmaXJlcyB3aGVuIGFuIEludGVyZXN0IGlzIHNlbnQgb3V0CisgIEV2ZW50RW1pdHRlcjxJbnRlcmVzdD4gb25TZW5kSW50ZXJlc3Q7CisKKyAgLy8vIGZpcmVzIHdoZW4gYSBEYXRhIGlzIHNlbnQgb3V0CisgIEV2ZW50RW1pdHRlcjxEYXRhPiBvblNlbmREYXRhOworCisgIC8vLyBmaXJlcyB3aGVuIGZhY2UgZGlzY29ubmVjdHMgb3IgZmFpbHMgdG8gcGVyZm9ybSBwcm9wZXJseQorICBFdmVudEVtaXR0ZXI8c3RkOjpzdHJpbmcvKnJlYXNvbiovPiBvbkZhaWw7CisKKyAgLy8vIHNlbmQgYW4gSW50ZXJlc3QKKyAgdmlydHVhbCB2b2lkCisgIHNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpID0gMDsKKworICAvLy8gc2VuZCBhIERhdGEKKyAgdmlydHVhbCB2b2lkCisgIHNlbmREYXRhKGNvbnN0IERhdGEmIGRhdGEpID0gMDsKKworICAvKiogXGJyaWVmIENsb3NlIHRoZSBmYWNlCisgICAqCisgICAqICBUaGlzIHRlcm1pbmF0ZXMgYWxsIGNvbW11bmljYXRpb24gb24gdGhlIGZhY2UgYW5kIGNhdXNlCisgICAqICBvbkZhaWwoKSBtZXRob2QgZXZlbnQgdG8gYmUgaW52b2tlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkCisgIGNsb3NlKCkgPSAwOworCitwdWJsaWM6IC8vIGF0dHJpYnV0ZXMKKyAgRmFjZUlkCisgIGdldElkKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBTZXQgdGhlIGRlc2NyaXB0aW9uCisgICAqCisgICAqICBUaGlzIGlzIHR5cGljYWxseSBpbnZva2VkIGJ5IG1nbXQgb24gc2V0IGRlc2NyaXB0aW9uIGNvbW1hbmQKKyAgICovCisgIHZpcnR1YWwgdm9pZAorICBzZXREZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pOworCisgIC8vLyBHZXQgdGhlIGRlc2NyaXB0aW9uCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmCisgIGdldERlc2NyaXB0aW9uKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBHZXQgd2hldGhlciBmYWNlIGlzIGNvbm5lY3RlZCB0byBhIGxvY2FsIGFwcAorICAgKi8KKyAgYm9vbAorICBpc0xvY2FsKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBHZXQgd2hldGhlciBwYWNrZXRzIHNlbnQgdGhpcyBGYWNlIG1heSByZWFjaCBtdWx0aXBsZSBwZWVycworICAgKgorICAgKiAgSW4gdGhpcyBiYXNlIGNsYXNzIHRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIGZhbHNlLgorICAgKi8KKyAgdmlydHVhbCBib29sCisgIGlzTXVsdGlBY2Nlc3MoKSBjb25zdDsKKworICAvKiogXGJyaWVmIEdldCB3aGV0aGVyIHVuZGVybHlpbmcgY29tbXVuaWNhdGlvbiBpcyB1cAorICAgKgorICAgKiAgSW4gdGhpcyBiYXNlIGNsYXNzIHRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIHRydWUuCisgICAqLworICB2aXJ0dWFsIGJvb2wKKyAgaXNVcCgpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgR2V0IHdoZXRoZXIgZmFjZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCBvciBleHBsaWNpdGx5IHZpYSBGYWNlTWFuYWdlbWVudCBwcm90b2NvbAorICAgKi8KKyAgYm9vbAorICBpc09uRGVtYW5kKCkgY29uc3Q7CisKKyAgY29uc3QgRmFjZUNvdW50ZXJzJgorICBnZXRDb3VudGVycygpIGNvbnN0OworCisgIC8qKiBccmV0dXJuIGEgRmFjZVVyaSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlbW90ZSBlbmRwb2ludAorICAgKi8KKyAgY29uc3QgRmFjZVVyaSYKKyAgZ2V0UmVtb3RlVXJpKCkgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm4gYSBGYWNlVXJpIHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWwgZW5kcG9pbnQgKE5GRCBzaWRlKQorICAgKi8KKyAgY29uc3QgRmFjZVVyaSYKKyAgZ2V0TG9jYWxVcmkoKSBjb25zdDsKKworICAvKiogXHJldHVybiBGYWNlVHJhaXRzIGRhdGEgc3RydWN0dXJlIGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IEZhY2VUcmFpdHMgc3RhdHVzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGYWNlVHJhaXRzPgorICB2b2lkCisgIGNvcHlTdGF0dXNUbyhGYWNlVHJhaXRzJiB0cmFpdHMpIGNvbnN0OworCisgIC8qKiBccmV0dXJuIEZhY2VTdGF0dXMgZGF0YSBzdHJ1Y3R1cmUgZmlsbGVkIHdpdGggdGhlIGN1cnJlbnQgRmFjZSBzdGF0dXMKKyAgICovCisgIHZpcnR1YWwgbmRuOjpuZmQ6OkZhY2VTdGF0dXMKKyAgZ2V0RmFjZVN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vIHRoaXMgaXMgYSBub24tdmlydHVhbCBtZXRob2QKKyAgYm9vbAorICBkZWNvZGVBbmREaXNwYXRjaElucHV0KGNvbnN0IEJsb2NrJiBlbGVtZW50KTsKKworICBGYWNlQ291bnRlcnMmCisgIGdldE11dGFibGVDb3VudGVycygpOworCisgIHZvaWQKKyAgc2V0T25EZW1hbmQoYm9vbCBpc09uRGVtYW5kKTsKKworICAvKiogXGJyaWVmIGZhaWwgdGhlIGZhY2UgYW5kIHJhaXNlIG9uRmFpbCBldmVudCBpZiBpdCdzIFVQOyBvdGhlcndpc2UgZG8gbm90aGluZworICAgKi8KKyAgdm9pZAorICBmYWlsKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pOworCitwcml2YXRlOgorICB2b2lkCisgIHNldElkKEZhY2VJZCBmYWNlSWQpOworCitwcml2YXRlOgorICBGYWNlSWQgbV9pZDsKKyAgc3RkOjpzdHJpbmcgbV9kZXNjcmlwdGlvbjsKKyAgYm9vbCBtX2lzTG9jYWw7IC8vIGZvciBzY29waW5nIHB1cnBvc2VzCisgIEZhY2VDb3VudGVycyBtX2NvdW50ZXJzOworICBGYWNlVXJpIG1fcmVtb3RlVXJpOworICBGYWNlVXJpIG1fbG9jYWxVcmk7CisgIGJvb2wgbV9pc09uRGVtYW5kOworICBib29sIG1faXNGYWlsZWQ7CisKKyAgLy8gYWxsb3cgc2V0dGluZyBGYWNlSWQKKyAgZnJpZW5kIGNsYXNzIEZhY2VUYWJsZTsKK307CisKK2lubGluZSBib29sCitGYWNlOjppc0xvY2FsKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1faXNMb2NhbDsKK30KKworaW5saW5lIGNvbnN0IEZhY2VDb3VudGVycyYKK0ZhY2U6OmdldENvdW50ZXJzKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fY291bnRlcnM7Cit9CisKK2lubGluZSBGYWNlQ291bnRlcnMmCitGYWNlOjpnZXRNdXRhYmxlQ291bnRlcnMoKQoreworICByZXR1cm4gbV9jb3VudGVyczsKK30KKworaW5saW5lIGNvbnN0IEZhY2VVcmkmCitGYWNlOjpnZXRSZW1vdGVVcmkoKSBjb25zdAoreworICByZXR1cm4gbV9yZW1vdGVVcmk7Cit9CisKK2lubGluZSBjb25zdCBGYWNlVXJpJgorRmFjZTo6Z2V0TG9jYWxVcmkoKSBjb25zdAoreworICByZXR1cm4gbV9sb2NhbFVyaTsKK30KKworaW5saW5lIHZvaWQKK0ZhY2U6OnNldE9uRGVtYW5kKGJvb2wgaXNPbkRlbWFuZCkKK3sKKyAgbV9pc09uRGVtYW5kID0gaXNPbkRlbWFuZDsKK30KKworaW5saW5lIGJvb2wKK0ZhY2U6OmlzT25EZW1hbmQoKSBjb25zdAoreworICByZXR1cm4gbV9pc09uRGVtYW5kOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9GQUNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL2xvY2FsLWZhY2UuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL2xvY2FsLWZhY2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzM0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvbG9jYWwtZmFjZS5ocHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX0xPQ0FMX0ZBQ0VfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9MT0NBTF9GQUNFX0hQUAorCisjaW5jbHVkZSAiZmFjZS5ocHAiCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sLXBhcmFtZXRlcnMuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKwordXNpbmcgbmRuOjpuZmQ6OkxvY2FsQ29udHJvbEZlYXR1cmU7Cit1c2luZyBuZG46Om5mZDo6TE9DQUxfQ09OVFJPTF9GRUFUVVJFX0lOQ09NSU5HX0ZBQ0VfSUQ7Cit1c2luZyBuZG46Om5mZDo6TE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQ7CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyBhIGZhY2UKKyAqLworY2xhc3MgTG9jYWxGYWNlIDogcHVibGljIEZhY2UKK3sKK3B1YmxpYzoKKyAgTG9jYWxGYWNlKGNvbnN0IEZhY2VVcmkmIHJlbW90ZVVyaSwgY29uc3QgRmFjZVVyaSYgbG9jYWxVcmkpOworCisgIC8qKiBcYnJpZWYgZ2V0IHdoZXRoZXIgYW55IExvY2FsQ29udHJvbEhlYWRlciBmZWF0dXJlIGlzIGVuYWJsZWQKKyAgICoKKyAgICogXHJldHVybnMgdHJ1ZSBpZiBhbnkgZmVhdHVyZSBpcyBlbmFibGVkLgorICAgKi8KKyAgYm9vbAorICBpc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoKSBjb25zdDsKKworICAvKiogXGJyaWVmIGdldCB3aGV0aGVyIGEgc3BlY2lmaWMgTG9jYWxDb250cm9sSGVhZGVyIGZlYXR1cmUgaXMgZW5hYmxlZAorICAgKgorICAgKiAgXHBhcmFtIGZlYXR1cmUgVGhlIGZlYXR1cmUuCisgICAqICBccmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBpcyBlbmFibGVkLgorICAgKi8KKyAgYm9vbAorICBpc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTG9jYWxDb250cm9sRmVhdHVyZSBmZWF0dXJlKSBjb25zdDsKKworICAvKiogXGJyaWVmIGVuYWJsZSBvciBkaXNhYmxlIGEgTG9jYWxDb250cm9sSGVhZGVyIGZlYXR1cmUKKyAgICoKKyAgICogIFxwYXJhbSBmZWF0dXJlIFRoZSBmZWF0dXJlLiBDYW5ub3QgYmUgTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0FOWQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMT0NBTF9DT05UUk9MX0ZFQVRVUkVfTUFYCisgICAqLworICB2b2lkCisgIHNldExvY2FsQ29udHJvbEhlYWRlckZlYXR1cmUoTG9jYWxDb250cm9sRmVhdHVyZSBmZWF0dXJlLCBib29sIGVuYWJsZWQgPSB0cnVlKTsKKworcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBzaXplX3QgTE9DQUxfQ09OVFJPTF9GRUFUVVJFX01BWCA9IDM7IC8vLyB1cHBlciBib3VuZCBvZiBMb2NhbENvbnRyb2xGZWF0dXJlIGVudW0KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBMT0NBTF9DT05UUk9MX0ZFQVRVUkVfQU5ZID0gMDsgLy8vIGFueSBmZWF0dXJlCisKK3Byb3RlY3RlZDoKKyAgLy8gc3RhdGljYWxseSBvdmVycmlkZGVuIGZyb20gRmFjZQorCisgIC8qKiBcYnJpZWYgRGVjb2RlIGJsb2NrIGludG8gSW50ZXJlc3QvRGF0YSwgY29uc2lkZXJpbmcgcG90ZW50aWFsIExvY2FsQ29udHJvbEhlYWRlcgorICAgKgorICAgKiAgSWYgTG9jYWxDb250cm9sSGVhZGVyIGlzIHByZXNlbnQsIHRoZSBlbmNvZGVkIGRhdGEgaXMgZmlsdGVyZWQgb3V0LCBiYXNlZAorICAgKiAgb24gZW5hYmxlZCBmZWF0dXJlcyBvbiB0aGUgZmFjZS4KKyAgICovCisgIGJvb2wKKyAgZGVjb2RlQW5kRGlzcGF0Y2hJbnB1dChjb25zdCBCbG9jayYgZWxlbWVudCk7CisKKyAgLy8gTG9jYWxGYWNlLXNwZWNpZmljIG1ldGhvZHMKKworICAvKiogXGJyaWVmIENoZWNrIGlmIExvY2FsQ29udHJvbEhlYWRlciBuZWVkcyB0byBiZSBpbmNsdWRlZCwgdGFraW5nIGludG8gYWNjb3VudAorICAgKiAgICAgICAgIGJvdGggc2V0IHBhcmFtZXRlcnMgaW4gc3VwcGxpZWQgTG9jYWxDb250cm9sSGVhZGVyIGFuZCBmZWF0dXJlcworICAgKiAgICAgICAgIGVuYWJsZWQgb24gdGhlIGxvY2FsIGZhY2UuCisgICAqLworICBib29sCisgIGlzRW1wdHlGaWx0ZXJlZExvY2FsQ29udHJvbEhlYWRlcihjb25zdCBuZG46Om5mZDo6TG9jYWxDb250cm9sSGVhZGVyJiBoZWFkZXIpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgQ3JlYXRlIExvY2FsQ29udHJvbEhlYWRlciwgY29uc2lkZXJpbmcgZW5hYmxlZCBmZWF0dXJlcworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgUGFja2V0PgorICBCbG9jaworICBmaWx0ZXJBbmRFbmNvZGVMb2NhbENvbnRyb2xIZWFkZXIoY29uc3QgUGFja2V0JiBwYWNrZXQpOworCitwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjxib29sPiBtX2xvY2FsQ29udHJvbEhlYWRlckZlYXR1cmVzOworfTsKKworaW5saW5lCitMb2NhbEZhY2U6OkxvY2FsRmFjZShjb25zdCBGYWNlVXJpJiByZW1vdGVVcmksIGNvbnN0IEZhY2VVcmkmIGxvY2FsVXJpKQorICA6IEZhY2UocmVtb3RlVXJpLCBsb2NhbFVyaSwgdHJ1ZSkKKyAgLCBtX2xvY2FsQ29udHJvbEhlYWRlckZlYXR1cmVzKExvY2FsRmFjZTo6TE9DQUxfQ09OVFJPTF9GRUFUVVJFX01BWCkKK3sKK30KKworaW5saW5lIGJvb2wKK0xvY2FsRmFjZTo6aXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZXNbTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0FOWV07Cit9CisKK2lubGluZSBib29sCitMb2NhbEZhY2U6OmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMb2NhbENvbnRyb2xGZWF0dXJlIGZlYXR1cmUpIGNvbnN0Cit7CisgIEJPT1NUX0FTU0VSVCgwIDwgZmVhdHVyZSAmJgorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihmZWF0dXJlKSA8IG1fbG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZXMuc2l6ZSgpKTsKKyAgcmV0dXJuIG1fbG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZXNbZmVhdHVyZV07Cit9CisKK2lubGluZSB2b2lkCitMb2NhbEZhY2U6OnNldExvY2FsQ29udHJvbEhlYWRlckZlYXR1cmUoTG9jYWxDb250cm9sRmVhdHVyZSBmZWF0dXJlLCBib29sIGVuYWJsZWQvKiA9IHRydWUqLykKK3sKKyAgQk9PU1RfQVNTRVJUKDAgPCBmZWF0dXJlICYmCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGZlYXR1cmUpIDwgbV9sb2NhbENvbnRyb2xIZWFkZXJGZWF0dXJlcy5zaXplKCkpOworCisgIG1fbG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZXNbZmVhdHVyZV0gPSBlbmFibGVkOworCisgIG1fbG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZXNbTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0FOWV0gPQorICAgIHN0ZDo6ZmluZChtX2xvY2FsQ29udHJvbEhlYWRlckZlYXR1cmVzLmJlZ2luKCkgKyAxLAorICAgICAgICAgICAgICBtX2xvY2FsQ29udHJvbEhlYWRlckZlYXR1cmVzLmVuZCgpLCB0cnVlKSA8CisgICAgICAgICAgICAgIG1fbG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZXMuZW5kKCk7CisgIC8vICdmaW5kKC4uKSA8IC5lbmQoKScgaW5zdGVhZCBvZiAnZmluZCguLikgIT0gLmVuZCgpJyBkdWUgdG8gTExWTSBCdWcgMTY4MTYKK30KKworaW5saW5lIGJvb2wKK0xvY2FsRmFjZTo6ZGVjb2RlQW5kRGlzcGF0Y2hJbnB1dChjb25zdCBCbG9jayYgZWxlbWVudCkKK3sKKyAgdHJ5IHsKKyAgICBjb25zdCBCbG9jayYgcGF5bG9hZCA9IG5kbjo6bmZkOjpMb2NhbENvbnRyb2xIZWFkZXI6OmdldFBheWxvYWQoZWxlbWVudCk7CisKKyAgICAvLyBJZiByZWNlaXZlZCBMb2NhbENvbnRyb2xIZWFkZXIsIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCBvbiB0aGUgZmFjZQorICAgIGlmICgoJnBheWxvYWQgIT0gJmVsZW1lbnQpICYmICF0aGlzLT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChwYXlsb2FkLnR5cGUoKSA9PSB0bHY6OkludGVyZXN0KQorICAgICAgeworICAgICAgICBzaGFyZWRfcHRyPEludGVyZXN0PiBpID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCk7CisgICAgICAgIGktPndpcmVEZWNvZGUocGF5bG9hZCk7CisgICAgICAgIGlmICgmcGF5bG9hZCAhPSAmZWxlbWVudCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpLT5nZXRMb2NhbENvbnRyb2xIZWFkZXIoKS53aXJlRGVjb2RlKGVsZW1lbnQsCisgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICB0aGlzLT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgdGhpcy0+b25SZWNlaXZlSW50ZXJlc3QoKmkpOworICAgICAgfQorICAgIGVsc2UgaWYgKHBheWxvYWQudHlwZSgpID09IHRsdjo6RGF0YSkKKyAgICAgIHsKKyAgICAgICAgc2hhcmVkX3B0cjxEYXRhPiBkID0gbWFrZV9zaGFyZWQ8RGF0YT4oKTsKKyAgICAgICAgZC0+d2lyZURlY29kZShwYXlsb2FkKTsKKworICAgICAgICAvLy8gXHRvZG8gVW5jb21tZW50IGFuZCBjb3JyZWN0IHRoZSBmb2xsb3dpbmcgd2hlbiB3ZSBoYXZlIG1vcmUKKyAgICAgICAgLy8vICAgICAgIG9wdGlvbnMgaW4gTG9jYWxDb250cm9sSGVhZGVyIHRoYXQgYXBwbHkgZm9yIGluY29taW5nCisgICAgICAgIC8vLyAgICAgICBEYXRhIHBhY2tldHMgKGlmIGV2ZXIpCisgICAgICAgIC8vIGlmICgmcGF5bG9hZCAhPSAmZWxlbWVudCkKKyAgICAgICAgLy8gICB7CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBkLT5nZXRMb2NhbENvbnRyb2xIZWFkZXIoKS53aXJlRGVjb2RlKGVsZW1lbnQsCisgICAgICAgIC8vICAgICAgIGZhbHNlLAorICAgICAgICAvLyAgICAgICBmYWxzZSk7CisgICAgICAgIC8vICAgfQorCisgICAgICAgIHRoaXMtPm9uUmVjZWl2ZURhdGEoKmQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhdGNoICh0bHY6OkVycm9yJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgYm9vbAorTG9jYWxGYWNlOjppc0VtcHR5RmlsdGVyZWRMb2NhbENvbnRyb2xIZWFkZXIoY29uc3QgbmRuOjpuZmQ6OkxvY2FsQ29udHJvbEhlYWRlciYgaGVhZGVyKSBjb25zdAoreworICBpZiAoIXRoaXMtPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZCgpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBoZWFkZXIuZW1wdHkodGhpcy0+aXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lEKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFBhY2tldD4KK2lubGluZSBCbG9jaworTG9jYWxGYWNlOjpmaWx0ZXJBbmRFbmNvZGVMb2NhbENvbnRyb2xIZWFkZXIoY29uc3QgUGFja2V0JiBwYWNrZXQpCit7CisgIHJldHVybiBwYWNrZXQuZ2V0TG9jYWxDb250cm9sSGVhZGVyKCkud2lyZUVuY29kZShwYWNrZXQsCisgICAgICAgICAgIHRoaXMtPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCksCisgICAgICAgICAgIGZhbHNlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZBQ0VfTE9DQUxfRkFDRV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9tdWx0aWNhc3QtdWRwLWZhY2UuY3BwIGIvTkZEL2RhZW1vbi9mYWNlL211bHRpY2FzdC11ZHAtZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjNmNkMgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9tdWx0aWNhc3QtdWRwLWZhY2UuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJtdWx0aWNhc3QtdWRwLWZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTkNMQVNTXzJURU1QTEFURV9TUEVDSUFMSVpBVElPTl9ERUZJTkUoRGF0YWdyYW1GYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0VWRwRmFjZTo6cHJvdG9jb2wsIE11bHRpY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aWNhc3RVZHBGYWNlIik7CisKK011bHRpY2FzdFVkcEZhY2U6Ok11bHRpY2FzdFVkcEZhY2UoY29uc3Qgc2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlOjpwcm90b2NvbDo6c29ja2V0PiYgcmVjdlNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlOjpwcm90b2NvbDo6c29ja2V0PiYgc2VuZFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGljYXN0VWRwRmFjZTo6cHJvdG9jb2w6OmVuZHBvaW50JiBsb2NhbEVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aWNhc3RVZHBGYWNlOjpwcm90b2NvbDo6ZW5kcG9pbnQmIG11bHRpY2FzdEVuZHBvaW50KQorICA6IERhdGFncmFtRmFjZTxwcm90b2NvbCwgTXVsdGljYXN0PihGYWNlVXJpKG11bHRpY2FzdEVuZHBvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZVVyaShsb2NhbEVuZHBvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdlNvY2tldCwgZmFsc2UpCisgICwgbV9tdWx0aWNhc3RHcm91cChtdWx0aWNhc3RFbmRwb2ludCkKKyAgLCBtX3NlbmRTb2NrZXQoc2VuZFNvY2tldCkKK3sKKyAgTkZEX0xPR19JTkZPKCJDcmVhdGluZyBtdWx0aWNhc3QgVURQIGZhY2UgZm9yIGdyb3VwICIgPDwgbV9tdWx0aWNhc3RHcm91cCk7Cit9CisKK2NvbnN0IE11bHRpY2FzdFVkcEZhY2U6OnByb3RvY29sOjplbmRwb2ludCYKK011bHRpY2FzdFVkcEZhY2U6OmdldE11bHRpY2FzdEdyb3VwKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbXVsdGljYXN0R3JvdXA7Cit9CisKK3ZvaWQKK011bHRpY2FzdFVkcEZhY2U6OnNlbmRCbG9jayhjb25zdCBCbG9jayYgYmxvY2spCit7CisgIG1fc2VuZFNvY2tldC0+YXN5bmNfc2VuZF90byhib29zdDo6YXNpbzo6YnVmZmVyKGJsb2NrLndpcmUoKSwgYmxvY2suc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbXVsdGljYXN0R3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZNdWx0aWNhc3RVZHBGYWNlOjpoYW5kbGVTZW5kLCB0aGlzLCBfMSwgXzIsIGJsb2NrKSk7Cit9CisKK3ZvaWQKK011bHRpY2FzdFVkcEZhY2U6OnNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIG9uU2VuZEludGVyZXN0KGludGVyZXN0KTsKKworICBORkRfTE9HX0RFQlVHKCJTZW5kaW5nIGludGVyZXN0Iik7CisgIHNlbmRCbG9jayhpbnRlcmVzdC53aXJlRW5jb2RlKCkpOworfQorCit2b2lkCitNdWx0aWNhc3RVZHBGYWNlOjpzZW5kRGF0YShjb25zdCBEYXRhJiBkYXRhKQoreworICAvLy8gXHRvZG8gQWZ0ZXIgdGhpcyBtZXRob2QgaW1wbGVtZW50cyBkdXBsaWNhdGUgc3VwcHJlc3Npb24sIG9uU2VuZERhdGEgZXZlbnQgc2hvdWxkCisgIC8vLyAgICAgICBiZSB0cmlnZ2VyZWQgb25seSB3aGVuIGRhdGEgaXMgYWN0dWFsbHkgc2VudCBvdXQKKyAgb25TZW5kRGF0YShkYXRhKTsKKworICBORkRfTE9HX0RFQlVHKCJTZW5kaW5nIGRhdGEiKTsKKyAgc2VuZEJsb2NrKGRhdGEud2lyZUVuY29kZSgpKTsKK30KKworYm9vbAorTXVsdGljYXN0VWRwRmFjZTo6aXNNdWx0aUFjY2VzcygpIGNvbnN0Cit7CisgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9tdWx0aWNhc3QtdWRwLWZhY2UuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL211bHRpY2FzdC11ZHAtZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjODU3ZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9tdWx0aWNhc3QtdWRwLWZhY2UuaHBwCkBAIC0wLDAgKzEsNzIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX01VTFRJQ0FTVF9VRFBfRkFDRV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX01VTFRJQ0FTVF9VRFBfRkFDRV9IUFAKKworI2luY2x1ZGUgImRhdGFncmFtLWZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqCisgKiBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgRmFjZSBhYnN0cmFjdGlvbiB0aGF0IHVzZXMKKyAqICAgICAgICBtdWx0aWNhc3QgVURQIGFzIHVuZGVybHlpbmcgdHJhbnNwb3J0IG1lY2hhbmlzbQorICovCitjbGFzcyBNdWx0aWNhc3RVZHBGYWNlIDogcHVibGljIERhdGFncmFtRmFjZTxib29zdDo6YXNpbzo6aXA6OnVkcCwgTXVsdGljYXN0PgoreworcHVibGljOgorICAvKioKKyAgICogXGJyaWVmIENyZWF0ZXMgYSBVRFAtYmFzZWQgZmFjZSBmb3IgbXVsdGljYXN0IGNvbW11bmljYXRpb24KKyAgICovCisgIE11bHRpY2FzdFVkcEZhY2UoY29uc3Qgc2hhcmVkX3B0cjxwcm90b2NvbDo6c29ja2V0PiYgcmVjdlNvY2tldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPHByb3RvY29sOjpzb2NrZXQ+JiBzZW5kU29ja2V0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvY29sOjplbmRwb2ludCYgbG9jYWxFbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBwcm90b2NvbDo6ZW5kcG9pbnQmIG11bHRpY2FzdEVuZHBvaW50KTsKKworICBjb25zdCBwcm90b2NvbDo6ZW5kcG9pbnQmCisgIGdldE11bHRpY2FzdEdyb3VwKCkgY29uc3Q7CisKKyAgLy8gZnJvbSBGYWNlCisgIHZpcnR1YWwgdm9pZAorICBzZW5kSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KTsKKworICB2aXJ0dWFsIHZvaWQKKyAgc2VuZERhdGEoY29uc3QgRGF0YSYgZGF0YSk7CisKKyAgdmlydHVhbCBib29sCisgIGlzTXVsdGlBY2Nlc3MoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZAorICBzZW5kQmxvY2soY29uc3QgQmxvY2smIGJsb2NrKTsKKworcHJpdmF0ZToKKyAgcHJvdG9jb2w6OmVuZHBvaW50IG1fbXVsdGljYXN0R3JvdXA7CisgIHNoYXJlZF9wdHI8cHJvdG9jb2w6OnNvY2tldD4gbV9zZW5kU29ja2V0OworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZBQ0VfTVVMVElDQVNUX1VEUF9GQUNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXBhcnNlLmNwcCBiL05GRC9kYWVtb24vZmFjZS9uZG5scC1wYXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkOTU5ZgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9uZG5scC1wYXJzZS5jcHAKQEAgLTAsMCArMSw5MiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgIm5kbmxwLXBhcnNlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgbmRubHAgeworCit2b2lkCitOZG5scERhdGE6OndpcmVEZWNvZGUoY29uc3QgQmxvY2smIHdpcmUpCit7CisgIGlmICh3aXJlLnR5cGUoKSAhPSB0bHY6Ok5kbmxwRGF0YSkgeworICAgIHRocm93IFBhcnNlRXJyb3IoInRvcCBlbGVtZW50IGlzIG5vdCBOZG5scERhdGEiKTsKKyAgfQorICB3aXJlLnBhcnNlKCk7CisgIGNvbnN0IEJsb2NrOjplbGVtZW50X2NvbnRhaW5lciYgZWxlbWVudHMgPSB3aXJlLmVsZW1lbnRzKCk7CisgIGlmIChlbGVtZW50cy5zaXplKCkgPCAyKSB7CisgICAgdGhyb3cgUGFyc2VFcnJvcigiTmRubHBEYXRhIGVsZW1lbnQgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgY2hpbGRyZW4iKTsKKyAgfQorCisgIGNvbnN0IEJsb2NrJiBzZXF1ZW5jZUVsZW1lbnQgPSBlbGVtZW50cy5mcm9udCgpOworICBpZiAoc2VxdWVuY2VFbGVtZW50LnR5cGUoKSAhPSB0bHY6Ok5kbmxwU2VxdWVuY2UpIHsKKyAgICB0aHJvdyBQYXJzZUVycm9yKCJOZG5scFNlcXVlbmNlIGVsZW1lbnQgaXMgbWlzc2luZyIpOworICB9CisgIGlmIChzZXF1ZW5jZUVsZW1lbnQudmFsdWVfc2l6ZSgpICE9IHNpemVvZih1aW50NjRfdCkpIHsKKyAgICB0aHJvdyBQYXJzZUVycm9yKCJOZG5scFNlcXVlbmNlIGVsZW1lbnQgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKKyAgfQorICBtX3NlcSA9IGJlNjR0b2goKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPigmKnNlcXVlbmNlRWxlbWVudC52YWx1ZV9iZWdpbigpKSk7CisKKyAgY29uc3QgQmxvY2smIHBheWxvYWRFbGVtZW50ID0gZWxlbWVudHMuYmFjaygpOworICBpZiAocGF5bG9hZEVsZW1lbnQudHlwZSgpICE9IHRsdjo6TmRubHBQYXlsb2FkKSB7CisgICAgdGhyb3cgUGFyc2VFcnJvcigiTmRubHBQYXlsb2FkIGVsZW1lbnQgaXMgbWlzc2luZyIpOworICB9CisgIG1fcGF5bG9hZCA9IHBheWxvYWRFbGVtZW50OworCisgIGlmIChlbGVtZW50cy5zaXplKCkgPT0gMikgeyAvLyBzaW5nbGUgd2lyZSBwYWNrZXQKKyAgICBtX2ZyYWdJbmRleCA9IDA7CisgICAgbV9mcmFnQ291bnQgPSAxOworICAgIHJldHVybjsKKyAgfQorICBpZiAoZWxlbWVudHMuc2l6ZSgpICE9IDQpIHsKKyAgICB0aHJvdyBQYXJzZUVycm9yKCJOZG5scERhdGEgZWxlbWVudCBoYXMgaW5jb3JyZWN0IG51bWJlciBvZiBjaGlsZHJlbiIpOworICB9CisKKyAgY29uc3QgQmxvY2smIGZyYWdJbmRleEVsZW1lbnQgPSBlbGVtZW50cy5hdCgxKTsKKyAgaWYgKGZyYWdJbmRleEVsZW1lbnQudHlwZSgpICE9IHRsdjo6TmRubHBGcmFnSW5kZXgpIHsKKyAgICB0aHJvdyBQYXJzZUVycm9yKCJOZG5scEZyYWdJbmRleCBlbGVtZW50IGlzIG1pc3NpbmciKTsKKyAgfQorICB1aW50NjRfdCBmcmFnSW5kZXggPSBuZG46OnJlYWROb25OZWdhdGl2ZUludGVnZXIoZnJhZ0luZGV4RWxlbWVudCk7CisgIGlmIChmcmFnSW5kZXggPiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkpIHsKKyAgICB0aHJvdyBQYXJzZUVycm9yKCJOZG5scEZyYWdJbmRleCBpcyB0b28gbGFyZ2UiKTsKKyAgfQorICBtX2ZyYWdJbmRleCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihmcmFnSW5kZXgpOworCisgIGNvbnN0IEJsb2NrJiBmcmFnQ291bnRFbGVtZW50ID0gZWxlbWVudHMuYXQoMik7CisgIGlmIChmcmFnQ291bnRFbGVtZW50LnR5cGUoKSAhPSB0bHY6Ok5kbmxwRnJhZ0NvdW50KSB7CisgICAgdGhyb3cgUGFyc2VFcnJvcigiTmRubHBGcmFnQ291bnQgZWxlbWVudCBpcyBtaXNzaW5nIik7CisgIH0KKyAgdWludDY0X3QgZnJhZ0NvdW50ID0gbmRuOjpyZWFkTm9uTmVnYXRpdmVJbnRlZ2VyKGZyYWdDb3VudEVsZW1lbnQpOworICBpZiAoZnJhZ0NvdW50ID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpKSB7CisgICAgdGhyb3cgUGFyc2VFcnJvcigiTmRubHBGcmFnQ291bnQgaXMgdG9vIGxhcmdlIik7CisgIH0KKyAgbV9mcmFnQ291bnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZnJhZ0NvdW50KTsKKworICBpZiAobV9mcmFnSW5kZXggPj0gbV9mcmFnQ291bnQpIHsKKyAgICB0aHJvdyBQYXJzZUVycm9yKCJOZG5scEZyYWdJbmRleCBtdXN0IGJlIGxlc3MgdGhhbiBOZG5scEZyYWdDb3VudCIpOworICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIG5kbmxwCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9uZG5scC1wYXJzZS5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtcGFyc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MGM5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtcGFyc2UuaHBwCkBAIC0wLDAgKzEsNzAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX05ETkxQX1BBUlNFX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfTkROTFBfUEFSU0VfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgIm5kbmxwLXRsdi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIG5kbmxwIHsKKworc3RydWN0IFBhcnNlRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCit7CisgIFBhcnNlRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgOiBzdGQ6OnJ1bnRpbWVfZXJyb3Iod2hhdCkKKyAgeworICB9Cit9OworCisvKiogXGJyaWVmIHJlcHJlc2VudHMgYSBOZG5scERhdGEgcGFja2V0CisgKgorICogIE5kbmxwRGF0YSA6Oj0gTkROTFAtREFUQS1UWVBFIFRMVi1MRU5HVEgKKyAqICAgICAgICAgICAgICAgICAgTmRubHBTZXF1ZW5jZQorICogICAgICAgICAgICAgICAgICBOZG5scEZyYWdJbmRleD8KKyAqICAgICAgICAgICAgICAgICAgTmRubHBGcmFnQ291bnQ/CisgKiAgICAgICAgICAgICAgICAgIE5kbmxwUGF5bG9hZAorICovCitjbGFzcyBOZG5scERhdGEKK3sKK3B1YmxpYzoKKyAgLyoqIFxicmllZiBwYXJzZSBhIE5kbmxwRGF0YSBwYWNrZXQKKyAgICoKKyAgICogIFxleGNlcHRpb24gUGFyc2VFcnJvciBwYWNrZXQgaXMgbWFsZm9ybWF0ZWQKKyAgICovCisgIHZvaWQKKyAgd2lyZURlY29kZShjb25zdCBCbG9jayYgd2lyZSk7CisKK3B1YmxpYzoKKyAgdWludDY0X3QgbV9zZXE7CisgIHVpbnQxNl90IG1fZnJhZ0luZGV4OworICB1aW50MTZfdCBtX2ZyYWdDb3VudDsKKyAgQmxvY2sgbV9wYXlsb2FkOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmRubHAKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX05ETkxQX1BBUlNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXBhcnRpYWwtbWVzc2FnZS1zdG9yZS5jcHAgYi9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtcGFydGlhbC1tZXNzYWdlLXN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE1NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXBhcnRpYWwtbWVzc2FnZS1zdG9yZS5jcHAKQEAgLTAsMCArMSwxMzcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJuZG5scC1wYXJ0aWFsLW1lc3NhZ2Utc3RvcmUuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBuZG5scCB7CisKK1BhcnRpYWxNZXNzYWdlOjpQYXJ0aWFsTWVzc2FnZSgpCisgIDogbV9mcmFnQ291bnQoMCkKKyAgLCBtX3JlY2VpdmVkKDApCisgICwgbV90b3RhbExlbmd0aCgwKQoreworfQorCitib29sCitQYXJ0aWFsTWVzc2FnZTo6YWRkKHVpbnQxNl90IGZyYWdJbmRleCwgdWludDE2X3QgZnJhZ0NvdW50LCBjb25zdCBCbG9jayYgcGF5bG9hZCkKK3sKKyAgaWYgKG1fcmVjZWl2ZWQgPT0gMCkgeyAvLyBmaXJzdCBwYWNrZXQKKyAgICBtX2ZyYWdDb3VudCA9IGZyYWdDb3VudDsKKyAgICBtX3BheWxvYWRzLnJlc2l6ZShmcmFnQ291bnQpOworICB9CisKKyAgaWYgKG1fZnJhZ0NvdW50ICE9IGZyYWdDb3VudCB8fCBmcmFnSW5kZXggPj0gbV9mcmFnQ291bnQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIW1fcGF5bG9hZHNbZnJhZ0luZGV4XS5lbXB0eSgpKSB7IC8vIGR1cGxpY2F0ZQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG1fcGF5bG9hZHNbZnJhZ0luZGV4XSA9IHBheWxvYWQ7CisgICsrbV9yZWNlaXZlZDsKKyAgbV90b3RhbExlbmd0aCArPSBwYXlsb2FkLnZhbHVlX3NpemUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK1BhcnRpYWxNZXNzYWdlOjppc0NvbXBsZXRlKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fcmVjZWl2ZWQgPT0gbV9mcmFnQ291bnQ7Cit9CisKK0Jsb2NrCitQYXJ0aWFsTWVzc2FnZTo6cmVhc3NlbWJsZSgpCit7CisgIEJPT1NUX0FTU0VSVCh0aGlzLT5pc0NvbXBsZXRlKCkpOworCisgIG5kbjo6QnVmZmVyUHRyIGJ1ZmZlciA9IG1ha2Vfc2hhcmVkPG5kbjo6QnVmZmVyPihtX3RvdGFsTGVuZ3RoKTsKKyAgdWludDhfdCogYnVmID0gYnVmZmVyLT5nZXQoKTsKKyAgZm9yIChzdGQ6OnZlY3RvcjxCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wYXlsb2Fkcy5iZWdpbigpOworICAgICAgIGl0ICE9IG1fcGF5bG9hZHMuZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCBCbG9jayYgcGF5bG9hZCA9ICppdDsKKyAgICBtZW1jcHkoYnVmLCBwYXlsb2FkLnZhbHVlKCksIHBheWxvYWQudmFsdWVfc2l6ZSgpKTsKKyAgICBidWYgKz0gcGF5bG9hZC52YWx1ZV9zaXplKCk7CisgIH0KKworICByZXR1cm4gQmxvY2soYnVmZmVyKTsKK30KKworUGFydGlhbE1lc3NhZ2VTdG9yZTo6UGFydGlhbE1lc3NhZ2VTdG9yZShjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgaWRsZUR1cmF0aW9uKQorICA6IG1faWRsZUR1cmF0aW9uKGlkbGVEdXJhdGlvbikKK3sKK30KKworUGFydGlhbE1lc3NhZ2VTdG9yZTo6flBhcnRpYWxNZXNzYWdlU3RvcmUoKQoreworfQorCit2b2lkCitQYXJ0aWFsTWVzc2FnZVN0b3JlOjpyZWNlaXZlTmRubHBEYXRhKGNvbnN0IEJsb2NrJiBwa3QpCit7CisgIE5kbmxwRGF0YSBwYXJzZWQ7CisgIHBhcnNlZC53aXJlRGVjb2RlKHBrdCk7CisgIGlmIChwYXJzZWQubV9mcmFnQ291bnQgPT0gMSkgeyAvLyBzaW5nbGUgZnJhZ21lbnQKKyAgICB0aGlzLT5vblJlY2VpdmUocGFyc2VkLm1fcGF5bG9hZC5ibG9ja0Zyb21WYWx1ZSgpKTsKKyAgICByZXR1cm47CisgIH0KKworICB1aW50NjRfdCBtZXNzYWdlSWRlbnRpZmllciA9IHBhcnNlZC5tX3NlcSAtIHBhcnNlZC5tX2ZyYWdJbmRleDsKKyAgc2hhcmVkX3B0cjxQYXJ0aWFsTWVzc2FnZT4gcG0gPSBtX3BhcnRpYWxNZXNzYWdlc1ttZXNzYWdlSWRlbnRpZmllcl07CisgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4ocG0pKSB7CisgICAgbV9wYXJ0aWFsTWVzc2FnZXNbbWVzc2FnZUlkZW50aWZpZXJdID0gcG0gPSBtYWtlX3NoYXJlZDxQYXJ0aWFsTWVzc2FnZT4oKTsKKyAgfQorICB0aGlzLT5zY2hlZHVsZUNsZWFudXAobWVzc2FnZUlkZW50aWZpZXIsIHBtKTsKKworICBwbS0+YWRkKHBhcnNlZC5tX2ZyYWdJbmRleCwgcGFyc2VkLm1fZnJhZ0NvdW50LCBwYXJzZWQubV9wYXlsb2FkKTsKKyAgaWYgKHBtLT5pc0NvbXBsZXRlKCkpIHsKKyAgICB0aGlzLT5vblJlY2VpdmUocG0tPnJlYXNzZW1ibGUoKSk7CisgICAgdGhpcy0+Y2xlYW51cChtZXNzYWdlSWRlbnRpZmllcik7CisgIH0KK30KKwordm9pZAorUGFydGlhbE1lc3NhZ2VTdG9yZTo6c2NoZWR1bGVDbGVhbnVwKHVpbnQ2NF90IG1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8UGFydGlhbE1lc3NhZ2U+IHBhcnRpYWxNZXNzYWdlKQoreworICBwYXJ0aWFsTWVzc2FnZS0+bV9leHBpcnkgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKG1faWRsZUR1cmF0aW9uLAorICAgIGJpbmQoJlBhcnRpYWxNZXNzYWdlU3RvcmU6OmNsZWFudXAsIHRoaXMsIG1lc3NhZ2VJZGVudGlmaWVyKSk7Cit9CisKK3ZvaWQKK1BhcnRpYWxNZXNzYWdlU3RvcmU6OmNsZWFudXAodWludDY0X3QgbWVzc2FnZUlkZW50aWZpZXIpCit7CisgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzaGFyZWRfcHRyPFBhcnRpYWxNZXNzYWdlPiA+OjppdGVyYXRvciBpdCA9CisgICAgbV9wYXJ0aWFsTWVzc2FnZXMuZmluZChtZXNzYWdlSWRlbnRpZmllcik7CisgIGlmIChpdCA9PSBtX3BhcnRpYWxNZXNzYWdlcy5lbmQoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNjaGVkdWxlcjo6Y2FuY2VsKGl0LT5zZWNvbmQtPm1fZXhwaXJ5KTsKKyAgbV9wYXJ0aWFsTWVzc2FnZXMuZXJhc2UoaXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBuZG5scAorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtcGFydGlhbC1tZXNzYWdlLXN0b3JlLmhwcCBiL05GRC9kYWVtb24vZmFjZS9uZG5scC1wYXJ0aWFsLW1lc3NhZ2Utc3RvcmUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDdkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtcGFydGlhbC1tZXNzYWdlLXN0b3JlLmhwcApAQCAtMCwwICsxLDEwNSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfTkROTFBfUEFSVElBTF9NRVNTQUdFX1NUT1JFX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfTkROTFBfUEFSVElBTF9NRVNTQUdFX1NUT1JFX0hQUAorCisjaW5jbHVkZSAibmRubHAtcGFyc2UuaHBwIgorI2luY2x1ZGUgImNvcmUvc2NoZWR1bGVyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgbmRubHAgeworCisvKiogXGJyaWVmIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgcmVjZWl2ZWQgbWVzc2FnZQorICovCitjbGFzcyBQYXJ0aWFsTWVzc2FnZSA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIFBhcnRpYWxNZXNzYWdlKCk7CisKKyAgYm9vbAorICBhZGQodWludDE2X3QgZnJhZ0luZGV4LCB1aW50MTZfdCBmcmFnQ291bnQsIGNvbnN0IEJsb2NrJiBwYXlsb2FkKTsKKworICBib29sCisgIGlzQ29tcGxldGUoKSBjb25zdDsKKworICAvKiogXGJyaWVmIHJlYXNzZW1ibGUgbmV0d29yayBsYXllciBwYWNrZXQKKyAgICoKKyAgICogIGlzQ29tcGxldGUoKSBtdXN0IGJlIHRydWUgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QKKyAgICoKKyAgICogIFxleGNlcHRpb24gbmRuOjpCbG9jazo6RXJyb3IgcGFja2V0IGlzIG1hbGZvcm1hdGVkCisgICAqICBccmV0dXJuIG5ldHdvcmsgbGF5ZXIgcGFja2V0CisgICAqLworICBCbG9jaworICByZWFzc2VtYmxlKCk7CisKK3B1YmxpYzoKKyAgRXZlbnRJZCBtX2V4cGlyeTsKKworcHJpdmF0ZToKKyAgc2l6ZV90IG1fZnJhZ0NvdW50OworICBzaXplX3QgbV9yZWNlaXZlZDsKKyAgc3RkOjp2ZWN0b3I8QmxvY2s+IG1fcGF5bG9hZHM7CisgIHNpemVfdCBtX3RvdGFsTGVuZ3RoOworfTsKKworLyoqIFxicmllZiBwcm92aWRlcyByZWFzc2VtYmx5IGZlYXR1cmUgYXQgcmVjZWl2ZXIKKyAqLworY2xhc3MgUGFydGlhbE1lc3NhZ2VTdG9yZSA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIGV4cGxpY2l0CisgIFBhcnRpYWxNZXNzYWdlU3RvcmUoY29uc3QgdGltZTo6bmFub3NlY29uZHMmIGlkbGVEdXJhdGlvbiA9IHRpbWU6Om1pbGxpc2Vjb25kcygxMDApKTsKKworICB2aXJ0dWFsCisgIH5QYXJ0aWFsTWVzc2FnZVN0b3JlKCk7CisKKyAgLyoqIFxicmllZiByZWNlaXZlIGEgTmRubHBEYXRhIHBhY2tldAorICAgKgorICAgKiAgXGV4Y2VwdGlvbiBQYXJzZUVycm9yIE5ETkxQIHBhY2tldCBpcyBtYWxmb3JtYXRlZAorICAgKiAgXGV4Y2VwdGlvbiBuZG46OkJsb2NrOjpFcnJvciBuZXR3b3JrIGxheWVyIHBhY2tldCBpcyBtYWxmb3JtYXRlZAorICAgKi8KKyAgdm9pZAorICByZWNlaXZlTmRubHBEYXRhKGNvbnN0IEJsb2NrJiBwa3QpOworCisgIC8vLyBmaXJlcyB3aGVuIG5ldHdvcmsgbGF5ZXIgcGFja2V0IGlzIHJlY2VpdmVkCisgIEV2ZW50RW1pdHRlcjxCbG9jaz4gb25SZWNlaXZlOworCitwcml2YXRlOgorICB2b2lkCisgIHNjaGVkdWxlQ2xlYW51cCh1aW50NjRfdCBtZXNzYWdlSWRlbnRpZmllciwgc2hhcmVkX3B0cjxQYXJ0aWFsTWVzc2FnZT4gcGFydGlhbE1lc3NhZ2UpOworCisgIHZvaWQKKyAgY2xlYW51cCh1aW50NjRfdCBtZXNzYWdlSWRlbnRpZmllcik7CisKK3ByaXZhdGU6CisgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzaGFyZWRfcHRyPFBhcnRpYWxNZXNzYWdlPiA+IG1fcGFydGlhbE1lc3NhZ2VzOworCisgIHRpbWU6Om5hbm9zZWNvbmRzIG1faWRsZUR1cmF0aW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmRubHAKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX05ETkxQX1BBUlRJQUxfTUVTU0FHRV9TVE9SRV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9uZG5scC1zZXF1ZW5jZS1nZW5lcmF0b3IuY3BwIGIvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXNlcXVlbmNlLWdlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyYTMxOQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9uZG5scC1zZXF1ZW5jZS1nZW5lcmF0b3IuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJuZG5scC1zZXF1ZW5jZS1nZW5lcmF0b3IuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBuZG5scCB7CisKK1NlcXVlbmNlQmxvY2s6OlNlcXVlbmNlQmxvY2sodWludDY0X3Qgc3RhcnQsIHNpemVfdCBjb3VudCkKKyAgOiBtX3N0YXJ0KHN0YXJ0KQorICAsIG1fY291bnQoY291bnQpCit7Cit9CisKK1NlcXVlbmNlR2VuZXJhdG9yOjpTZXF1ZW5jZUdlbmVyYXRvcigpCisgIDogbV9uZXh0KDApCit7Cit9CisKK1NlcXVlbmNlQmxvY2sKK1NlcXVlbmNlR2VuZXJhdG9yOjpuZXh0QmxvY2soc2l6ZV90IGNvdW50KQoreworICBTZXF1ZW5jZUJsb2NrIHNiKG1fbmV4dCwgY291bnQpOworICBtX25leHQgKz0gY291bnQ7CisgIHJldHVybiBzYjsKK30KKworfSAvLyBuYW1lc3BhY2UgbmRubHAKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXNlcXVlbmNlLWdlbmVyYXRvci5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtc2VxdWVuY2UtZ2VuZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2JhYTZiCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXNlcXVlbmNlLWdlbmVyYXRvci5ocHAKQEAgLTAsMCArMSw5MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfTkROTFBfU0VRVUVOQ0VfR0VORVJBVE9SX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfTkROTFBfU0VRVUVOQ0VfR0VORVJBVE9SX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgbmRubHAgeworCisvKiogXGJyaWVmIHJlcHJlc2VudHMgYSBibG9jayBvZiBzZXF1ZW5jZSBudW1iZXJzCisgKi8KK2NsYXNzIFNlcXVlbmNlQmxvY2sKK3sKK3B1YmxpYzoKKyAgU2VxdWVuY2VCbG9jayh1aW50NjRfdCBzdGFydCwgc2l6ZV90IGNvdW50KTsKKworICAvKiogXHJldHVybnsgdGhlIHBvcy10aCBzZXF1ZW5jZSBudW1iZXIgfQorICAgKi8KKyAgdWludDY0X3QKKyAgb3BlcmF0b3JbXShzaXplX3QgcG9zKSBjb25zdDsKKworICBzaXplX3QKKyAgY291bnQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdWludDY0X3QgbV9zdGFydDsKKyAgc2l6ZV90IG1fY291bnQ7Cit9OworCitpbmxpbmUgdWludDY0X3QKK1NlcXVlbmNlQmxvY2s6Om9wZXJhdG9yW10oc2l6ZV90IHBvcykgY29uc3QKK3sKKyAgaWYgKHBvcyA+PSBtX2NvdW50KQorICAgIHRocm93IHN0ZDo6b3V0X29mX3JhbmdlKCJwb3MiKTsKKyAgcmV0dXJuIG1fc3RhcnQgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocG9zKTsKK30KKworaW5saW5lIHNpemVfdAorU2VxdWVuY2VCbG9jazo6Y291bnQoKSBjb25zdAoreworICByZXR1cm4gbV9jb3VudDsKK30KKworLyoqIFxjbGFzcyBTZXF1ZW5jZUdlbmVyYXRvcgorICogIFxicmllZiBnZW5lcmF0ZXMgc2VxdWVuY2UgbnVtYmVycworICovCitjbGFzcyBTZXF1ZW5jZUdlbmVyYXRvciA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIFNlcXVlbmNlR2VuZXJhdG9yKCk7CisKKyAgLyoqIFxicmllZiBnZW5lcmF0ZXMgYSBibG9jayBvZiBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBudW1iZXJzCisgICAqCisgICAqICBUaGlzIGJsb2NrIG11c3Qgbm90IG92ZXJsYXAgd2l0aCBhIHJlY2VudCBibG9jay4KKyAgICovCisgIFNlcXVlbmNlQmxvY2sKKyAgbmV4dEJsb2NrKHNpemVfdCBjb3VudCk7CisKK3ByaXZhdGU6CisgIC8vLyBuZXh0IHNlcXVlbmNlIG51bWJlcgorICB1aW50NjRfdCBtX25leHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZG5scAorfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZBQ0VfTkROTFBfU0VRVUVOQ0VfR0VORVJBVE9SX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXNsaWNlci5jcHAgYi9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtc2xpY2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODVmNzlmCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXNsaWNlci5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJuZG5scC1zbGljZXIuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9lbmNvZGluZy9lbmNvZGluZy1idWZmZXIuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBuZG5scCB7CisKK1NsaWNlcjo6U2xpY2VyKHNpemVfdCBtdHUpCisgIDogbV9tdHUobXR1KQoreworICB0aGlzLT5lc3RpbWF0ZU92ZXJoZWFkKCk7Cit9CisKK1NsaWNlcjo6flNsaWNlcigpCit7Cit9CisKK3RlbXBsYXRlPGJvb2wgVD4KK3NpemVfdAorU2xpY2VyOjplbmNvZGVGcmFnbWVudChuZG46OkVuY29kaW5nSW1wbDxUPiYgYmxrLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZXEsIHVpbnQxNl90IGZyYWdJbmRleCwgdWludDE2X3QgZnJhZ0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwYXlsb2FkLCBzaXplX3QgcGF5bG9hZFNpemUpCit7CisgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisKKyAgLy8gTmRubHBQYXlsb2FkCisgIHNpemVfdCBwYXlsb2FkTGVuZ3RoID0gYmxrLnByZXBlbmRCeXRlQXJyYXkocGF5bG9hZCwgcGF5bG9hZFNpemUpOworICB0b3RhbExlbmd0aCArPSBwYXlsb2FkTGVuZ3RoOworICB0b3RhbExlbmd0aCArPSBibGsucHJlcGVuZFZhck51bWJlcihwYXlsb2FkTGVuZ3RoKTsKKyAgdG90YWxMZW5ndGggKz0gYmxrLnByZXBlbmRWYXJOdW1iZXIodGx2OjpOZG5scFBheWxvYWQpOworCisgIGJvb2wgbmVlZEZyYWdJbmRleEFuZENvdW50ID0gZnJhZ0NvdW50ID4gMTsKKyAgaWYgKG5lZWRGcmFnSW5kZXhBbmRDb3VudCkgeworICAgIC8vIE5kbmxwRnJhZ0NvdW50CisgICAgc2l6ZV90IGZyYWdDb3VudExlbmd0aCA9IGJsay5wcmVwZW5kTm9uTmVnYXRpdmVJbnRlZ2VyKGZyYWdDb3VudCk7CisgICAgdG90YWxMZW5ndGggKz0gZnJhZ0NvdW50TGVuZ3RoOworICAgIHRvdGFsTGVuZ3RoICs9IGJsay5wcmVwZW5kVmFyTnVtYmVyKGZyYWdDb3VudExlbmd0aCk7CisgICAgdG90YWxMZW5ndGggKz0gYmxrLnByZXBlbmRWYXJOdW1iZXIodGx2OjpOZG5scEZyYWdDb3VudCk7CisKKyAgICAvLyBOZG5scEZyYWdJbmRleAorICAgIHNpemVfdCBmcmFnSW5kZXhMZW5ndGggPSBibGsucHJlcGVuZE5vbk5lZ2F0aXZlSW50ZWdlcihmcmFnSW5kZXgpOworICAgIHRvdGFsTGVuZ3RoICs9IGZyYWdJbmRleExlbmd0aDsKKyAgICB0b3RhbExlbmd0aCArPSBibGsucHJlcGVuZFZhck51bWJlcihmcmFnSW5kZXhMZW5ndGgpOworICAgIHRvdGFsTGVuZ3RoICs9IGJsay5wcmVwZW5kVmFyTnVtYmVyKHRsdjo6TmRubHBGcmFnSW5kZXgpOworICB9CisKKyAgLy8gTmRubHBTZXF1ZW5jZQorICB1aW50NjRfdCBzZXF1ZW5jZUJFID0gaHRvYmU2NChzZXEpOworICBzaXplX3Qgc2VxdWVuY2VMZW5ndGggPSBibGsucHJlcGVuZEJ5dGVBcnJheSgKKyAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc2VxdWVuY2VCRSksIHNpemVvZihzZXF1ZW5jZUJFKSk7CisgIHRvdGFsTGVuZ3RoICs9IHNlcXVlbmNlTGVuZ3RoOworICB0b3RhbExlbmd0aCArPSBibGsucHJlcGVuZFZhck51bWJlcihzZXF1ZW5jZUxlbmd0aCk7CisgIHRvdGFsTGVuZ3RoICs9IGJsay5wcmVwZW5kVmFyTnVtYmVyKHRsdjo6TmRubHBTZXF1ZW5jZSk7CisKKyAgLy8gTmRubHBEYXRhCisgIHRvdGFsTGVuZ3RoICs9IGJsay5wcmVwZW5kVmFyTnVtYmVyKHRvdGFsTGVuZ3RoKTsKKyAgdG90YWxMZW5ndGggKz0gYmxrLnByZXBlbmRWYXJOdW1iZXIodGx2OjpOZG5scERhdGEpOworCisgIHJldHVybiB0b3RhbExlbmd0aDsKK30KKwordm9pZAorU2xpY2VyOjplc3RpbWF0ZU92ZXJoZWFkKCkKK3sKKyAgLy8gZXN0aW1hdGUgZnJhZ21lbnQgc2l6ZSB3aXRoIGFsbCBoZWFkZXIgZmllbGRzIGF0IGxhcmdlc3QgcG9zc2libGUgc2l6ZQorICBuZG46OkVuY29kaW5nRXN0aW1hdG9yIGVzdGltYXRvcjsKKyAgc2l6ZV90IGVzdGltYXRlZFNpemUgPSB0aGlzLT5lbmNvZGVGcmFnbWVudChlc3RpbWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG1fbXR1KTsKKworICBzaXplX3Qgb3ZlcmhlYWQgPSBlc3RpbWF0ZWRTaXplIC0gbV9tdHU7IC8vIG1pbnVzIHBheWxvYWQgbGVuZ3RoIGluIGVzdGltYXRpb24KKyAgbV9tYXhQYXlsb2FkID0gbV9tdHUgLSBvdmVyaGVhZDsKK30KKworUGFja2V0QXJyYXkKK1NsaWNlcjo6c2xpY2UoY29uc3QgQmxvY2smIGJsb2NrKQoreworICBCT09TVF9BU1NFUlQoYmxvY2suaGFzV2lyZSgpKTsKKyAgY29uc3QgdWludDhfdCogbmV0d29ya1BhY2tldCA9IGJsb2NrLndpcmUoKTsKKyAgc2l6ZV90IG5ldHdvcmtQYWNrZXRTaXplID0gYmxvY2suc2l6ZSgpOworCisgIHVpbnQxNl90IGZyYWdDb3VudCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAobmV0d29ya1BhY2tldFNpemUgLyBtX21heFBheWxvYWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAobmV0d29ya1BhY2tldFNpemUgJSBtX21heFBheWxvYWQgPT0gMCA/IDAgOiAxKQorICAgICAgICAgICAgICAgICAgICAgICApOworICBQYWNrZXRBcnJheSBwYSA9IG1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPEJsb2NrPj4oKTsKKyAgcGEtPnJlc2VydmUoZnJhZ0NvdW50KTsKKyAgU2VxdWVuY2VCbG9jayBzZXFCbG9jayA9IG1fc2VxZ2VuLm5leHRCbG9jayhmcmFnQ291bnQpOworCisgIGZvciAodWludDE2X3QgZnJhZ0luZGV4ID0gMDsgZnJhZ0luZGV4IDwgZnJhZ0NvdW50OyArK2ZyYWdJbmRleCkgeworICAgIHNpemVfdCBwYXlsb2FkT2Zmc2V0ID0gZnJhZ0luZGV4ICogbV9tYXhQYXlsb2FkOworICAgIGNvbnN0IHVpbnQ4X3QqIHBheWxvYWQgPSBuZXR3b3JrUGFja2V0ICsgcGF5bG9hZE9mZnNldDsKKyAgICBzaXplX3QgcGF5bG9hZFNpemUgPSBzdGQ6Om1pbihtX21heFBheWxvYWQsIG5ldHdvcmtQYWNrZXRTaXplIC0gcGF5bG9hZE9mZnNldCk7CisKKyAgICBuZG46OkVuY29kaW5nQnVmZmVyIGJ1ZmZlcihtX210dSwgMCk7CisgICAgc2l6ZV90IHBrdFNpemUgPSB0aGlzLT5lbmNvZGVGcmFnbWVudChidWZmZXIsCisgICAgICBzZXFCbG9ja1tmcmFnSW5kZXhdLCBmcmFnSW5kZXgsIGZyYWdDb3VudCwgcGF5bG9hZCwgcGF5bG9hZFNpemUpOworCisgICAgQk9PU1RfVkVSSUZZKHBrdFNpemUgPD0gbV9tdHUpOworCisgICAgcGEtPnB1c2hfYmFjayhidWZmZXIuYmxvY2soKSk7CisgIH0KKworICByZXR1cm4gcGE7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5kbmxwCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9uZG5scC1zbGljZXIuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL25kbmxwLXNsaWNlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkOTA1NgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9uZG5scC1zbGljZXIuaHBwCkBAIC0wLDAgKzEsNzkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX05ETkxQX1NMSUNFUl9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX05ETkxQX1NMSUNFUl9IUFAKKworI2luY2x1ZGUgIm5kbmxwLXRsdi5ocHAiCisjaW5jbHVkZSAibmRubHAtc2VxdWVuY2UtZ2VuZXJhdG9yLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgbmRubHAgeworCit0eXBlZGVmIHNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8QmxvY2s+PiBQYWNrZXRBcnJheTsKKworLyoqIFxicmllZiBwcm92aWRlcyBmcmFnbWVudGF0aW9uIGZlYXR1cmUgYXQgc2VuZGVyCisgKi8KK2NsYXNzIFNsaWNlciA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIC8qKiBccGFyYW0gbXR1IG1heGltdW0gc2l6ZSBvZiBORE5MUCBoZWFkZXIgYW5kIHBheWxvYWQKKyAgICogIFxub3RlIElmIE5ETkxQIHBhY2tldHMgYXJlIHRvIGJlIGVuY2Fwc3VsYXRlZCBpbiBhbiBhZGRpdGlvbmFsIGhlYWRlcgorICAgKiAgICAgICAgKGVnLiBpbiBVRFAgcGFja2V0cyksIHRoZSBjYWxsZXIgbXVzdCBkZWR1Y3Qgc3VjaCBvdmVyaGVhZC4KKyAgICovCisgIGV4cGxpY2l0CisgIFNsaWNlcihzaXplX3QgbXR1KTsKKworICB2aXJ0dWFsCisgIH5TbGljZXIoKTsKKworICBQYWNrZXRBcnJheQorICBzbGljZShjb25zdCBCbG9jayYgYmxvY2spOworCitwcml2YXRlOgorICB0ZW1wbGF0ZTxib29sIFQ+CisgIHNpemVfdAorICBlbmNvZGVGcmFnbWVudChuZG46OkVuY29kaW5nSW1wbDxUPiYgYmxrLAorICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZXEsIHVpbnQxNl90IGZyYWdJbmRleCwgdWludDE2X3QgZnJhZ0NvdW50LAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwYXlsb2FkLCBzaXplX3QgcGF5bG9hZFNpemUpOworCisgIC8vLyBlc3RpbWF0ZSB0aGUgc2l6ZSBvZiBORE5MUCBoZWFkZXIgYW5kIG1heGltdW0gcGF5bG9hZCBzaXplIHBlciBwYWNrZXQKKyAgdm9pZAorICBlc3RpbWF0ZU92ZXJoZWFkKCk7CisKK3ByaXZhdGU6CisgIFNlcXVlbmNlR2VuZXJhdG9yIG1fc2VxZ2VuOworCisgIC8vLyBtYXhpbXVtIHBhY2tldCBzaXplCisgIHNpemVfdCBtX210dTsKKworICAvLy8gbWF4aW11bSBwYXlsb2FkIHNpemUKKyAgc2l6ZV90IG1fbWF4UGF5bG9hZDsKK307CisKK30gLy8gbmFtZXNwYWNlIG5kbmxwCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9ORE5MUF9TTElDRVJfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtdGx2LmhwcCBiL05GRC9kYWVtb24vZmFjZS9uZG5scC10bHYuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDFmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvbmRubHAtdGx2LmhwcApAQCAtMCwwICsxLDQzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9EQUVNT05fRkFDRV9ORE5MUF9UTFZfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9ORE5MUF9UTFZfSFBQCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRsdiB7CisKK2VudW0KK3sKKyAgTmRubHBEYXRhICAgICAgPSA4MCwKKyAgTmRubHBTZXF1ZW5jZSAgPSA4MSwKKyAgTmRubHBGcmFnSW5kZXggPSA4MiwKKyAgTmRubHBGcmFnQ291bnQgPSA4MywKKyAgTmRubHBQYXlsb2FkICAgPSA4NAorfTsKKworfSAvLyBuYW1lc3BhY2UgdGx2Cit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9ORE5MUF9UTFZfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvbnVsbC1mYWNlLmNwcCBiL05GRC9kYWVtb24vZmFjZS9udWxsLWZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTU2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvbnVsbC1mYWNlLmNwcApAQCAtMCwwICsxLDU0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAibnVsbC1mYWNlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKKy8vIEZJQiBtaWdodCByZXN0cmljdCBjcmVhdGluZyBhIG5leHRob3AgcmVjb3JkIHRvd2FyZCBub24tbG9jYWwgZmFjZSBpbiAvbG9jYWxob3N0IG5hbWVzcGFjZS4KKy8vIE51bGxGYWNlIGhhcyBpc0xvY2FsPXRydWUgdG8gZW5hYmxlIGNyZWF0aW5nIGEgImJsYWNraG9sZSIgRklCIGVudHJ5IHVuZGVyIC9sb2NhbGhvc3QuCisKK051bGxGYWNlOjpOdWxsRmFjZShjb25zdCBGYWNlVXJpJiB1cmkpCisgIDogRmFjZSh1cmksIHVyaSwgdHJ1ZSkKK3sKK30KKwordm9pZAorTnVsbEZhY2U6OnNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCit7Cit9CisKK3ZvaWQKK051bGxGYWNlOjpzZW5kRGF0YShjb25zdCBEYXRhJiBkYXRhKQoreworfQorCit2b2lkCitOdWxsRmFjZTo6Y2xvc2UoKQoreworICB0aGlzLT5mYWlsKCJjbG9zZSIpOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9udWxsLWZhY2UuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL251bGwtZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZTU3MQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS9udWxsLWZhY2UuaHBwCkBAIC0wLDAgKzEsNjAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX05VTExfRkFDRV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX05VTExfRkFDRV9IUFAKKworI2luY2x1ZGUgImZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqCisgKiBcYnJpZWYgYSBGYWNlIHRoYXQgaGFzIG5vIHVuZGVybHlpbmcgdHJhbnNwb3J0IGFuZCBkcm9wcyBldmVyeSBwYWNrZXQKKyAqLworY2xhc3MgTnVsbEZhY2UgOiBwdWJsaWMgRmFjZQoreworcHVibGljOgorICBleHBsaWNpdAorICBOdWxsRmFjZShjb25zdCBGYWNlVXJpJiB1cmkgPSBGYWNlVXJpKCJudWxsOi8vIikpOworCisgIHZpcnR1YWwgdm9pZAorICBzZW5kSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KTsKKworICAvLy8gc2VuZCBhIERhdGEKKyAgdmlydHVhbCB2b2lkCisgIHNlbmREYXRhKGNvbnN0IERhdGEmIGRhdGEpOworCisgIC8qKiBcYnJpZWYgQ2xvc2UgdGhlIGZhY2UKKyAgICoKKyAgICogIFRoaXMgdGVybWluYXRlcyBhbGwgY29tbXVuaWNhdGlvbiBvbiB0aGUgZmFjZSBhbmQgY2F1c2UKKyAgICogIG9uRmFpbCgpIG1ldGhvZCBldmVudCB0byBiZSBpbnZva2VkCisgICAqLworICB2aXJ0dWFsIHZvaWQKKyAgY2xvc2UoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX05VTExfRkFDRV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9wcm90b2NvbC1mYWN0b3J5LmhwcCBiL05GRC9kYWVtb24vZmFjZS9wcm90b2NvbC1mYWN0b3J5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQyMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3Byb3RvY29sLWZhY3RvcnkuaHBwCkBAIC0wLDAgKzEsNzkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX1BST1RPQ09MX0ZBQ1RPUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9QUk9UT0NPTF9GQUNUT1JZX0hQUAorCisjaW5jbHVkZSAiZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBDaGFubmVsOworCisvKioKKyAqIFxicmllZiBQcm90b3R5cGUgZm9yIHRoZSBjYWxsYmFjayBjYWxsZWQgd2hlbiBmYWNlIGlzIGNyZWF0ZWQKKyAqICAgICAgICAoYXMgYSByZXNwb25zZSB0byBpbmNvbWluZyBjb25uZWN0aW9uIG9yIGFmdGVyIGNvbm5lY3Rpb24KKyAqICAgICAgICBpcyBlc3RhYmxpc2hlZCkKKyAqLwordHlwZWRlZiBmdW5jdGlvbjx2b2lkKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIG5ld0ZhY2UpPiBGYWNlQ3JlYXRlZENhbGxiYWNrOworCisvKioKKyAqIFxicmllZiBQcm90b3R5cGUgZm9yIHRoZSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIGZhY2UgaXMgZmFpbGVkIHRvCisgKiAgICAgICAgZ2V0IGNyZWF0ZWQKKyAqLwordHlwZWRlZiBmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pPiBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrOworCisKK2NsYXNzIFByb3RvY29sRmFjdG9yeQoreworcHVibGljOgorICAvKioKKyAgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIHRocm93biBieSBjaGFubmVsIGZhY3RvcmllcworICAgKi8KKyAgc3RydWN0IEVycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpIDogc3RkOjpydW50aW1lX2Vycm9yKHdoYXQpIHt9CisgIH07CisKKyAgLyoqIFxicmllZiBUcnkgdG8gY3JlYXRlIEZhY2UgdXNpbmcgdGhlIHN1cHBsaWVkIEZhY2UgVVJJCisgICAqCisgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNob29zZSBjaGFubmVsLCBiYXNlZCBvbiBzdXBwbGllZCBGYWNlIFVSSQorICAgKiBhbmQgY3JlYXRlIGZhY2UuCisgICAqCisgICAqIFx0aHJvd3MgRmFjdG9yeTo6RXJyb3IgaWYgRmFjdG9yeSBkb2VzIG5vdCBzdXBwb3J0IGNvbm5lY3Qgb3BlcmF0aW9uCisgICAqLworICB2aXJ0dWFsIHZvaWQKKyAgY3JlYXRlRmFjZShjb25zdCBGYWNlVXJpJiB1cmksCisgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgIGNvbnN0IEZhY2VDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCkgPSAwOworCisgIHZpcnR1YWwgc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPgorICBnZXRDaGFubmVscygpIGNvbnN0ID0gMDsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZBQ0VfUFJPVE9DT0xfRkFDVE9SWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS9zdHJlYW0tZmFjZS5ocHAgYi9ORkQvZGFlbW9uL2ZhY2Uvc3RyZWFtLWZhY2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTlkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2Uvc3RyZWFtLWZhY2UuaHBwCkBAIC0wLDAgKzEsMzk0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fRkFDRV9TVFJFQU1fRkFDRV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX1NUUkVBTV9GQUNFX0hQUAorCisjaW5jbHVkZSAiZmFjZS5ocHAiCisjaW5jbHVkZSAibG9jYWwtZmFjZS5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgVj4gc3RydWN0IFN0cmVhbUZhY2VTZW5kZXJJbXBsOworCit0ZW1wbGF0ZTxjbGFzcyBQcm90b2NvbCwgY2xhc3MgRmFjZUJhc2UgPSBGYWNlPgorY2xhc3MgU3RyZWFtRmFjZSA6IHB1YmxpYyBGYWNlQmFzZQoreworcHVibGljOgorICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sOworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIGluc3RhbmNlIG9mIFN0cmVhbUZhY2UKKyAgICovCisgIFN0cmVhbUZhY2UoY29uc3QgRmFjZVVyaSYgcmVtb3RlVXJpLCBjb25zdCBGYWNlVXJpJiBsb2NhbFVyaSwKKyAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPHR5cGVuYW1lIHByb3RvY29sOjpzb2NrZXQ+JiBzb2NrZXQsCisgICAgICAgICAgICAgYm9vbCBpc09uRGVtYW5kKTsKKworICB2aXJ0dWFsCisgIH5TdHJlYW1GYWNlKCk7CisKKyAgLy8gZnJvbSBGYWNlCisgIHZpcnR1YWwgdm9pZAorICBzZW5kSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KTsKKworICB2aXJ0dWFsIHZvaWQKKyAgc2VuZERhdGEoY29uc3QgRGF0YSYgZGF0YSk7CisKKyAgdmlydHVhbCB2b2lkCisgIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZAorICBwcm9jZXNzRXJyb3JDb2RlKGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yKTsKKworICB2b2lkCisgIHNlbmRGcm9tUXVldWUoKTsKKworICB2b2lkCisgIGhhbmRsZVNlbmQoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsCisgICAgICAgICAgICAgc2l6ZV90IG5CeXRlc1NlbnQpOworCisgIHZvaWQKKyAgaGFuZGxlUmVjZWl2ZShjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICBzaXplX3QgbkJ5dGVzUmVjZWl2ZWQpOworCisgIHZvaWQKKyAgc2h1dGRvd25Tb2NrZXQoKTsKKworICB2b2lkCisgIGRlZmVycmVkQ2xvc2UoY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgZmFjZSk7CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjx0eXBlbmFtZSBwcm90b2NvbDo6c29ja2V0PiBtX3NvY2tldDsKKworcHJpdmF0ZToKKyAgdWludDhfdCBtX2lucHV0QnVmZmVyW25kbjo6TUFYX05ETl9QQUNLRVRfU0laRV07CisgIHNpemVfdCBtX2lucHV0QnVmZmVyU2l6ZTsKKyAgc3RkOjpxdWV1ZTxCbG9jaz4gbV9zZW5kUXVldWU7CisKKyAgZnJpZW5kIHN0cnVjdCBTdHJlYW1GYWNlU2VuZGVySW1wbDxQcm90b2NvbCwgRmFjZUJhc2UsIEludGVyZXN0PjsKKyAgZnJpZW5kIHN0cnVjdCBTdHJlYW1GYWNlU2VuZGVySW1wbDxQcm90b2NvbCwgRmFjZUJhc2UsIERhdGE+OworCisgIE5GRF9MT0dfSU5DTEFTU19ERUNMQVJFKCk7Cit9OworCisvLyBBbGwgaW5oZXJpdGVkIGNsYXNzZXMgbXVzdCB1c2UKKy8vIE5GRF9MT0dfSU5DTEFTU19URU1QTEFURV9TUEVDSUFMSVpBVElPTl9ERUZJTkUoU3RyZWFtRmFjZSwgPHNwZWNpYWxpemF0aW9uLXBhcmFtZXRlcj4sICJOYW1lIik7CisKKworLyoqIFxicmllZiBDbGFzcyBhbGxvd2luZyB2YWxpZGF0aW9uIG9mIHRoZSBTdHJlYW1GYWNlIHVzZQorICoKKyAqICBGb3IgZXhhbXBsZSwgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBiYXNlZCBvbiBib29zdDo6YXNpbzo6aXA6OnRjcCBzaG91bGQgY2hlY2sKKyAqICB0aGF0IGxvY2FsIGVuZHBvaW50IGlzIGxvb3BiYWNrCisgKgorICogIEB0aHJvd3MgRmFjZTo6RXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsZWQKKyAqLwordGVtcGxhdGU8Y2xhc3MgUHJvdG9jb2wsIGNsYXNzIFU+CitzdHJ1Y3QgU3RyZWFtRmFjZVZhbGlkYXRvcgoreworICBzdGF0aWMgdm9pZAorICB2YWxpZGF0ZVNvY2tldCh0eXBlbmFtZSBQcm90b2NvbDo6c29ja2V0JiBzb2NrZXQpCisgIHsKKyAgfQorfTsKKworCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBGYWNlQmFzZT4KK2lubGluZQorU3RyZWFtRmFjZTxULCBGYWNlQmFzZT46OlN0cmVhbUZhY2UoY29uc3QgRmFjZVVyaSYgcmVtb3RlVXJpLCBjb25zdCBGYWNlVXJpJiBsb2NhbFVyaSwKKyAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPHR5cGVuYW1lIFN0cmVhbUZhY2U6OnByb3RvY29sOjpzb2NrZXQ+JiBzb2NrZXQsCisgICAgICAgICAgICAgICAgYm9vbCBpc09uRGVtYW5kKQorICA6IEZhY2VCYXNlKHJlbW90ZVVyaSwgbG9jYWxVcmkpCisgICwgbV9zb2NrZXQoc29ja2V0KQorICAsIG1faW5wdXRCdWZmZXJTaXplKDApCit7CisgIEZhY2VCYXNlOjpzZXRPbkRlbWFuZChpc09uRGVtYW5kKTsKKyAgU3RyZWFtRmFjZVZhbGlkYXRvcjxULCBGYWNlQmFzZT46OnZhbGlkYXRlU29ja2V0KCpzb2NrZXQpOworICBtX3NvY2tldC0+YXN5bmNfcmVjZWl2ZShib29zdDo6YXNpbzo6YnVmZmVyKG1faW5wdXRCdWZmZXIsIG5kbjo6TUFYX05ETl9QQUNLRVRfU0laRSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlN0cmVhbUZhY2U8VCwgRmFjZUJhc2U+OjpoYW5kbGVSZWNlaXZlLCB0aGlzLCBfMSwgXzIpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZQorU3RyZWFtRmFjZTxULCBVPjo6flN0cmVhbUZhY2UoKQoreworfQorCisKK3RlbXBsYXRlPGNsYXNzIFByb3RvY29sLCBjbGFzcyBGYWNlQmFzZSwgY2xhc3MgUGFja2V0Pgorc3RydWN0IFN0cmVhbUZhY2VTZW5kZXJJbXBsCit7CisgIHN0YXRpYyB2b2lkCisgIHNlbmQoU3RyZWFtRmFjZTxQcm90b2NvbCwgRmFjZUJhc2U+JiBmYWNlLCBjb25zdCBQYWNrZXQmIHBhY2tldCkKKyAgeworICAgIGJvb2wgd2FzUXVldWVFbXB0eSA9IGZhY2UubV9zZW5kUXVldWUuZW1wdHkoKTsKKyAgICBmYWNlLm1fc2VuZFF1ZXVlLnB1c2gocGFja2V0LndpcmVFbmNvZGUoKSk7CisKKyAgICBpZiAod2FzUXVldWVFbXB0eSkKKyAgICAgIGZhY2Uuc2VuZEZyb21RdWV1ZSgpOworICB9Cit9OworCisvLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIChvbmx5IGNsYXNzZXMgY2FuIGJlIHBhcnRpYWxseSBzcGVjaWFsaXplZCkKK3RlbXBsYXRlPGNsYXNzIFByb3RvY29sLCBjbGFzcyBQYWNrZXQ+CitzdHJ1Y3QgU3RyZWFtRmFjZVNlbmRlckltcGw8UHJvdG9jb2wsIExvY2FsRmFjZSwgUGFja2V0PgoreworICBzdGF0aWMgdm9pZAorICBzZW5kKFN0cmVhbUZhY2U8UHJvdG9jb2wsIExvY2FsRmFjZT4mIGZhY2UsIGNvbnN0IFBhY2tldCYgcGFja2V0KQorICB7CisgICAgYm9vbCB3YXNRdWV1ZUVtcHR5ID0gZmFjZS5tX3NlbmRRdWV1ZS5lbXB0eSgpOworCisgICAgaWYgKCFmYWNlLmlzRW1wdHlGaWx0ZXJlZExvY2FsQ29udHJvbEhlYWRlcihwYWNrZXQuZ2V0TG9jYWxDb250cm9sSGVhZGVyKCkpKQorICAgICAgeworICAgICAgICBmYWNlLm1fc2VuZFF1ZXVlLnB1c2goZmFjZS5maWx0ZXJBbmRFbmNvZGVMb2NhbENvbnRyb2xIZWFkZXIocGFja2V0KSk7CisgICAgICB9CisgICAgZmFjZS5tX3NlbmRRdWV1ZS5wdXNoKHBhY2tldC53aXJlRW5jb2RlKCkpOworCisgICAgaWYgKHdhc1F1ZXVlRW1wdHkpCisgICAgICBmYWNlLnNlbmRGcm9tUXVldWUoKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIHZvaWQKK1N0cmVhbUZhY2U8VCwgVT46OnNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIHRoaXMtPm9uU2VuZEludGVyZXN0KGludGVyZXN0KTsKKyAgU3RyZWFtRmFjZVNlbmRlckltcGw8VCwgVSwgSW50ZXJlc3Q+OjpzZW5kKCp0aGlzLCBpbnRlcmVzdCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorU3RyZWFtRmFjZTxULCBVPjo6c2VuZERhdGEoY29uc3QgRGF0YSYgZGF0YSkKK3sKKyAgdGhpcy0+b25TZW5kRGF0YShkYXRhKTsKKyAgU3RyZWFtRmFjZVNlbmRlckltcGw8VCwgVSwgRGF0YT46OnNlbmQoKnRoaXMsIGRhdGEpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIHZvaWQKK1N0cmVhbUZhY2U8VCwgVT46OmNsb3NlKCkKK3sKKyAgaWYgKCFtX3NvY2tldC0+aXNfb3BlbigpKQorICAgIHJldHVybjsKKworICBORkRfTE9HX0lORk8oIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgIDw8ICIsdXJpOiIgPDwgdGhpcy0+Z2V0UmVtb3RlVXJpKCkKKyAgICAgICAgICAgICAgIDw8ICJdIENsb3NlIGNvbm5lY3Rpb24iKTsKKworICBzaHV0ZG93blNvY2tldCgpOworICB0aGlzLT5mYWlsKCJDbG9zZSBjb25uZWN0aW9uIik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorU3RyZWFtRmFjZTxULCBVPjo6cHJvY2Vzc0Vycm9yQ29kZShjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvcikKK3sKKyAgaWYgKGVycm9yID09IGJvb3N0Ojphc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgfHwgICAvLyB3aGVuIGNhbmNlbCgpIGlzIGNhbGxlZAorICAgICAgZXJyb3IgPT0gYm9vc3Q6OmFzaW86OmVycm9yOjpzaHV0X2Rvd24pICAgICAgICAgICAgIC8vIGFmdGVyIHNodXRkb3duKCkgaXMgY2FsbGVkCisgICAgcmV0dXJuOworCisgIGlmICghbV9zb2NrZXQtPmlzX29wZW4oKSkKKyAgICB7CisgICAgICB0aGlzLT5mYWlsKCJDb25uZWN0aW9uIGNsb3NlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoZXJyb3IgPT0gYm9vc3Q6OmFzaW86OmVycm9yOjplb2YpCisgICAgeworICAgICAgTkZEX0xPR19JTkZPKCJbaWQ6IiA8PCB0aGlzLT5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgPDwgIix1cmk6IiA8PCB0aGlzLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgICAgIDw8ICJdIENvbm5lY3Rpb24gY2xvc2VkIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCB0aGlzLT5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgPDwgIix1cmk6IiA8PCB0aGlzLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgICAgIDw8ICJdIFNlbmQgb3IgcmVjZWl2ZSBvcGVyYXRpb24gZmFpbGVkLCBjbG9zaW5nIGZhY2U6ICIKKyAgICAgICAgICAgICAgICAgICA8PCBlcnJvci5tZXNzYWdlKCkpOworICAgIH0KKworICBzaHV0ZG93blNvY2tldCgpOworCisgIGlmIChlcnJvciA9PSBib29zdDo6YXNpbzo6ZXJyb3I6OmVvZikKKyAgICB7CisgICAgICB0aGlzLT5mYWlsKCJDb25uZWN0aW9uIGNsb3NlZCIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRoaXMtPmZhaWwoIlNlbmQgb3IgcmVjZWl2ZSBvcGVyYXRpb24gZmFpbGVkLCBjbG9zaW5nIGZhY2U6ICIgKyBlcnJvci5tZXNzYWdlKCkpOworICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSB2b2lkCitTdHJlYW1GYWNlPFQsIFU+OjpzZW5kRnJvbVF1ZXVlKCkKK3sKKyAgY29uc3QgQmxvY2smIGJsb2NrID0gdGhpcy0+bV9zZW5kUXVldWUuZnJvbnQoKTsKKyAgYm9vc3Q6OmFzaW86OmFzeW5jX3dyaXRlKCp0aGlzLT5tX3NvY2tldCwgYm9vc3Q6OmFzaW86OmJ1ZmZlcihibG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZTdHJlYW1GYWNlPFQsIFU+OjpoYW5kbGVTZW5kLCB0aGlzLCBfMSwgXzIpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSB2b2lkCitTdHJlYW1GYWNlPFQsIFU+OjpoYW5kbGVTZW5kKGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbkJ5dGVzU2VudCkKK3sKKyAgaWYgKGVycm9yKQorICAgIHJldHVybiBwcm9jZXNzRXJyb3JDb2RlKGVycm9yKTsKKworICBCT09TVF9BU1NFUlQoIW1fc2VuZFF1ZXVlLmVtcHR5KCkpOworCisgIE5GRF9MT0dfVFJBQ0UoIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgPDwgIl0gU3VjY2Vzc2Z1bGx5IHNlbnQ6ICIgPDwgbkJ5dGVzU2VudCA8PCAiIGJ5dGVzIik7CisgIHRoaXMtPmdldE11dGFibGVDb3VudGVycygpLmdldE5PdXRCeXRlcygpICs9IG5CeXRlc1NlbnQ7CisKKyAgbV9zZW5kUXVldWUucG9wKCk7CisgIGlmICghbV9zZW5kUXVldWUuZW1wdHkoKSkKKyAgICBzZW5kRnJvbVF1ZXVlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorU3RyZWFtRmFjZTxULCBVPjo6aGFuZGxlUmVjZWl2ZShjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5CeXRlc1JlY2VpdmVkKQoreworICBpZiAoZXJyb3IpCisgICAgcmV0dXJuIHByb2Nlc3NFcnJvckNvZGUoZXJyb3IpOworCisgIE5GRF9MT0dfVFJBQ0UoIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgPDwgIl0gUmVjZWl2ZWQ6ICIgPDwgbkJ5dGVzUmVjZWl2ZWQgPDwgIiBieXRlcyIpOworICB0aGlzLT5nZXRNdXRhYmxlQ291bnRlcnMoKS5nZXROSW5CeXRlcygpICs9IG5CeXRlc1JlY2VpdmVkOworCisgIG1faW5wdXRCdWZmZXJTaXplICs9IG5CeXRlc1JlY2VpdmVkOworCisgIHNpemVfdCBvZmZzZXQgPSAwOworCisgIGJvb2wgaXNPayA9IHRydWU7CisgIEJsb2NrIGVsZW1lbnQ7CisgIHdoaWxlIChtX2lucHV0QnVmZmVyU2l6ZSAtIG9mZnNldCA+IDApCisgICAgeworICAgICAgaXNPayA9IEJsb2NrOjpmcm9tQnVmZmVyKG1faW5wdXRCdWZmZXIgKyBvZmZzZXQsIG1faW5wdXRCdWZmZXJTaXplIC0gb2Zmc2V0LCBlbGVtZW50KTsKKyAgICAgIGlmICghaXNPaykKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIG9mZnNldCArPSBlbGVtZW50LnNpemUoKTsKKworICAgICAgQk9PU1RfQVNTRVJUKG9mZnNldCA8PSBtX2lucHV0QnVmZmVyU2l6ZSk7CisKKyAgICAgIGlmICghdGhpcy0+ZGVjb2RlQW5kRGlzcGF0Y2hJbnB1dChlbGVtZW50KSkKKyAgICAgICAgeworICAgICAgICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgdGhpcy0+Z2V0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdIFJlY2VpdmVkIHVucmVjb2duaXplZCBibG9jayBvZiB0eXBlIFsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVsZW1lbnQudHlwZSgpIDw8ICJdIik7CisgICAgICAgICAgLy8gaWdub3JlIHVua25vd24gcGFja2V0IGFuZCBwcm9jZWVkCisgICAgICAgIH0KKyAgICB9CisgIGlmICghaXNPayAmJiBtX2lucHV0QnVmZmVyU2l6ZSA9PSBuZG46Ok1BWF9ORE5fUEFDS0VUX1NJWkUgJiYgb2Zmc2V0ID09IDApCisgICAgeworICAgICAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCB0aGlzLT5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgPDwgIix1cmk6IiA8PCB0aGlzLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgICAgIDw8ICJdIEZhaWxlZCB0byBwYXJzZSBpbmNvbWluZyBwYWNrZXQgb3IgcGFja2V0IHRvbyBsYXJnZSB0byBwcm9jZXNzLCAiCisgICAgICAgICAgICAgICAgICAgPDwgImNsb3NpbmcgZG93biB0aGUgZmFjZSIpOworICAgICAgc2h1dGRvd25Tb2NrZXQoKTsKKyAgICAgIHRoaXMtPmZhaWwoIkZhaWxlZCB0byBwYXJzZSBpbmNvbWluZyBwYWNrZXQgb3IgcGFja2V0IHRvbyBsYXJnZSB0byBwcm9jZXNzLCAiCisgICAgICAgICAgICAgICAgICJjbG9zaW5nIGRvd24gdGhlIGZhY2UiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG9mZnNldCA+IDApCisgICAgeworICAgICAgaWYgKG9mZnNldCAhPSBtX2lucHV0QnVmZmVyU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y29weShtX2lucHV0QnVmZmVyICsgb2Zmc2V0LCBtX2lucHV0QnVmZmVyICsgbV9pbnB1dEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgIG1faW5wdXRCdWZmZXIpOworICAgICAgICAgIG1faW5wdXRCdWZmZXJTaXplIC09IG9mZnNldDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbV9pbnB1dEJ1ZmZlclNpemUgPSAwOworICAgICAgICB9CisgICAgfQorCisgIG1fc29ja2V0LT5hc3luY19yZWNlaXZlKGJvb3N0Ojphc2lvOjpidWZmZXIobV9pbnB1dEJ1ZmZlciArIG1faW5wdXRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6TUFYX05ETl9QQUNLRVRfU0laRSAtIG1faW5wdXRCdWZmZXJTaXplKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmU3RyZWFtRmFjZTxULCBVPjo6aGFuZGxlUmVjZWl2ZSwgdGhpcywgXzEsIF8yKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgdm9pZAorU3RyZWFtRmFjZTxULCBVPjo6c2h1dGRvd25Tb2NrZXQoKQoreworICAvLyBDYW5jZWwgYWxsIG91dHN0YW5kaW5nIG9wZXJhdGlvbnMgYW5kIHNodXRkb3duIHRoZSBzb2NrZXQKKyAgLy8gc28gdGhhdCBubyBmdXJ0aGVyIHNlbmRzIG9yIHJlY2VpdmVzIGFyZSBwb3NzaWJsZS4KKyAgLy8gVXNlIHRoZSBub24tdGhyb3dpbmcgdmFyaWFudHMgYW5kIGlnbm9yZSBlcnJvcnMsIGlmIGFueS4KKyAgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlcnJvcjsKKyAgbV9zb2NrZXQtPmNhbmNlbChlcnJvcik7CisgIG1fc29ja2V0LT5zaHV0ZG93bihwcm90b2NvbDo6c29ja2V0OjpzaHV0ZG93bl9ib3RoLCBlcnJvcik7CisKKyAgYm9vc3Q6OmFzaW86OmlvX3NlcnZpY2UmIGlvID0gbV9zb2NrZXQtPmdldF9pb19zZXJ2aWNlKCk7CisgIC8vIGVuc3VyZSB0aGF0IHRoZSBGYWNlIG9iamVjdCBpcyBhbGl2ZSBhdCBsZWFzdCB1bnRpbCBhbGwgcGVuZGluZworICAvLyBoYW5kbGVycyBhcmUgZGlzcGF0Y2hlZAorICBpby5wb3N0KGJpbmQoJlN0cmVhbUZhY2U8VCwgVT46OmRlZmVycmVkQ2xvc2UsIHRoaXMsIHRoaXMtPnNoYXJlZF9mcm9tX3RoaXMoKSkpOworCisgIC8vIFNvbWUgYnVnIG9yIGZlYXR1cmUgb2YgQm9vc3QuQXNpbyAoc2VlIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODU2KToKKyAgLy8KKyAgLy8gV2hlbiBzaHV0ZG93blNvY2tldCBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gYSBzb2NrZXQgZXZlbnQgKGUuZy4sIGZyb20gaGFuZGxlUmVjZWl2ZSksCisgIC8vIG1fc29ja2V0LT5zaHV0ZG93bigpIGRvZXMgbm90IHRyaWdnZXIgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgaGFuZGxlU2VuZCBjYWxsYmFjay4KKyAgLy8gSW5zdGVhZCwgaGFuZGxlU2VuZCBpcyBpbnZva2VkIGFzIG5vdGhpbmcgYmFkIGhhcHBlbmVkLgorICAvLworICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHRoZSBhc3NlcnRpb24gaW4gaGFuZGxlU2VuZCBmcm9tIGZhaWxpbmcsIHdlIGNsZWFyIHRoZSBxdWV1ZQorICAvLyBhbmQgY2xvc2UgdGhlIHNvY2tldCBpbiBkZWZlcnJlZENsb3NlLCBpLmUuLCBhZnRlciBhbGwgY2FsbGJhY2tzIHNjaGVkdWxlZCB1cCB0bworICAvLyB0aGlzIHBvaW50IGhhdmUgYmVlbiBleGVjdXRlZC4gIElmIG1vcmUgc2VuZCBvcGVyYXRpb25zIGFyZSBzY2hlZHVsZWQgYWZ0ZXIgdGhpcworICAvLyBwb2ludCwgdGhleSB3aWxsIGZhaWwgYmVjYXVzZSB0aGUgc29ja2V0IGhhcyBiZWVuIHNodXRkb3duLCBhbmQgdGhlaXIgY2FsbGJhY2tzCisgIC8vIHdpbGwgYmUgaW52b2tlZCB3aXRoIGVycm9yIGNvZGUgPT0gYXNpbzo6ZXJyb3I6OnNodXRfZG93bi4KK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSB2b2lkCitTdHJlYW1GYWNlPFQsIFU+OjpkZWZlcnJlZENsb3NlKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIGZhY2UpCit7CisgIE5GRF9MT0dfREVCVUcoIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgPDwgIl0gQ2xlYXJpbmcgc2VuZCBxdWV1ZSIpOworCisgIC8vIGNsZWFyIHNlbmQgcXVldWUKKyAgc3RkOjpxdWV1ZTxCbG9jaz4gZW1wdHlRdWV1ZTsKKyAgc3RkOjpzd2FwKGVtcHR5UXVldWUsIG1fc2VuZFF1ZXVlKTsKKworICAvLyB1c2UgdGhlIG5vbi10aHJvd2luZyB2YXJpYW50IGFuZCBpZ25vcmUgZXJyb3JzLCBpZiBhbnkKKyAgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlcnJvcjsKKyAgbV9zb2NrZXQtPmNsb3NlKGVycm9yKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZBQ0VfU1RSRUFNX0ZBQ0VfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvdGNwLWNoYW5uZWwuY3BwIGIvTkZEL2RhZW1vbi9mYWNlL3RjcC1jaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI3NDRkCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3RjcC1jaGFubmVsLmNwcApAQCAtMCwwICsxLDI4MSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInRjcC1jaGFubmVsLmhwcCIKKyNpbmNsdWRlICJjb3JlL2dsb2JhbC1pby5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitORkRfTE9HX0lOSVQoIlRjcENoYW5uZWwiKTsKKwordXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOworCitUY3BDaGFubmVsOjpUY3BDaGFubmVsKGNvbnN0IHRjcDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpCisgIDogbV9sb2NhbEVuZHBvaW50KGxvY2FsRW5kcG9pbnQpCisgICwgbV9pc0xpc3RlbmluZyhmYWxzZSkKK3sKKyAgdGhpcy0+c2V0VXJpKEZhY2VVcmkobG9jYWxFbmRwb2ludCkpOworfQorCitUY3BDaGFubmVsOjp+VGNwQ2hhbm5lbCgpCit7Cit9CisKK3ZvaWQKK1RjcENoYW5uZWw6Omxpc3Rlbihjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25BY2NlcHRGYWlsZWQsCisgICAgICAgICAgICAgICAgICAgaW50IGJhY2tsb2cvKiA9IHRjcDo6YWNjZXB0b3I6Om1heF9jb25uZWN0aW9ucyovKQoreworICBtX2FjY2VwdG9yID0gbWFrZV9zaGFyZWQ8aXA6OnRjcDo6YWNjZXB0b3I+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworICBtX2FjY2VwdG9yLT5vcGVuKG1fbG9jYWxFbmRwb2ludC5wcm90b2NvbCgpKTsKKyAgbV9hY2NlcHRvci0+c2V0X29wdGlvbihpcDo6dGNwOjphY2NlcHRvcjo6cmV1c2VfYWRkcmVzcyh0cnVlKSk7CisgIGlmIChtX2xvY2FsRW5kcG9pbnQuYWRkcmVzcygpLmlzX3Y2KCkpCisgICAgeworICAgICAgbV9hY2NlcHRvci0+c2V0X29wdGlvbihpcDo6djZfb25seSh0cnVlKSk7CisgICAgfQorICBtX2FjY2VwdG9yLT5iaW5kKG1fbG9jYWxFbmRwb2ludCk7CisgIG1fYWNjZXB0b3ItPmxpc3RlbihiYWNrbG9nKTsKKworICBzaGFyZWRfcHRyPGlwOjp0Y3A6OnNvY2tldD4gY2xpZW50U29ja2V0ID0KKyAgICBtYWtlX3NoYXJlZDxpcDo6dGNwOjpzb2NrZXQ+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworICBtX2FjY2VwdG9yLT5hc3luY19hY2NlcHQoKmNsaWVudFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlRjcENoYW5uZWw6OmhhbmRsZVN1Y2Nlc3NmdWxBY2NlcHQsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFjZUNyZWF0ZWQsIG9uQWNjZXB0RmFpbGVkKSk7CisKKyAgbV9pc0xpc3RlbmluZyA9IHRydWU7Cit9CisKK3ZvaWQKK1RjcENoYW5uZWw6OmNvbm5lY3QoY29uc3QgdGNwOjpFbmRwb2ludCYgcmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjcENoYW5uZWw6OkZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjcENoYW5uZWw6OkNvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiB0aW1lb3V0LyogPSB0aW1lOjpzZWNvbmRzKDQpKi8pCit7CisgIENoYW5uZWxGYWNlTWFwOjppdGVyYXRvciBpID0gbV9jaGFubmVsRmFjZXMuZmluZChyZW1vdGVFbmRwb2ludCk7CisgIGlmIChpICE9IG1fY2hhbm5lbEZhY2VzLmVuZCgpKSB7CisgICAgb25GYWNlQ3JlYXRlZChpLT5zZWNvbmQpOworICAgIHJldHVybjsKKyAgfQorCisgIHNoYXJlZF9wdHI8aXA6OnRjcDo6c29ja2V0PiBjbGllbnRTb2NrZXQgPQorICAgIG1ha2Vfc2hhcmVkPGlwOjp0Y3A6OnNvY2tldD4ocmVmKGdldEdsb2JhbElvU2VydmljZSgpKSk7CisKKyAgRXZlbnRJZCBjb25uZWN0VGltZW91dEV2ZW50ID0gc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlRjcENoYW5uZWw6OmhhbmRsZUZhaWxlZENvbm5lY3QsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQsIG9uQ29ubmVjdEZhaWxlZCkpOworCisgIGNsaWVudFNvY2tldC0+YXN5bmNfY29ubmVjdChyZW1vdGVFbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlRjcENoYW5uZWw6OmhhbmRsZVN1Y2Nlc3NmdWxDb25uZWN0LCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LCBjb25uZWN0VGltZW91dEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhY2VDcmVhdGVkLCBvbkNvbm5lY3RGYWlsZWQpKTsKK30KKwordm9pZAorVGNwQ2hhbm5lbDo6Y29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgcmVtb3RlSG9zdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlbW90ZVBvcnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjcENoYW5uZWw6OkZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjcENoYW5uZWw6OkNvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiB0aW1lb3V0LyogPSB0aW1lOjpzZWNvbmRzKDQpKi8pCit7CisgIHNoYXJlZF9wdHI8aXA6OnRjcDo6c29ja2V0PiBjbGllbnRTb2NrZXQgPQorICAgIG1ha2Vfc2hhcmVkPGlwOjp0Y3A6OnNvY2tldD4ocmVmKGdldEdsb2JhbElvU2VydmljZSgpKSk7CisKKyAgaXA6OnRjcDo6cmVzb2x2ZXI6OnF1ZXJ5IHF1ZXJ5KHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpOworICBzaGFyZWRfcHRyPGlwOjp0Y3A6OnJlc29sdmVyPiByZXNvbHZlciA9CisgICAgbWFrZV9zaGFyZWQ8aXA6OnRjcDo6cmVzb2x2ZXI+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworCisgIEV2ZW50SWQgY29ubmVjdFRpbWVvdXRFdmVudCA9IHNjaGVkdWxlcjo6c2NoZWR1bGUodGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZUY3BDaGFubmVsOjpoYW5kbGVGYWlsZWRDb25uZWN0LCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LCBvbkNvbm5lY3RGYWlsZWQpKTsKKworICByZXNvbHZlci0+YXN5bmNfcmVzb2x2ZShxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVGNwQ2hhbm5lbDo6aGFuZGxlRW5kcG9pbnRSZXNvbHV0aW9uLCB0aGlzLCBfMSwgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LCBjb25uZWN0VGltZW91dEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFjZUNyZWF0ZWQsIG9uQ29ubmVjdEZhaWxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlcikpOworfQorCitzaXplX3QKK1RjcENoYW5uZWw6OnNpemUoKSBjb25zdAoreworICByZXR1cm4gbV9jaGFubmVsRmFjZXMuc2l6ZSgpOworfQorCit2b2lkCitUY3BDaGFubmVsOjpjcmVhdGVGYWNlKGNvbnN0IHNoYXJlZF9wdHI8aXA6OnRjcDo6c29ja2V0PiYgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT25EZW1hbmQpCit7CisgIHRjcDo6RW5kcG9pbnQgcmVtb3RlRW5kcG9pbnQgPSBzb2NrZXQtPnJlbW90ZV9lbmRwb2ludCgpOworCisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTsKKworICBDaGFubmVsRmFjZU1hcDo6aXRlcmF0b3IgZmFjZU1hcFBvcyA9IG1fY2hhbm5lbEZhY2VzLmZpbmQocmVtb3RlRW5kcG9pbnQpOworICBpZiAoZmFjZU1hcFBvcyA9PSBtX2NoYW5uZWxGYWNlcy5lbmQoKSkKKyAgICB7CisgICAgICBpZiAoc29ja2V0LT5sb2NhbF9lbmRwb2ludCgpLmFkZHJlc3MoKS5pc19sb29wYmFjaygpKQorICAgICAgICBmYWNlID0gbWFrZV9zaGFyZWQ8VGNwTG9jYWxGYWNlPihzb2NrZXQsIGlzT25EZW1hbmQpOworICAgICAgZWxzZQorICAgICAgICBmYWNlID0gbWFrZV9zaGFyZWQ8VGNwRmFjZT4oc29ja2V0LCBpc09uRGVtYW5kKTsKKworICAgICAgZmFjZS0+b25GYWlsICs9IGJpbmQoJlRjcENoYW5uZWw6OmFmdGVyRmFjZUZhaWxlZCwgdGhpcywgcmVtb3RlRW5kcG9pbnQpOworCisgICAgICBtX2NoYW5uZWxGYWNlc1tyZW1vdGVFbmRwb2ludF0gPSBmYWNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8vIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCBhIGEgZmFjZSBmb3IgdGhpcyBlbmRwb2ludCwganVzdCByZXVzZSBpdAorICAgICAgZmFjZSA9IGZhY2VNYXBQb3MtPnNlY29uZDsKKworICAgICAgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlcnJvcjsKKyAgICAgIHNvY2tldC0+c2h1dGRvd24oaXA6OnRjcDo6c29ja2V0OjpzaHV0ZG93bl9ib3RoLCBlcnJvcik7CisgICAgICBzb2NrZXQtPmNsb3NlKGVycm9yKTsKKyAgICB9CisKKyAgLy8gTmVlZCB0byBpbnZva2UgdGhlIGNhbGxiYWNrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQKKyAgLy8gdGhlIGZhY2Ugc28gdGhhdCBjb250cm9sIHJlc3BvbnNlcyBhbmQgc3VjaCBjYW4gYmUgc2VudC4KKyAgb25GYWNlQ3JlYXRlZChmYWNlKTsKK30KKwordm9pZAorVGNwQ2hhbm5lbDo6YWZ0ZXJGYWNlRmFpbGVkKHRjcDo6RW5kcG9pbnQgJnJlbW90ZUVuZHBvaW50KQoreworICBORkRfTE9HX0RFQlVHKCJhZnRlckZhY2VGYWlsZWQ6ICIgPDwgcmVtb3RlRW5kcG9pbnQpOworICBtX2NoYW5uZWxGYWNlcy5lcmFzZShyZW1vdGVFbmRwb2ludCk7Cit9CisKK3ZvaWQKK1RjcENoYW5uZWw6OmhhbmRsZVN1Y2Nlc3NmdWxBY2NlcHQoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OmlwOjp0Y3A6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25GYWNlQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkFjY2VwdEZhaWxlZCkKK3sKKyAgaWYgKGVycm9yKSB7CisgICAgaWYgKGVycm9yID09IGJvb3N0OjpzeXN0ZW06OmVycmM6Om9wZXJhdGlvbl9jYW5jZWxlZCkgLy8gd2hlbiBzb2NrZXQgaXMgY2xvc2VkIGJ5IHNvbWVvbmUKKyAgICAgIHJldHVybjsKKworICAgIE5GRF9MT0dfREVCVUcoIkNvbm5lY3QgdG8gcmVtb3RlIGVuZHBvaW50IGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgPDwgZXJyb3IuY2F0ZWdvcnkoKS5tZXNzYWdlKGVycm9yLnZhbHVlKCkpKTsKKworICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihvbkFjY2VwdEZhaWxlZCkpCisgICAgICBvbkFjY2VwdEZhaWxlZCgiQ29ubmVjdCB0byByZW1vdGUgZW5kcG9pbnQgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNhdGVnb3J5KCkubWVzc2FnZShlcnJvci52YWx1ZSgpKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gcHJlcGFyZSBhY2NlcHRpbmcgdGhlIG5leHQgY29ubmVjdGlvbgorICBzaGFyZWRfcHRyPGlwOjp0Y3A6OnNvY2tldD4gY2xpZW50U29ja2V0ID0KKyAgICBtYWtlX3NoYXJlZDxpcDo6dGNwOjpzb2NrZXQ+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworICBtX2FjY2VwdG9yLT5hc3luY19hY2NlcHQoKmNsaWVudFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlRjcENoYW5uZWw6OmhhbmRsZVN1Y2Nlc3NmdWxBY2NlcHQsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFjZUNyZWF0ZWQsIG9uQWNjZXB0RmFpbGVkKSk7CisKKyAgTkZEX0xPR19ERUJVRygiWyIgPDwgbV9sb2NhbEVuZHBvaW50IDw8ICJdICIKKyAgICAgICAgICAgICAgICAiPDwgQ29ubmVjdGlvbiBmcm9tICIgPDwgc29ja2V0LT5yZW1vdGVfZW5kcG9pbnQoKSk7CisgIGNyZWF0ZUZhY2Uoc29ja2V0LCBvbkZhY2VDcmVhdGVkLCB0cnVlKTsKK30KKwordm9pZAorVGNwQ2hhbm5lbDo6aGFuZGxlU3VjY2Vzc2Z1bENvbm5lY3QoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGlwOjp0Y3A6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50SWQmIGNvbm5lY3RUaW1lb3V0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpCit7CisgIHNjaGVkdWxlcjo6Y2FuY2VsKGNvbm5lY3RUaW1lb3V0RXZlbnQpOworCisjaWYgKEJPT1NUX1ZFUlNJT04gPT0gMTA1NDAwKQorICAvLyBUbyBoYW5kbGUgcmVncmVzc2lvbiBpbiBCb29zdCAxLjU0CisgIC8vIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC84Nzk1CisgIGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgYW5vdGhlckVycm9yQ29kZTsKKyAgc29ja2V0LT5yZW1vdGVfZW5kcG9pbnQoYW5vdGhlckVycm9yQ29kZSk7CisgIGlmIChlcnJvciB8fCBhbm90aGVyRXJyb3JDb2RlKSB7CisjZWxzZQorICBpZiAoZXJyb3IpIHsKKyNlbmRpZgorCisgICAgaWYgKGVycm9yID09IGJvb3N0OjpzeXN0ZW06OmVycmM6Om9wZXJhdGlvbl9jYW5jZWxlZCkgLy8gd2hlbiBzb2NrZXQgaXMgY2xvc2VkIGJ5IHNvbWVvbmUKKyAgICAgIHJldHVybjsKKworICAgIHNvY2tldC0+Y2xvc2UoKTsKKworICAgIE5GRF9MT0dfREVCVUcoIkNvbm5lY3QgdG8gcmVtb3RlIGVuZHBvaW50IGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgPDwgZXJyb3IuY2F0ZWdvcnkoKS5tZXNzYWdlKGVycm9yLnZhbHVlKCkpKTsKKworICAgIG9uQ29ubmVjdEZhaWxlZCgiQ29ubmVjdCB0byByZW1vdGUgZW5kcG9pbnQgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IuY2F0ZWdvcnkoKS5tZXNzYWdlKGVycm9yLnZhbHVlKCkpKTsKKyAgICByZXR1cm47CisgIH0KKworICBORkRfTE9HX0RFQlVHKCJbIiA8PCBtX2xvY2FsRW5kcG9pbnQgPDwgIl0gIgorICAgICAgICAgICAgICAgICI+PiBDb25uZWN0aW9uIHRvICIgPDwgc29ja2V0LT5yZW1vdGVfZW5kcG9pbnQoKSk7CisKKyAgY3JlYXRlRmFjZShzb2NrZXQsIG9uRmFjZUNyZWF0ZWQsIGZhbHNlKTsKK30KKwordm9pZAorVGNwQ2hhbm5lbDo6aGFuZGxlRmFpbGVkQ29ubmVjdChjb25zdCBzaGFyZWRfcHRyPGlwOjp0Y3A6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpCit7CisgIE5GRF9MT0dfREVCVUcoIkNvbm5lY3QgdG8gcmVtb3RlIGVuZHBvaW50IHRpbWVkIG91dCIpOworICBvbkNvbm5lY3RGYWlsZWQoIkNvbm5lY3QgdG8gcmVtb3RlIGVuZHBvaW50IHRpbWVkIG91dCIpOworICBzb2NrZXQtPmNsb3NlKCk7IC8vIGFib3J0IHRoZSBjb25uZWN0aW9uCit9CisKK3ZvaWQKK1RjcENoYW5uZWw6OmhhbmRsZUVuZHBvaW50UmVzb2x1dGlvbihjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcDo6dGNwOjpyZXNvbHZlcjo6aXRlcmF0b3IgcmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxib29zdDo6YXNpbzo6aXA6OnRjcDo6c29ja2V0PiYgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50SWQmIGNvbm5lY3RUaW1lb3V0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25GYWNlQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGlwOjp0Y3A6OnJlc29sdmVyPiYgcmVzb2x2ZXIpCit7CisgIGlmIChlcnJvciB8fAorICAgICAgcmVtb3RlRW5kcG9pbnQgPT0gaXA6OnRjcDo6cmVzb2x2ZXI6Oml0ZXJhdG9yKCkpCisgICAgeworICAgICAgaWYgKGVycm9yID09IGJvb3N0OjpzeXN0ZW06OmVycmM6Om9wZXJhdGlvbl9jYW5jZWxlZCkgLy8gd2hlbiBzb2NrZXQgaXMgY2xvc2VkIGJ5IHNvbWVvbmUKKyAgICAgICAgcmV0dXJuOworCisgICAgICBzb2NrZXQtPmNsb3NlKCk7CisgICAgICBzY2hlZHVsZXI6OmNhbmNlbChjb25uZWN0VGltZW91dEV2ZW50KTsKKworICAgICAgTkZEX0xPR19ERUJVRygiUmVtb3RlIGVuZHBvaW50IGhvc3RuYW1lIG9yIHBvcnQgY2Fubm90IGJlIHJlc29sdmVkOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IGVycm9yLmNhdGVnb3J5KCkubWVzc2FnZShlcnJvci52YWx1ZSgpKSk7CisKKyAgICAgIG9uQ29ubmVjdEZhaWxlZCgiUmVtb3RlIGVuZHBvaW50IGhvc3RuYW1lIG9yIHBvcnQgY2Fubm90IGJlIHJlc29sdmVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jYXRlZ29yeSgpLm1lc3NhZ2UoZXJyb3IudmFsdWUoKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvLyBnb3QgZW5kcG9pbnQsIG5vdyB0cnlpbmcgdG8gY29ubmVjdCAob25seSB0cnkgdGhlIGZpcnN0IHJlc29sdXRpb24gb3B0aW9uKQorICBzb2NrZXQtPmFzeW5jX2Nvbm5lY3QoKnJlbW90ZUVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVGNwQ2hhbm5lbDo6aGFuZGxlU3VjY2Vzc2Z1bENvbm5lY3QsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQsIGNvbm5lY3RUaW1lb3V0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFjZUNyZWF0ZWQsIG9uQ29ubmVjdEZhaWxlZCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS90Y3AtY2hhbm5lbC5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWNoYW5uZWwuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMjZhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWNoYW5uZWwuaHBwCkBAIC0wLDAgKzEsMTYyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9EQUVNT05fRkFDRV9UQ1BfQ0hBTk5FTF9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX1RDUF9DSEFOTkVMX0hQUAorCisjaW5jbHVkZSAiY2hhbm5lbC5ocHAiCisjaW5jbHVkZSAidGNwLWZhY2UuaHBwIgorI2luY2x1ZGUgImNvcmUvc2NoZWR1bGVyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK25hbWVzcGFjZSB0Y3AgewordHlwZWRlZiBib29zdDo6YXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgRW5kcG9pbnQ7Cit9IC8vIG5hbWVzcGFjZSB0Y3AKKworLyoqCisgKiBcYnJpZWYgQ2xhc3MgaW1wbGVtZW50aW5nIFRDUC1iYXNlZCBjaGFubmVsIHRvIGNyZWF0ZSBmYWNlcworICoKKyAqIENoYW5uZWwgY2FuIGNyZWF0ZSBmYWNlcyBhcyBhIHJlc3BvbnNlIHRvIGluY29taW5nIFRDUAorICogY29ubmVjdGlvbnMgKFRjcENoYW5uZWw6Omxpc3RlbiBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIHRoYXQKKyAqIHRvIHdvcmspIG9yIGV4cGxpY2l0bHkgYWZ0ZXIgdXNpbmcgVGNwQ2hhbm5lbDo6Y29ubmVjdCBtZXRob2QuCisgKi8KK2NsYXNzIFRjcENoYW5uZWwgOiBwdWJsaWMgQ2hhbm5lbAoreworcHVibGljOgorICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBUQ1AgY2hhbm5lbCBmb3IgdGhlIGxvY2FsIGVuZHBvaW50CisgICAqCisgICAqIFRvIGVuYWJsZSBjcmVhdGlvbiBmYWNlcyB1cG9uIGluY29taW5nIGNvbm5lY3Rpb25zLAorICAgKiBvbmUgbmVlZHMgdG8gZXhwbGljaXRseSBjYWxsIFRjcENoYW5uZWw6Omxpc3RlbiBtZXRob2QuCisgICAqLworICBleHBsaWNpdAorICBUY3BDaGFubmVsKGNvbnN0IHRjcDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpOworCisgIHZpcnR1YWwKKyAgflRjcENoYW5uZWwoKTsKKworICAvKioKKyAgICogXGJyaWVmIEVuYWJsZSBsaXN0ZW5pbmcgb24gdGhlIGxvY2FsIGVuZHBvaW50LCBhY2NlcHQgY29ubmVjdGlvbnMsCisgICAqICAgICAgICBhbmQgY3JlYXRlIGZhY2VzIHdoZW4gcmVtb3RlIGhvc3QgbWFrZXMgYSBjb25uZWN0aW9uCisgICAqIFxwYXJhbSBvbkZhY2VDcmVhdGVkICBDYWxsYmFjayB0byBub3RpZnkgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZiB0aGUgZmFjZQorICAgKiBccGFyYW0gb25BY2NlcHRGYWlsZWQgQ2FsbGJhY2sgdG8gbm90aWZ5IHdoZW4gY2hhbm5lbCBmYWlscyAoYWNjZXB0IGNhbGwKKyAgICogICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgYW4gZXJyb3IpCisgICAqIFxwYXJhbSBiYWNrbG9nICAgICAgICBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgaW5jb21pbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAqLworICB2b2lkCisgIGxpc3Rlbihjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgY29uc3QgQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkFjY2VwdEZhaWxlZCwKKyAgICAgICAgIGludCBiYWNrbG9nID0gYm9vc3Q6OmFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yOjptYXhfY29ubmVjdGlvbnMpOworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIGEgZmFjZSBieSBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbiB0byByZW1vdGUgZW5kcG9pbnQKKyAgICovCisgIHZvaWQKKyAgY29ubmVjdChjb25zdCB0Y3A6OkVuZHBvaW50JiByZW1vdGVFbmRwb2ludCwKKyAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkLAorICAgICAgICAgIGNvbnN0IHRpbWU6OnNlY29uZHMmIHRpbWVvdXQgPSB0aW1lOjpzZWNvbmRzKDQpKTsKKworICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBhIGZhY2UgYnkgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZAorICAgKiAgICAgICAgcmVtb3RlIGhvc3QgYW5kIHJlbW90ZSBwb3J0CisgICAqCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgYmxvY2sgYW5kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBBbGwKKyAgICogbmVjZXNzYXJ5IGhvc3RuYW1lIGFuZCBwb3J0IHJlc29sdXRpb24gYW5kIGNvbm5lY3Rpb24gd2lsbCBoYXBwZW4KKyAgICogaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgICAqCisgICAqIElmIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkIHdpdGhpbiBzcGVjaWZpZWQgdGltZW91dCwgaXQKKyAgICogd2lsbCBiZSBhYm9ydGVkLgorICAgKi8KKyAgdm9pZAorICBjb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiByZW1vdGVIb3N0LCBjb25zdCBzdGQ6OnN0cmluZyYgcmVtb3RlUG9ydCwKKyAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkLAorICAgICAgICAgIGNvbnN0IHRpbWU6OnNlY29uZHMmIHRpbWVvdXQgPSB0aW1lOjpzZWNvbmRzKDQpKTsKKworICAvKioKKyAgICogXGJyaWVmIEdldCBudW1iZXIgb2YgZmFjZXMgaW4gdGhlIGNoYW5uZWwKKyAgICovCisgIHNpemVfdAorICBzaXplKCkgY29uc3Q7CisKKyAgYm9vbAorICBpc0xpc3RlbmluZygpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkCisgIGNyZWF0ZUZhY2UoY29uc3Qgc2hhcmVkX3B0cjxib29zdDo6YXNpbzo6aXA6OnRjcDo6c29ja2V0PiYgc29ja2V0LAorICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgICAgYm9vbCBpc09uRGVtYW5kKTsKKworICB2b2lkCisgIGFmdGVyRmFjZUZhaWxlZCh0Y3A6OkVuZHBvaW50ICZlbmRwb2ludCk7CisKKyAgdm9pZAorICBoYW5kbGVTdWNjZXNzZnVsQWNjZXB0KGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OmlwOjp0Y3A6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKTsKKworICB2b2lkCisgIGhhbmRsZVN1Y2Nlc3NmdWxDb25uZWN0KGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGJvb3N0Ojphc2lvOjppcDo6dGNwOjpzb2NrZXQ+JiBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50SWQmIGNvbm5lY3RUaW1lb3V0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKTsKKworICB2b2lkCisgIGhhbmRsZUZhaWxlZENvbm5lY3QoY29uc3Qgc2hhcmVkX3B0cjxib29zdDo6YXNpbzo6aXA6OnRjcDo6c29ja2V0PiYgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKTsKKworICB2b2lkCisgIGhhbmRsZUVuZHBvaW50UmVzb2x1dGlvbihjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojphc2lvOjppcDo6dGNwOjpyZXNvbHZlcjo6aXRlcmF0b3IgcmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGJvb3N0Ojphc2lvOjppcDo6dGNwOjpzb2NrZXQ+JiBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmVudElkJiBjb25uZWN0VGltZW91dEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25GYWNlQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxib29zdDo6YXNpbzo6aXA6OnRjcDo6cmVzb2x2ZXI+JiByZXNvbHZlcik7CisKK3ByaXZhdGU6CisgIHRjcDo6RW5kcG9pbnQgbV9sb2NhbEVuZHBvaW50OworCisgIHR5cGVkZWYgc3RkOjptYXA8IHRjcDo6RW5kcG9pbnQsIHNoYXJlZF9wdHI8RmFjZT4gPiBDaGFubmVsRmFjZU1hcDsKKyAgQ2hhbm5lbEZhY2VNYXAgbV9jaGFubmVsRmFjZXM7CisKKyAgYm9vbCBtX2lzTGlzdGVuaW5nOworICBzaGFyZWRfcHRyPGJvb3N0Ojphc2lvOjppcDo6dGNwOjphY2NlcHRvcj4gbV9hY2NlcHRvcjsKK307CisKK2lubGluZSBib29sCitUY3BDaGFubmVsOjppc0xpc3RlbmluZygpIGNvbnN0Cit7CisgIHJldHVybiBtX2lzTGlzdGVuaW5nOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9UQ1BfQ0hBTk5FTF9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS90Y3AtZmFjZS5jcHAgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjhiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWZhY2UuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJ0Y3AtZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitORkRfTE9HX0lOQ0xBU1NfVEVNUExBVEVfU1BFQ0lBTElaQVRJT05fREVGSU5FKFN0cmVhbUZhY2UsIFRjcEZhY2U6OnByb3RvY29sLCAiVGNwRmFjZSIpOworCitORkRfTE9HX0lOQ0xBU1NfMlRFTVBMQVRFX1NQRUNJQUxJWkFUSU9OX0RFRklORShTdHJlYW1GYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGNwTG9jYWxGYWNlOjpwcm90b2NvbCwgTG9jYWxGYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRjcExvY2FsRmFjZSIpOworCitUY3BGYWNlOjpUY3BGYWNlKGNvbnN0IHNoYXJlZF9wdHI8VGNwRmFjZTo6cHJvdG9jb2w6OnNvY2tldD4mIHNvY2tldCwgYm9vbCBpc09uRGVtYW5kKQorICA6IFN0cmVhbUZhY2U8cHJvdG9jb2w+KEZhY2VVcmkoc29ja2V0LT5yZW1vdGVfZW5kcG9pbnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZVVyaShzb2NrZXQtPmxvY2FsX2VuZHBvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldCwgaXNPbkRlbWFuZCkKK3sKK30KKworVGNwTG9jYWxGYWNlOjpUY3BMb2NhbEZhY2UoY29uc3Qgc2hhcmVkX3B0cjxUY3BMb2NhbEZhY2U6OnByb3RvY29sOjpzb2NrZXQ+JiBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT25EZW1hbmQpCisgIDogU3RyZWFtRmFjZTxwcm90b2NvbCwgTG9jYWxGYWNlPihGYWNlVXJpKHNvY2tldC0+cmVtb3RlX2VuZHBvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZVVyaShzb2NrZXQtPmxvY2FsX2VuZHBvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LCBpc09uRGVtYW5kKQoreworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS90Y3AtZmFjZS5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWZhY2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGRkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWZhY2UuaHBwCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX1RDUF9GQUNFX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfVENQX0ZBQ0VfSFBQCisKKyNpbmNsdWRlICJzdHJlYW0tZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCisvKioKKyAqIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBGYWNlIGFic3RyYWN0aW9uIHRoYXQgdXNlcyBUQ1AKKyAqICAgICAgICBhcyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBtZWNoYW5pc20KKyAqLworY2xhc3MgVGNwRmFjZSA6IHB1YmxpYyBTdHJlYW1GYWNlPGJvb3N0Ojphc2lvOjppcDo6dGNwPgoreworcHVibGljOgorICBUY3BGYWNlKGNvbnN0IHNoYXJlZF9wdHI8cHJvdG9jb2w6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICBib29sIGlzT25EZW1hbmQpOworfTsKKworLy8KKworLyoqCisgKiBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgRmFjZSBhYnN0cmFjdGlvbiB0aGF0IHVzZXMgVENQCisgKiAgICAgICAgYXMgdW5kZXJseWluZyB0cmFuc3BvcnQgbWVjaGFuaXNtIGFuZCBpcyB1c2VkIGZvcgorICogICAgICAgIGxvY2FsIGNvbW11bmljYXRpb24gKGNhbiBlbmFibGUgTG9jYWxDb250cm9sSGVhZGVyKQorICovCitjbGFzcyBUY3BMb2NhbEZhY2UgOiBwdWJsaWMgU3RyZWFtRmFjZTxib29zdDo6YXNpbzo6aXA6OnRjcCwgTG9jYWxGYWNlPgoreworcHVibGljOgorICBUY3BMb2NhbEZhY2UoY29uc3Qgc2hhcmVkX3B0cjxwcm90b2NvbDo6c29ja2V0PiYgc29ja2V0LAorICAgICAgICAgICAgICAgYm9vbCBpc09uRGVtYW5kKTsKK307CisKKworLyoqIFxicmllZiBDbGFzcyB2YWxpZGF0aW5nIHVzZSBvZiBUY3BMb2NhbEZhY2UKKyAqLwordGVtcGxhdGU8Pgorc3RydWN0IFN0cmVhbUZhY2VWYWxpZGF0b3I8Ym9vc3Q6OmFzaW86OmlwOjp0Y3AsIExvY2FsRmFjZT4KK3sKKyAgLyoqIENoZWNrIHRoYXQgbG9jYWwgZW5kcG9pbnQgaXMgbG9vcGJhY2sKKyAgICoKKyAgICogIEB0aHJvd3MgRmFjZTo6RXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsZWQKKyAgICovCisgIHN0YXRpYyB2b2lkCisgIHZhbGlkYXRlU29ja2V0KGJvb3N0Ojphc2lvOjppcDo6dGNwOjpzb2NrZXQmIHNvY2tldCkKKyAgeworICAgIGlmICghc29ja2V0LmxvY2FsX2VuZHBvaW50KCkuYWRkcmVzcygpLmlzX2xvb3BiYWNrKCkgfHwKKyAgICAgICAgIXNvY2tldC5yZW1vdGVfZW5kcG9pbnQoKS5hZGRyZXNzKCkuaXNfbG9vcGJhY2soKSkKKyAgICAgIHsKKyAgICAgICAgdGhyb3cgRmFjZTo6RXJyb3IoIlRjcExvY2FsRmFjZSBjYW4gYmUgY3JlYXRlZCBvbmx5IG9uIGxvb3BiYWNrIGludGVyZmFjZSIpOworICAgICAgfQorICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9UQ1BfRkFDRV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS90Y3AtZmFjdG9yeS5jcHAgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGEyYzQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvdGNwLWZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAidGNwLWZhY3RvcnkuaHBwIgorI2luY2x1ZGUgImNvcmUvcmVzb2x2ZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKyNpbmNsdWRlICJjb3JlL25ldHdvcmstaW50ZXJmYWNlLmhwcCIKKworTkZEX0xPR19JTklUKCJUY3BGYWN0b3J5Iik7CisKK25hbWVzcGFjZSBuZmQgeworCitzdGF0aWMgY29uc3QgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzX3Y0IEFMTF9WNF9FTkRQT0lOVCgKKyAgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMC4wLjAuMCIpKTsKKworc3RhdGljIGNvbnN0IGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzc192NiBBTExfVjZfRU5EUE9JTlQoCisgIGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjo6IikpOworCitUY3BGYWN0b3J5OjpUY3BGYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0UG9ydC8qID0gIjYzNjMiKi8pCisgIDogbV9kZWZhdWx0UG9ydChkZWZhdWx0UG9ydCkKK3sKK30KKwordm9pZAorVGNwRmFjdG9yeTo6cHJvaGliaXRFbmRwb2ludChjb25zdCB0Y3A6OkVuZHBvaW50JiBlbmRwb2ludCkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOjppcDsKKworICBjb25zdCBhZGRyZXNzJiBhZGRyZXNzID0gZW5kcG9pbnQuYWRkcmVzcygpOworCisgIGlmIChhZGRyZXNzLmlzX3Y0KCkgJiYgYWRkcmVzcyA9PSBBTExfVjRfRU5EUE9JTlQpCisgICAgeworICAgICAgcHJvaGliaXRBbGxJcHY0RW5kcG9pbnRzKGVuZHBvaW50LnBvcnQoKSk7CisgICAgfQorICBlbHNlIGlmIChlbmRwb2ludC5hZGRyZXNzKCkuaXNfdjYoKSAmJiBhZGRyZXNzID09IEFMTF9WNl9FTkRQT0lOVCkKKyAgICB7CisgICAgICBwcm9oaWJpdEFsbElwdjZFbmRwb2ludHMoZW5kcG9pbnQucG9ydCgpKTsKKyAgICB9CisKKyAgTkZEX0xPR19UUkFDRSgicHJvaGliaXRpbmcgVENQICIgPDwgZW5kcG9pbnQpOworCisgIG1fcHJvaGliaXRlZEVuZHBvaW50cy5pbnNlcnQoZW5kcG9pbnQpOworfQorCit2b2lkCitUY3BGYWN0b3J5Ojpwcm9oaWJpdEFsbElwdjRFbmRwb2ludHMoY29uc3QgdWludDE2X3QgcG9ydCkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOjppcDsKKworICBmb3IgKGNvbnN0IE5ldHdvcmtJbnRlcmZhY2VJbmZvJiBuaWMgOiBsaXN0TmV0d29ya0ludGVyZmFjZXMoKSkgeworICAgIGZvciAoY29uc3QgYWRkcmVzc192NCYgYWRkciA6IG5pYy5pcHY0QWRkcmVzc2VzKSB7CisgICAgICBpZiAoYWRkciAhPSBBTExfVjRfRU5EUE9JTlQpIHsKKyAgICAgICAgcHJvaGliaXRFbmRwb2ludCh0Y3A6OkVuZHBvaW50KGFkZHIsIHBvcnQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZAorVGNwRmFjdG9yeTo6cHJvaGliaXRBbGxJcHY2RW5kcG9pbnRzKGNvbnN0IHVpbnQxNl90IHBvcnQpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6YXNpbzo6aXA7CisKKyAgZm9yIChjb25zdCBOZXR3b3JrSW50ZXJmYWNlSW5mbyYgbmljIDogbGlzdE5ldHdvcmtJbnRlcmZhY2VzKCkpIHsKKyAgICBmb3IgKGNvbnN0IGFkZHJlc3NfdjYmIGFkZHIgOiBuaWMuaXB2NkFkZHJlc3NlcykgeworICAgICAgaWYgKGFkZHIgIT0gQUxMX1Y2X0VORFBPSU5UKSB7CisgICAgICAgIHByb2hpYml0RW5kcG9pbnQodGNwOjpFbmRwb2ludChhZGRyLCBwb3J0KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3NoYXJlZF9wdHI8VGNwQ2hhbm5lbD4KK1RjcEZhY3Rvcnk6OmNyZWF0ZUNoYW5uZWwoY29uc3QgdGNwOjpFbmRwb2ludCYgZW5kcG9pbnQpCit7CisgIHNoYXJlZF9wdHI8VGNwQ2hhbm5lbD4gY2hhbm5lbCA9IGZpbmRDaGFubmVsKGVuZHBvaW50KTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGNoYW5uZWwpKQorICAgIHJldHVybiBjaGFubmVsOworCisgIGNoYW5uZWwgPSBtYWtlX3NoYXJlZDxUY3BDaGFubmVsPihlbmRwb2ludCk7CisgIG1fY2hhbm5lbHNbZW5kcG9pbnRdID0gY2hhbm5lbDsKKyAgcHJvaGliaXRFbmRwb2ludChlbmRwb2ludCk7CisKKyAgTkZEX0xPR19ERUJVRygiQ2hhbm5lbCBbIiA8PCBlbmRwb2ludCA8PCAiXSBjcmVhdGVkIik7CisgIHJldHVybiBjaGFubmVsOworfQorCitzaGFyZWRfcHRyPFRjcENoYW5uZWw+CitUY3BGYWN0b3J5OjpjcmVhdGVDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhbEhvc3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhbFBvcnQpCit7CisgIHJldHVybiBjcmVhdGVDaGFubmVsKFRjcFJlc29sdmVyOjpzeW5jUmVzb2x2ZShsb2NhbEhvc3QsIGxvY2FsUG9ydCkpOworfQorCitzaGFyZWRfcHRyPFRjcENoYW5uZWw+CitUY3BGYWN0b3J5OjpmaW5kQ2hhbm5lbChjb25zdCB0Y3A6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50KQoreworICBDaGFubmVsTWFwOjppdGVyYXRvciBpID0gbV9jaGFubmVscy5maW5kKGxvY2FsRW5kcG9pbnQpOworICBpZiAoaSAhPSBtX2NoYW5uZWxzLmVuZCgpKQorICAgIHJldHVybiBpLT5zZWNvbmQ7CisgIGVsc2UKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxUY3BDaGFubmVsPigpOworfQorCit2b2lkCitUY3BGYWN0b3J5OjpjcmVhdGVGYWNlKGNvbnN0IEZhY2VVcmkmIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpCit7CisgIHJlc29sdmVyOjpBZGRyZXNzU2VsZWN0b3IgYWRkcmVzc1NlbGVjdG9yID0gcmVzb2x2ZXI6OkFueUFkZHJlc3MoKTsKKyAgaWYgKHVyaS5nZXRTY2hlbWUoKSA9PSAidGNwNCIpCisgICAgYWRkcmVzc1NlbGVjdG9yID0gcmVzb2x2ZXI6OklwdjRBZGRyZXNzKCk7CisgIGVsc2UgaWYgKHVyaS5nZXRTY2hlbWUoKSA9PSAidGNwNiIpCisgICAgYWRkcmVzc1NlbGVjdG9yID0gcmVzb2x2ZXI6OklwdjZBZGRyZXNzKCk7CisKKyAgaWYgKCF1cmkuZ2V0UGF0aCgpLmVtcHR5KCkgJiYgdXJpLmdldFBhdGgoKSAhPSAiLyIpCisgICAgeworICAgICAgb25Db25uZWN0RmFpbGVkKCJJbnZhbGlkIFVSSSIpOworICAgIH0KKworICBUY3BSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKHVyaS5nZXRIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmdldFBvcnQoKS5lbXB0eSgpID8gbV9kZWZhdWx0UG9ydCA6IHVyaS5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVGNwRmFjdG9yeTo6Y29udGludWVDcmVhdGVGYWNlQWZ0ZXJSZXNvbHZlLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ3JlYXRlZCwgb25Db25uZWN0RmFpbGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3RGYWlsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1NlbGVjdG9yKTsKK30KKwordm9pZAorVGNwRmFjdG9yeTo6Y29udGludWVDcmVhdGVGYWNlQWZ0ZXJSZXNvbHZlKGNvbnN0IHRjcDo6RW5kcG9pbnQmIGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpCit7CisgIGlmIChtX3Byb2hpYml0ZWRFbmRwb2ludHMuZmluZChlbmRwb2ludCkgIT0gbV9wcm9oaWJpdGVkRW5kcG9pbnRzLmVuZCgpKQorICAgIHsKKyAgICAgIG9uQ29ubmVjdEZhaWxlZCgiUmVxdWVzdGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICIocmVzZXJ2ZWQgYnkgdGhpcyBORkQgb3IgZGlzYWxsb3dlZCBieSBmYWNlIG1hbmFnZW1lbnQgcHJvdG9jb2wpIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8vIHZlcnkgc2ltcGxlIGxvZ2ljIGZvciBub3cKKworICBmb3IgKENoYW5uZWxNYXA6Oml0ZXJhdG9yIGNoYW5uZWwgPSBtX2NoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgY2hhbm5lbCAhPSBtX2NoYW5uZWxzLmVuZCgpOworICAgICAgICsrY2hhbm5lbCkKKyAgICB7CisgICAgICBpZiAoKGNoYW5uZWwtPmZpcnN0LmFkZHJlc3MoKS5pc192NCgpICYmIGVuZHBvaW50LmFkZHJlc3MoKS5pc192NCgpKSB8fAorICAgICAgICAgIChjaGFubmVsLT5maXJzdC5hZGRyZXNzKCkuaXNfdjYoKSAmJiBlbmRwb2ludC5hZGRyZXNzKCkuaXNfdjYoKSkpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFubmVsLT5zZWNvbmQtPmNvbm5lY3QoZW5kcG9pbnQsIG9uQ3JlYXRlZCwgb25Db25uZWN0RmFpbGVkKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgIG9uQ29ubmVjdEZhaWxlZCgiTm8gY2hhbm5lbHMgYXZhaWxhYmxlIHRvIGNvbm5lY3QgdG8gIgorICAgICAgICAgICAgICAgICAgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlbmRwb2ludCkpOworfQorCitzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+CitUY3BGYWN0b3J5OjpnZXRDaGFubmVscygpIGNvbnN0Cit7CisgIHN0ZDo6bGlzdDxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID4gY2hhbm5lbHM7CisgIGZvciAoQ2hhbm5lbE1hcDo6Y29uc3RfaXRlcmF0b3IgaSA9IG1fY2hhbm5lbHMuYmVnaW4oKTsgaSAhPSBtX2NoYW5uZWxzLmVuZCgpOyArK2kpCisgICAgeworICAgICAgY2hhbm5lbHMucHVzaF9iYWNrKGktPnNlY29uZCk7CisgICAgfQorCisgIHJldHVybiBjaGFubmVsczsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvdGNwLWZhY3RvcnkuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL3RjcC1mYWN0b3J5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmViZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3RjcC1mYWN0b3J5LmhwcApAQCAtMCwwICsxLDEyOSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfVENQX0ZBQ1RPUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9UQ1BfRkFDVE9SWV9IUFAKKworI2luY2x1ZGUgInByb3RvY29sLWZhY3RvcnkuaHBwIgorI2luY2x1ZGUgInRjcC1jaGFubmVsLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK2NsYXNzIFRjcEZhY3RvcnkgOiBwdWJsaWMgUHJvdG9jb2xGYWN0b3J5Cit7CitwdWJsaWM6CisgIC8qKgorICAgKiBcYnJpZWYgRXhjZXB0aW9uIG9mIFRjcEZhY3RvcnkKKyAgICovCisgIHN0cnVjdCBFcnJvciA6IHB1YmxpYyBQcm90b2NvbEZhY3Rvcnk6OkVycm9yCisgIHsKKyAgICBFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgd2hhdCkgOiBQcm90b2NvbEZhY3Rvcnk6OkVycm9yKHdoYXQpIHt9CisgIH07CisKKyAgZXhwbGljaXQKKyAgVGNwRmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdFBvcnQgPSAiNjM2MyIpOworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIFRDUC1iYXNlZCBjaGFubmVsIHVzaW5nIHRjcDo6RW5kcG9pbnQKKyAgICoKKyAgICogdGNwOjpFbmRwb2ludCBpcyByZWFsbHkgYW4gYWxpYXMgZm9yIGJvb3N0Ojphc2lvOjppcDo6dGNwOjplbmRwb2ludC4KKyAgICoKKyAgICogSWYgdGhpcyBtZXRob2QgY2FsbGVkIHR3aWNlIHdpdGggdGhlIHNhbWUgZW5kcG9pbnQsIG9ubHkgb25lIGNoYW5uZWwKKyAgICogd2lsbCBiZSBjcmVhdGVkLiAgVGhlIHNlY29uZCBjYWxsIHdpbGwganVzdCByZXRyaWV2ZSB0aGUgZXhpc3RpbmcKKyAgICogY2hhbm5lbC4KKyAgICoKKyAgICogXHJldHVybnMgYWx3YXlzIGEgdmFsaWQgcG9pbnRlciB0byBhIFRjcENoYW5uZWwgb2JqZWN0LCBhbiBleGNlcHRpb24KKyAgICogICAgICAgICAgaXMgdGhyb3duIGlmIGl0IGNhbm5vdCBiZSBjcmVhdGVkLgorICAgKgorICAgKiBcdGhyb3dzIFRjcEZhY3Rvcnk6OkVycm9yCisgICAqCisgICAqIFxzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvMV80Ml8wL2RvYy9odG1sL2Jvb3N0X2FzaW8vcmVmZXJlbmNlL2lwX190Y3AvZW5kcG9pbnQuaHRtbAorICAgKiAgICAgIGZvciBkZXRhaWxzIG9uIHdheXMgdG8gY3JlYXRlIHRjcDo6RW5kcG9pbnQKKyAgICovCisgIHNoYXJlZF9wdHI8VGNwQ2hhbm5lbD4KKyAgY3JlYXRlQ2hhbm5lbChjb25zdCB0Y3A6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50KTsKKworICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBUQ1AtYmFzZWQgY2hhbm5lbCB1c2luZyBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydCBudW1iZXIKKyAgICoKKyAgICogVGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvIHJlc29sdmUgdGhlIHByb3ZpZGVkIGhvc3QgYW5kIHBvcnQgbnVtYmVycworICAgKiBhbmQgd2lsbCB0aHJvdyBUY3BGYWN0b3J5OjpFcnJvciB3aGVuIGNoYW5uZWwgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAqCisgICAqIE5vdGUgdGhhdCB0aGlzIGNhbGwgd2lsbCAqKkJMT0NLKiogdW50aWwgcmVzb2x1dGlvbiBpcyBkb25lIG9yIGZhaWxlZC4KKyAgICoKKyAgICogXHRocm93cyBUY3BGYWN0b3J5OjpFcnJvciBvciBzdGQ6OnJ1bnRpbWVfZXJyb3IKKyAgICovCisgIHNoYXJlZF9wdHI8VGNwQ2hhbm5lbD4KKyAgY3JlYXRlQ2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgbG9jYWxIb3N0LCBjb25zdCBzdGQ6OnN0cmluZyYgbG9jYWxQb3J0KTsKKworICAvLyBmcm9tIEZhY3RvcnkKKworICB2aXJ0dWFsIHZvaWQKKyAgY3JlYXRlRmFjZShjb25zdCBGYWNlVXJpJiB1cmksCisgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgIGNvbnN0IEZhY2VDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCk7CisKKyAgdmlydHVhbCBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+CisgIGdldENoYW5uZWxzKCkgY29uc3Q7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKworICB2b2lkCisgIHByb2hpYml0RW5kcG9pbnQoY29uc3QgdGNwOjpFbmRwb2ludCYgZW5kcG9pbnQpOworCisgIHZvaWQKKyAgcHJvaGliaXRBbGxJcHY0RW5kcG9pbnRzKGNvbnN0IHVpbnQxNl90IHBvcnQpOworCisgIHZvaWQKKyAgcHJvaGliaXRBbGxJcHY2RW5kcG9pbnRzKGNvbnN0IHVpbnQxNl90IHBvcnQpOworCisgIC8qKgorICAgKiBcYnJpZWYgTG9vayB1cCBUY3BDaGFubmVsIHVzaW5nIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludAorICAgKgorICAgKiBccmV0dXJucyBzaGFyZWQgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgVGNwQ2hhbm5lbCBvYmplY3QKKyAgICogICAgICAgICAgb3IgZW1wdHkgc2hhcmVkIHBvaW50ZXIgd2hlbiBzdWNoIGNoYW5uZWwgZG9lcyBub3QgZXhpc3QKKyAgICoKKyAgICogXHRocm93cyBuZXZlcgorICAgKi8KKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPgorICBmaW5kQ2hhbm5lbChjb25zdCB0Y3A6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50KTsKKworICB2b2lkCisgIGNvbnRpbnVlQ3JlYXRlRmFjZUFmdGVyUmVzb2x2ZShjb25zdCB0Y3A6OkVuZHBvaW50JiBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCk7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKyAgdHlwZWRlZiBzdGQ6Om1hcDwgdGNwOjpFbmRwb2ludCwgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiA+IENoYW5uZWxNYXA7CisgIENoYW5uZWxNYXAgbV9jaGFubmVsczsKKworICBzdGQ6OnN0cmluZyBtX2RlZmF1bHRQb3J0OworCisgIHN0ZDo6c2V0PHRjcDo6RW5kcG9pbnQ+IG1fcHJvaGliaXRlZEVuZHBvaW50czsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX1RDUF9GQUNUT1JZX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3VkcC1jaGFubmVsLmNwcCBiL05GRC9kYWVtb24vZmFjZS91ZHAtY2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiNGI3NwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS91ZHAtY2hhbm5lbC5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ1ZHAtY2hhbm5lbC5ocHAiCisjaW5jbHVkZSAiY29yZS9nbG9iYWwtaW8uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJVZHBDaGFubmVsIik7CisKK3VzaW5nIG5hbWVzcGFjZSBib29zdDo6YXNpbzsKKworVWRwQ2hhbm5lbDo6VWRwQ2hhbm5lbChjb25zdCB1ZHA6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiB0aW1lb3V0KQorICA6IG1fbG9jYWxFbmRwb2ludChsb2NhbEVuZHBvaW50KQorICAsIG1faXNMaXN0ZW5pbmcoZmFsc2UpCisgICwgbV9pZGxlRmFjZVRpbWVvdXQodGltZW91dCkKK3sKKyAgLy8vIFx0b2RvIHRoZSByZXVzZV9hZGRyZXNzIHdvcmtzIGFzIHdlIHdhbnQgaW4gTGludXgsIGJ1dCBpbiBvdGhlciBzeXN0ZW0gY291bGQgYmUgZGlmZmVyZW50LgorICAvLy8gICAgICAgV2UgbmVlZCB0byBjaGVjayB0aGlzCisgIC8vLyAgICAgICAoU09fUkVVU0VBRERSIGRvZXNuJ3QgYmVoYXZlIHVuaWZvcm1seSBpbiBkaWZmZXJlbnQgT1MpCisKKyAgbV9zb2NrZXQgPSBtYWtlX3NoYXJlZDxpcDo6dWRwOjpzb2NrZXQ+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworICBtX3NvY2tldC0+b3BlbihtX2xvY2FsRW5kcG9pbnQucHJvdG9jb2woKSk7CisgIG1fc29ja2V0LT5zZXRfb3B0aW9uKGJvb3N0Ojphc2lvOjppcDo6dWRwOjpzb2NrZXQ6OnJldXNlX2FkZHJlc3ModHJ1ZSkpOworICBpZiAobV9sb2NhbEVuZHBvaW50LmFkZHJlc3MoKS5pc192NigpKQorICAgIHsKKyAgICAgIG1fc29ja2V0LT5zZXRfb3B0aW9uKGlwOjp2Nl9vbmx5KHRydWUpKTsKKyAgICB9CisKKyAgdHJ5IHsKKyAgICBtX3NvY2tldC0+YmluZChtX2xvY2FsRW5kcG9pbnQpOworICB9CisgIGNhdGNoIChib29zdDo6c3lzdGVtOjpzeXN0ZW1fZXJyb3ImIGUpIHsKKyAgICAvL1RoZSBiaW5kIGZhaWxlZCwgc28gdGhlIHNvY2tldCBpcyB1c2VsZXNzIG5vdworICAgIG1fc29ja2V0LT5jbG9zZSgpOworICAgIHRocm93IEVycm9yKCJGYWlsZWQgdG8gcHJvcGVybHkgY29uZmlndXJlIHRoZSBzb2NrZXQuICIKKyAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBjcmVhdGlvbiBhYm9ydGVkLCBjaGVjayB0aGUgYWRkcmVzcyAoIiArIHN0ZDo6c3RyaW5nKGUud2hhdCgpKSArICIpIik7CisgIH0KKworICB0aGlzLT5zZXRVcmkoRmFjZVVyaShsb2NhbEVuZHBvaW50KSk7Cit9CisKK3ZvaWQKK1VkcENoYW5uZWw6Omxpc3Rlbihjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25MaXN0ZW5GYWlsZWQpCit7CisgIGlmIChtX2lzTGlzdGVuaW5nKSB7CisgICAgdGhyb3cgRXJyb3IoIkxpc3RlbiBhbHJlYWR5IGNhbGxlZCBvbiB0aGlzIGNoYW5uZWwiKTsKKyAgfQorICBtX2lzTGlzdGVuaW5nID0gdHJ1ZTsKKworICBvbkZhY2VDcmVhdGVkTmV3UGVlckNhbGxiYWNrID0gb25GYWNlQ3JlYXRlZDsKKyAgb25Db25uZWN0RmFpbGVkTmV3UGVlckNhbGxiYWNrID0gb25MaXN0ZW5GYWlsZWQ7CisKKyAgbV9zb2NrZXQtPmFzeW5jX3JlY2VpdmVfZnJvbShib29zdDo6YXNpbzo6YnVmZmVyKG1faW5wdXRCdWZmZXIsIG5kbjo6TUFYX05ETl9QQUNLRVRfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZXdSZW1vdGVFbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZVZHBDaGFubmVsOjpuZXdQZWVyLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmFzaW86OnBsYWNlaG9sZGVyczo6ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6YXNpbzo6cGxhY2Vob2xkZXJzOjpieXRlc190cmFuc2ZlcnJlZCkpOworfQorCisKK3ZvaWQKK1VkcENoYW5uZWw6OmNvbm5lY3QoY29uc3QgdWRwOjpFbmRwb2ludCYgcmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKQoreworICBDaGFubmVsRmFjZU1hcDo6aXRlcmF0b3IgaSA9IG1fY2hhbm5lbEZhY2VzLmZpbmQocmVtb3RlRW5kcG9pbnQpOworICBpZiAoaSAhPSBtX2NoYW5uZWxGYWNlcy5lbmQoKSkgeworICAgIGktPnNlY29uZC0+c2V0T25EZW1hbmQoZmFsc2UpOworICAgIG9uRmFjZUNyZWF0ZWQoaS0+c2Vjb25kKTsKKyAgICByZXR1cm47CisgIH0KKworICAvL2NyZWF0aW5nIGEgbmV3IHNvY2tldCBmb3IgdGhlIGZhY2UgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgc29vbgorICBzaGFyZWRfcHRyPGlwOjp1ZHA6OnNvY2tldD4gY2xpZW50U29ja2V0ID0KKyAgICBtYWtlX3NoYXJlZDxpcDo6dWRwOjpzb2NrZXQ+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworCisgIGNsaWVudFNvY2tldC0+b3BlbihtX2xvY2FsRW5kcG9pbnQucHJvdG9jb2woKSk7CisgIGNsaWVudFNvY2tldC0+c2V0X29wdGlvbihpcDo6dWRwOjpzb2NrZXQ6OnJldXNlX2FkZHJlc3ModHJ1ZSkpOworCisgIHRyeSB7CisgICAgY2xpZW50U29ja2V0LT5iaW5kKG1fbG9jYWxFbmRwb2ludCk7CisgICAgY2xpZW50U29ja2V0LT5jb25uZWN0KHJlbW90ZUVuZHBvaW50KTsgLy9AdG9kbyBjb25uZWN0IG9yIGFzeW5jX2Nvbm5lY3QKKyAgICAvLyhzaW5jZSB0aGVyZSBpcyBubyBoYW5kc2hha2UgdGhlIGNvbm5lY3Qgc2hvdWxkbid0IGJsb2NrKS4gSWYgd2UgZ28gZm9yCisgICAgLy9hc3luY19jb25uZWN0LCBtYWtlIHN1cmUgdGhhdCBpZiBpbiB0aGUgbWVhbnRpbWUgd2UgcmVjZWl2ZSBhIFVEUCBwa3QgZnJvbQorICAgIC8vdGhhdCBlbmRwb2ludCBub3RoaW5nIGJhZCBoYXBwZW4gKGl0J3MgZGlmZmljdWx0LCBidXQgaXQgY291bGQgaGFwcGVuKQorICB9CisgIGNhdGNoIChib29zdDo6c3lzdGVtOjpzeXN0ZW1fZXJyb3ImIGUpIHsKKyAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgb25Db25uZWN0RmFpbGVkKCJGYWlsZWQgdG8gY29uZmlndXJlIHNvY2tldCAoIiArIHN0ZDo6c3RyaW5nKGUud2hhdCgpKSArICIpIik7CisgICAgcmV0dXJuOworICB9CisgIGNyZWF0ZUZhY2UoY2xpZW50U29ja2V0LCBvbkZhY2VDcmVhdGVkLCBmYWxzZSk7Cit9CisKK3ZvaWQKK1VkcENoYW5uZWw6OmNvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIHJlbW90ZUhvc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCkKK3sKKyAgaXA6OnVkcDo6cmVzb2x2ZXI6OnF1ZXJ5IHF1ZXJ5KHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpOworICBzaGFyZWRfcHRyPGlwOjp1ZHA6OnJlc29sdmVyPiByZXNvbHZlciA9CisgICAgbWFrZV9zaGFyZWQ8aXA6OnVkcDo6cmVzb2x2ZXI+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworCisgIHJlc29sdmVyLT5hc3luY19yZXNvbHZlKHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZVZHBDaGFubmVsOjpoYW5kbGVFbmRwb2ludFJlc29sdXRpb24sIHRoaXMsIF8xLCBfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhY2VDcmVhdGVkLCBvbkNvbm5lY3RGYWlsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIpKTsKK30KKwordm9pZAorVWRwQ2hhbm5lbDo6aGFuZGxlRW5kcG9pbnRSZXNvbHV0aW9uKGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcDo6dWRwOjpyZXNvbHZlcjo6aXRlcmF0b3IgcmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGlwOjp1ZHA6OnJlc29sdmVyPiYgcmVzb2x2ZXIpCit7CisgIGlmIChlcnJvciAhPSAwIHx8CisgICAgICByZW1vdGVFbmRwb2ludCA9PSBpcDo6dWRwOjpyZXNvbHZlcjo6aXRlcmF0b3IoKSkKKyAgeworICAgIGlmIChlcnJvciA9PSBib29zdDo6c3lzdGVtOjplcnJjOjpvcGVyYXRpb25fY2FuY2VsZWQpIC8vIHdoZW4gc29ja2V0IGlzIGNsb3NlZCBieSBzb21lb25lCisgICAgICByZXR1cm47CisKKyAgICBORkRfTE9HX0RFQlVHKCJSZW1vdGUgZW5kcG9pbnQgaG9zdG5hbWUgb3IgcG9ydCBjYW5ub3QgYmUgcmVzb2x2ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgZXJyb3IuY2F0ZWdvcnkoKS5tZXNzYWdlKGVycm9yLnZhbHVlKCkpKTsKKworICAgIG9uQ29ubmVjdEZhaWxlZCgiUmVtb3RlIGVuZHBvaW50IGhvc3RuYW1lIG9yIHBvcnQgY2Fubm90IGJlIHJlc29sdmVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jYXRlZ29yeSgpLm1lc3NhZ2UoZXJyb3IudmFsdWUoKSkpOworICAgICAgcmV0dXJuOworICB9CisKKyAgY29ubmVjdCgqcmVtb3RlRW5kcG9pbnQsIG9uRmFjZUNyZWF0ZWQsIG9uQ29ubmVjdEZhaWxlZCk7Cit9CisKK3NpemVfdAorVWRwQ2hhbm5lbDo6c2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX2NoYW5uZWxGYWNlcy5zaXplKCk7Cit9CisKKworc2hhcmVkX3B0cjxVZHBGYWNlPgorVWRwQ2hhbm5lbDo6Y3JlYXRlRmFjZShjb25zdCBzaGFyZWRfcHRyPGlwOjp1ZHA6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25GYWNlQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc09uRGVtYW5kKQoreworICB1ZHA6OkVuZHBvaW50IHJlbW90ZUVuZHBvaW50ID0gc29ja2V0LT5yZW1vdGVfZW5kcG9pbnQoKTsKKworICBzaGFyZWRfcHRyPFVkcEZhY2U+IGZhY2U7CisKKyAgQ2hhbm5lbEZhY2VNYXA6Oml0ZXJhdG9yIGZhY2VNYXBQb3MgPSBtX2NoYW5uZWxGYWNlcy5maW5kKHJlbW90ZUVuZHBvaW50KTsKKyAgaWYgKGZhY2VNYXBQb3MgPT0gbV9jaGFubmVsRmFjZXMuZW5kKCkpCisgICAgeworICAgICAgZmFjZSA9IG1ha2Vfc2hhcmVkPFVkcEZhY2U+KHNvY2tldCwgaXNPbkRlbWFuZCwgbV9pZGxlRmFjZVRpbWVvdXQpOworICAgICAgZmFjZS0+b25GYWlsICs9IGJpbmQoJlVkcENoYW5uZWw6OmFmdGVyRmFjZUZhaWxlZCwgdGhpcywgcmVtb3RlRW5kcG9pbnQpOworCisgICAgICBtX2NoYW5uZWxGYWNlc1tyZW1vdGVFbmRwb2ludF0gPSBmYWNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8vIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCBhIGEgZmFjZSBmb3IgdGhpcyBlbmRwb2ludCwganVzdCByZXVzZSBpdAorICAgICAgZmFjZSA9IGZhY2VNYXBQb3MtPnNlY29uZDsKKworICAgICAgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlcnJvcjsKKyAgICAgIHNvY2tldC0+c2h1dGRvd24oaXA6OnVkcDo6c29ja2V0OjpzaHV0ZG93bl9ib3RoLCBlcnJvcik7CisgICAgICBzb2NrZXQtPmNsb3NlKGVycm9yKTsKKyAgICB9CisKKyAgLy8gTmVlZCB0byBpbnZva2UgdGhlIGNhbGxiYWNrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQKKyAgLy8gdGhlIGZhY2Ugc28gdGhhdCBjb250cm9sIHJlc3BvbnNlcyBhbmQgc3VjaCBjYW4gYmUgc2VudC4KKyAgb25GYWNlQ3JlYXRlZChmYWNlKTsKKworICByZXR1cm4gZmFjZTsKK30KKwordm9pZAorVWRwQ2hhbm5lbDo6bmV3UGVlcihjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5CeXRlc1JlY2VpdmVkKQoreworICBORkRfTE9HX0RFQlVHKCJVZHBDaGFubmVsOjpuZXdQZWVyIGZyb20gIiA8PCBtX25ld1JlbW90ZUVuZHBvaW50KTsKKworICBzaGFyZWRfcHRyPFVkcEZhY2U+IGZhY2U7CisKKyAgQ2hhbm5lbEZhY2VNYXA6Oml0ZXJhdG9yIGkgPSBtX2NoYW5uZWxGYWNlcy5maW5kKG1fbmV3UmVtb3RlRW5kcG9pbnQpOworICBpZiAoaSAhPSBtX2NoYW5uZWxGYWNlcy5lbmQoKSkgeworICAgIC8vVGhlIGZhY2UgYWxyZWFkeSBleGlzdHMuCisgICAgLy9Vc3VhbGx5IHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYmVjYXVzZSB0aGUgY2hhbm5lbCBjcmVhdGVzIGEgVWRwZmFjZQorICAgIC8vYXMgc29vbiBhcyBpdCByZWNlaXZlcyBhIHBrdCBmcm9tIGEgbmV3IGVuZHBvaW50IGFuZCB0aGVuIHRoZQorICAgIC8vdHJhZmZpYyBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBrZXJuZWwgZGlyZWN0bHkgdG8gdGhlIGZhY2UuCisgICAgLy9Ib3dldmVyLCBpZiB0aGUgbm9kZSByZWNlaXZlcyBtdWx0aXBsZSBwYWNrZXRzIGZyb20gdGhlIHNhbWUgZW5kcG9pbnQKKyAgICAvLyJhdCB0aGUgc2FtZSB0aW1lIiwgd2hpbGUgdGhlIGNoYW5uZWwgaXMgY3JlYXRpbmcgdGhlIGZhY2UgdGhlIGtlcm5lbAorICAgIC8vY291bGQgZGlzcGF0Y2ggdGhlIG90aGVyIHBrdHMgdG8gdGhlIGNoYW5uZWwgYmVjYXVzZSB0aGUgZmFjZSBpcyBub3QgeWV0CisgICAgLy9yZWFkeS4gSW4gdGhpcyBjYXNlLCB0aGUgY2hhbm5lbCBoYXMgdG8gcGFzcyB0aGUgcGt0IHRvIHRoZSBmYWNlCisKKyAgICBORkRfTE9HX0RFQlVHKCJUaGUgY3JlYXRpb24gb2YgdGhlIGZhY2UgZm9yIHRoZSByZW1vdGUgZW5kcG9pbnQgIgorICAgICAgICAgICAgICAgICAgPDwgbV9uZXdSZW1vdGVFbmRwb2ludAorICAgICAgICAgICAgICAgICAgPDwgIiBpcyBpbiBwcm9ncmVzcyIpOworCisgICAgZmFjZSA9IGktPnNlY29uZDsKKyAgfQorICBlbHNlIHsKKyAgICBzaGFyZWRfcHRyPGlwOjp1ZHA6OnNvY2tldD4gY2xpZW50U29ja2V0ID0KKyAgICAgIG1ha2Vfc2hhcmVkPGlwOjp1ZHA6OnNvY2tldD4ocmVmKGdldEdsb2JhbElvU2VydmljZSgpKSk7CisgICAgY2xpZW50U29ja2V0LT5vcGVuKG1fbG9jYWxFbmRwb2ludC5wcm90b2NvbCgpKTsKKyAgICBjbGllbnRTb2NrZXQtPnNldF9vcHRpb24oaXA6OnVkcDo6c29ja2V0OjpyZXVzZV9hZGRyZXNzKHRydWUpKTsKKyAgICBjbGllbnRTb2NrZXQtPmJpbmQobV9sb2NhbEVuZHBvaW50KTsKKyAgICBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlIGVjOworICAgIGNsaWVudFNvY2tldC0+Y29ubmVjdChtX25ld1JlbW90ZUVuZHBvaW50LCBlYyk7CisgICAgaWYgKGVjKSB7CisgICAgICBORkRfTE9HX1dBUk4oIkVycm9yIHdoaWxlIGNyZWF0aW5nIG9uLWRlbWFuZCBVRFAgZmFjZSBmcm9tICIgPDwgbV9uZXdSZW1vdGVFbmRwb2ludCA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgPDwgYm9vc3Q6OnN5c3RlbTo6c3lzdGVtX2Vycm9yKGVjKS53aGF0KCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZhY2UgPSBjcmVhdGVGYWNlKGNsaWVudFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICBvbkZhY2VDcmVhdGVkTmV3UGVlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICB9CisKKyAgLy8gZGlzcGF0Y2ggdGhlIGRhdGFncmFtIHRvIHRoZSBmYWNlIGZvciBwcm9jZXNzaW5nCisgIGZhY2UtPnJlY2VpdmVEYXRhZ3JhbShtX2lucHV0QnVmZmVyLCBuQnl0ZXNSZWNlaXZlZCwgZXJyb3IpOworCisgIG1fc29ja2V0LT5hc3luY19yZWNlaXZlX2Zyb20oYm9vc3Q6OmFzaW86OmJ1ZmZlcihtX2lucHV0QnVmZmVyLCBuZG46Ok1BWF9ORE5fUEFDS0VUX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmV3UmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVWRwQ2hhbm5lbDo6bmV3UGVlciwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojphc2lvOjpwbGFjZWhvbGRlcnM6OmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmFzaW86OnBsYWNlaG9sZGVyczo6Ynl0ZXNfdHJhbnNmZXJyZWQpKTsKK30KKworCit2b2lkCitVZHBDaGFubmVsOjphZnRlckZhY2VGYWlsZWQodWRwOjpFbmRwb2ludCAmZW5kcG9pbnQpCit7CisgIE5GRF9MT0dfREVCVUcoImFmdGVyRmFjZUZhaWxlZDogIiA8PCBlbmRwb2ludCk7CisgIG1fY2hhbm5lbEZhY2VzLmVyYXNlKGVuZHBvaW50KTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvdWRwLWNoYW5uZWwuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL3VkcC1jaGFubmVsLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2VmZDhiCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3VkcC1jaGFubmVsLmhwcApAQCAtMCwwICsxLDE3OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfVURQX0NIQU5ORUxfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9VRFBfQ0hBTk5FTF9IUFAKKworI2luY2x1ZGUgImNoYW5uZWwuaHBwIgorI2luY2x1ZGUgImNvcmUvZ2xvYmFsLWlvLmhwcCIKKyNpbmNsdWRlICJ1ZHAtZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCituYW1lc3BhY2UgdWRwIHsKK3R5cGVkZWYgYm9vc3Q6OmFzaW86OmlwOjp1ZHA6OmVuZHBvaW50IEVuZHBvaW50OworfSAvLyBuYW1lc3BhY2UgdWRwCisKKy8qKgorICogXGJyaWVmIENsYXNzIGltcGxlbWVudGluZyBVRFAtYmFzZWQgY2hhbm5lbCB0byBjcmVhdGUgZmFjZXMKKyAqCisgKgorICovCitjbGFzcyBVZHBDaGFubmVsIDogcHVibGljIENoYW5uZWwKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIFxicmllZiBFeGNlcHRpb24gb2YgVWRwQ2hhbm5lbAorICAgKi8KKyAgc3RydWN0IEVycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpIDogcnVudGltZV9lcnJvcih3aGF0KSB7fQorICB9OworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIFVEUCBjaGFubmVsIGZvciB0aGUgbG9jYWwgZW5kcG9pbnQKKyAgICoKKyAgICogVG8gZW5hYmxlIGNyZWF0aW9uIG9mIGZhY2VzIHVwb24gaW5jb21pbmcgY29ubmVjdGlvbnMsCisgICAqIG9uZSBuZWVkcyB0byBleHBsaWNpdGx5IGNhbGwgVWRwQ2hhbm5lbDo6bGlzdGVuIG1ldGhvZC4KKyAgICogVGhlIGNyZWF0ZWQgc29ja2V0IGlzIGJvdW5kIHRvIHRoZSBsb2NhbEVuZHBvaW50LgorICAgKiByZXVzZV9hZGRyZXNzIG9wdGlvbiBpcyBzZXQKKyAgICoKKyAgICogXHRocm93IFVkcENoYW5uZWw6OkVycm9yIGlmIGJpbmQgb24gdGhlIHNvY2tldCBmYWlscworICAgKi8KKyAgVWRwQ2hhbm5lbChjb25zdCB1ZHA6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50LAorICAgICAgICAgICAgIGNvbnN0IHRpbWU6OnNlY29uZHMmIHRpbWVvdXQpOworCisgIC8qKgorICAgKiBcYnJpZWYgRW5hYmxlIGxpc3RlbmluZyBvbiB0aGUgbG9jYWwgZW5kcG9pbnQsIGFjY2VwdCBjb25uZWN0aW9ucywKKyAgICogICAgICAgIGFuZCBjcmVhdGUgZmFjZXMgd2hlbiByZW1vdGUgaG9zdCBtYWtlcyBhIGNvbm5lY3Rpb24KKyAgICogXHBhcmFtIG9uRmFjZUNyZWF0ZWQgIENhbGxiYWNrIHRvIG5vdGlmeSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIHRoZSBmYWNlCisgICAqIFxwYXJhbSBvbkFjY2VwdEZhaWxlZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBjaGFubmVsIGZhaWxzCisgICAqCisgICAqIE9uY2UgYSBmYWNlIGlzIGNyZWF0ZWQsIGlmIGl0IGRvZXNuJ3Qgc2VuZC9yZWNlaXZlIGFueXRoaW5nIGZvcgorICAgKiBhIHBlcmlvZCBvZiB0aW1lIGVxdWFsIHRvIHRpbWVvdXQsIGl0IHdpbGwgYmUgZGVzdHJveWVkCisgICAqIFx0b2RvIHRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgdG8gYmUgaW1wbGVtZW50ZWQKKyAgICoKKyAgICogXHRocm93cyBVZHBDaGFubmVsOjpFcnJvciBpZiBjYWxsZWQgbXVsdGlwbGUgdGltZXMKKyAgICovCisgIHZvaWQKKyAgbGlzdGVuKGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICBjb25zdCBDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQWNjZXB0RmFpbGVkKTsKKworICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBhIGZhY2UgYnkgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb24gdG8gcmVtb3RlIGVuZHBvaW50CisgICAqCisgICAqIFx0aHJvdyBVZHBDaGFubmVsOjpFcnJvciBpZiBiaW5kIG9yIGNvbm5lY3Qgb24gdGhlIHNvY2tldCBmYWlsCisgICAqLworICB2b2lkCisgIGNvbm5lY3QoY29uc3QgdWRwOjpFbmRwb2ludCYgcmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25GYWNlQ3JlYXRlZCwKKyAgICAgICAgICBjb25zdCBDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCk7CisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIGEgZmFjZSBieSBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbiB0byB0aGUgc3BlY2lmaWVkCisgICAqICAgICAgICByZW1vdGUgaG9zdCBhbmQgcmVtb3RlIHBvcnQKKyAgICoKKyAgICogVGhpcyBtZXRob2Qgd2lsbCBuZXZlciBibG9jayBhbmQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuIEFsbAorICAgKiBuZWNlc3NhcnkgaG9zdG5hbWUgYW5kIHBvcnQgcmVzb2x1dGlvbiBhbmQgY29ubmVjdGlvbiB3aWxsIGhhcHBlbgorICAgKiBpbiBhc3luY2hyb25vdXMgbW9kZS4KKyAgICoKKyAgICogSWYgY29ubmVjdGlvbiBjYW5ub3QgYmUgZXN0YWJsaXNoZWQgd2l0aGluIHNwZWNpZmllZCB0aW1lb3V0LCBpdAorICAgKiB3aWxsIGJlIGFib3J0ZWQuCisgICAqLworICB2b2lkCisgIGNvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIHJlbW90ZUhvc3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiByZW1vdGVQb3J0LAorICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgY29uc3QgQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpOworCisgIC8qKgorICAgKiBcYnJpZWYgR2V0IG51bWJlciBvZiBmYWNlcyBpbiB0aGUgY2hhbm5lbAorICAgKi8KKyAgc2l6ZV90CisgIHNpemUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxVZHBGYWNlPgorICBjcmVhdGVGYWNlKGNvbnN0IHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OmlwOjp1ZHA6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgIGJvb2wgaXNPbkRlbWFuZCk7CisgIHZvaWQKKyAgYWZ0ZXJGYWNlRmFpbGVkKHVkcDo6RW5kcG9pbnQmIGVuZHBvaW50KTsKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBVZHBDaGFubmVsIGhhcyByZWNlaXZlZCBhIG5ldyBwa3QgZnJvbSBhIHJlbW90ZSBlbmRwb2ludCBub3QgeWV0CisgICAqICAgICAgICBhc3NvY2lhdGVkIHdpdGggYW55IFVkcEZhY2UKKyAgICovCisgIHZvaWQKKyAgbmV3UGVlcihjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwgc2l6ZV90IG5CeXRlc1JlY2VpdmVkKTsKKworICB2b2lkCisgIGhhbmRsZUVuZHBvaW50UmVzb2x1dGlvbihjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojphc2lvOjppcDo6dWRwOjpyZXNvbHZlcjo6aXRlcmF0b3IgcmVtb3RlRW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGJvb3N0Ojphc2lvOjppcDo6dWRwOjpyZXNvbHZlcj4mIHJlc29sdmVyKTsKKworcHJpdmF0ZToKKyAgdWRwOjpFbmRwb2ludCBtX2xvY2FsRW5kcG9pbnQ7CisKKyAgLyoqCisgICAqIFxicmllZiBFbmRwb2ludCB1c2VkIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBuZXcgcmVtb3RlIGVuZHBvaW50CisgICAqLworICB1ZHA6OkVuZHBvaW50IG1fbmV3UmVtb3RlRW5kcG9pbnQ7CisKKyAgLyoqCisgICAqIENhbGxiYWNrcyBmb3IgZmFjZSBjcmVhdGlvbi4KKyAgICogTmV3IGNvbW11bmljYXRpb25zIGFyZSBkZXRlY3RlZCB1c2luZyBhc3luY19yZWNlaXZlX2Zyb20uCisgICAqIEl0cyBoYW5kbGVyIGhhcyBhIGZpeGVkIHNpZ25hdHVyZS4gTm8gc3BhY2UgZm9yIHRoZSBmYWNlIGNhbGxiYWNrCisgICAqLworICBGYWNlQ3JlYXRlZENhbGxiYWNrIG9uRmFjZUNyZWF0ZWROZXdQZWVyQ2FsbGJhY2s7CisKKyAgLy8gQHRvZG8gcmVtb3ZlIHRoZSBvbkNvbm5lY3RGYWlsZWROZXdQZWVyQ2FsbGJhY2sgaWYgaXQgcmVtYWlucyB1bnVzZWQKKyAgQ29ubmVjdEZhaWxlZENhbGxiYWNrIG9uQ29ubmVjdEZhaWxlZE5ld1BlZXJDYWxsYmFjazsKKworICAvKioKKyAgICogXGJyaWVmIFNvY2tldCB1c2VkIHRvICJhY2NlcHQiIG5ldyBjb21tdW5pY2F0aW9uCisgICAqKi8KKyAgc2hhcmVkX3B0cjxib29zdDo6YXNpbzo6aXA6OnVkcDo6c29ja2V0PiBtX3NvY2tldDsKKworICB1aW50OF90IG1faW5wdXRCdWZmZXJbbmRuOjpNQVhfTkROX1BBQ0tFVF9TSVpFXTsKKworICB0eXBlZGVmIHN0ZDo6bWFwPCB1ZHA6OkVuZHBvaW50LCBzaGFyZWRfcHRyPFVkcEZhY2U+ID4gQ2hhbm5lbEZhY2VNYXA7CisgIENoYW5uZWxGYWNlTWFwIG1fY2hhbm5lbEZhY2VzOworCisgIC8qKgorICAgKiBcYnJpZWYgSWYgdHJ1ZSwgaXQgbWVhbnMgdGhlIGZ1bmN0aW9uIGxpc3RlbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAorICAgKi8KKyAgYm9vbCBtX2lzTGlzdGVuaW5nOworCisgIC8qKgorICAgKiBcYnJpZWYgZXZlcnkgdGltZSBtX2lkbGVGYWNlVGltZW91dCBleHBpcmVzIGFsbCB0aGUgaWRsZSAoYW5kIG9uLWRlbWFuZCkKKyAgICogICAgICAgIGZhY2VzIHdpbGwgYmUgcmVtb3ZlZAorICAgKi8KKyAgdGltZTo6c2Vjb25kcyBtX2lkbGVGYWNlVGltZW91dDsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX1VEUF9DSEFOTkVMX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3VkcC1mYWNlLmNwcCBiL05GRC9kYWVtb24vZmFjZS91ZHAtZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlOTE1YwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS91ZHAtZmFjZS5jcHAKQEAgLTAsMCArMSwxMjcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ1ZHAtZmFjZS5ocHAiCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+IC8vIGZvciBJUF9NVFVfRElTQ09WRVIgYW5kIElQX1BNVFVESVNDX0RPTlQKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+IC8vIGZvciBzZXRzb2Nrb3B0KCkKKyNlbmRpZgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTkNMQVNTX1RFTVBMQVRFX1NQRUNJQUxJWkFUSU9OX0RFRklORShEYXRhZ3JhbUZhY2UsIFVkcEZhY2U6OnByb3RvY29sLCAiVWRwRmFjZSIpOworCitVZHBGYWNlOjpVZHBGYWNlKGNvbnN0IHNoYXJlZF9wdHI8VWRwRmFjZTo6cHJvdG9jb2w6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgYm9vbCBpc09uRGVtYW5kLAorICAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiBpZGxlVGltZW91dCkKKyAgOiBEYXRhZ3JhbUZhY2U8cHJvdG9jb2w+KEZhY2VVcmkoc29ja2V0LT5yZW1vdGVfZW5kcG9pbnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlVXJpKHNvY2tldC0+bG9jYWxfZW5kcG9pbnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQsIGlzT25EZW1hbmQpCisgICwgbV9pZGxlVGltZW91dChpZGxlVGltZW91dCkKKyAgLCBtX2xhc3RJZGxlQ2hlY2sodGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgLy8KKyAgLy8gQnkgZGVmYXVsdCwgTGludXggZG9lcyBwYXRoIE1UVSBkaXNjb3Zlcnkgb24gSVB2NCBzb2NrZXRzLAorICAvLyBhbmQgc2V0cyB0aGUgREYgKERvbid0IEZyYWdtZW50KSBmbGFnIG9uIGRhdGFncmFtcyBzbWFsbGVyCisgIC8vIHRoYW4gdGhlIGludGVyZmFjZSBNVFUuIEhvd2V2ZXIgdGhpcyBkb2VzIG5vdCB3b3JrIGZvciB1cywKKyAgLy8gYmVjYXVzZSB3ZSBjYW5ub3QgcHJvcGVybHkgcmVzcG9uZCB0byBJQ01QICJwYWNrZXQgdG9vIGJpZyIKKyAgLy8gbWVzc2FnZXMgYnkgZnJhZ21lbnRpbmcgdGhlIHBhY2tldCBhdCB0aGUgYXBwbGljYXRpb24gbGV2ZWwsCisgIC8vIHNpbmNlIHdlIHdhbnQgdG8gcmVseSBvbiBJUCBmb3IgZnJhZ21lbnRhdGlvbiBhbmQgcmVhc3NlbWJseS4KKyAgLy8KKyAgLy8gVGhlcmVmb3JlLCB3ZSBkaXNhYmxlIFBNVFUgZGlzY292ZXJ5LCB3aGljaCBwcmV2ZW50cyB0aGUga2VybmVsCisgIC8vIGZyb20gc2V0dGluZyB0aGUgREYgZmxhZyBvbiBvdXRnb2luZyBkYXRhZ3JhbXMsIGFuZCB0aHVzIGFsbG93cworICAvLyByb3V0ZXJzIGFsb25nIHRoZSBwYXRoIHRvIHBlcmZvcm0gZnJhZ21lbnRhdGlvbiBhcyBuZWVkZWQuCisgIC8vCisgIGNvbnN0IGludCB2YWx1ZSA9IElQX1BNVFVESVNDX0RPTlQ7CisgIGlmICg6OnNldHNvY2tvcHQoc29ja2V0LT5uYXRpdmVfaGFuZGxlKCksIElQUFJPVE9fSVAsCisgICAgICAgICAgICAgICAgICAgSVBfTVRVX0RJU0NPVkVSLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpIDwgMCkKKyAgICB7CisgICAgICBORkRfTE9HX1dBUk4oIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLHVyaToiIDw8IHRoaXMtPmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgICAgPDwgIl0gRmFpbGVkIHRvIGRpc2FibGUgcGF0aCBNVFUgZGlzY292ZXJ5Iik7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKGlzT25EZW1hbmQgJiYgbV9pZGxlVGltZW91dCA+IHRpbWU6OnNlY29uZHM6Onplcm8oKSkgeworICAgIG1fY2xvc2VJZklkbGVFdmVudCA9IHNjaGVkdWxlcjo6c2NoZWR1bGUobV9pZGxlVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlVkcEZhY2U6OmNsb3NlSWZJZGxlLCB0aGlzKSk7CisgIH0KK30KKworVWRwRmFjZTo6flVkcEZhY2UoKQoreworICBzY2hlZHVsZXI6OmNhbmNlbChtX2Nsb3NlSWZJZGxlRXZlbnQpOworfQorCituZG46Om5mZDo6RmFjZVN0YXR1cworVWRwRmFjZTo6Z2V0RmFjZVN0YXR1cygpIGNvbnN0Cit7CisgIG5kbjo6bmZkOjpGYWNlU3RhdHVzIHN0YXR1cyA9IEZhY2U6OmdldEZhY2VTdGF0dXMoKTsKKyAgaWYgKGlzT25EZW1hbmQoKSkgeworICAgIHRpbWU6Om1pbGxpc2Vjb25kcyBsZWZ0ID0gbV9pZGxlVGltZW91dCAtIHRpbWU6OmR1cmF0aW9uX2Nhc3Q8dGltZTo6bWlsbGlzZWNvbmRzPigKKyAgICAgIHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBtX2xhc3RJZGxlQ2hlY2spOworICAgIGlmIChsZWZ0IDwgdGltZTo6bWlsbGlzZWNvbmRzOjp6ZXJvKCkpCisgICAgICBsZWZ0ID0gdGltZTo6bWlsbGlzZWNvbmRzOjp6ZXJvKCk7CisKKyAgICBpZiAoaGFzQmVlblVzZWRSZWNlbnRseSgpKSB7CisgICAgICBzdGF0dXMuc2V0RXhwaXJhdGlvblBlcmlvZChsZWZ0ICsgbV9pZGxlVGltZW91dCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3RhdHVzLnNldEV4cGlyYXRpb25QZXJpb2QobGVmdCk7CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK1VkcEZhY2U6OmNsb3NlSWZJZGxlKCkKK3sKKyAgLy8gRmFjZSBjYW4gYmUgc3dpdGNoZWQgZnJvbSBvbi1kZW1hbmQgdG8gbm9uLW9uLWRlbWFuZCBtb2RlCisgIC8vIChub24tb24tZGVtYW5kIC0+IG9uLWRlbWFuZCB0cmFuc2l0aW9uIGlzIG5vdCBhbGxvd2VkKQorICBpZiAoaXNPbkRlbWFuZCgpKSB7CisgICAgaWYgKCFoYXNCZWVuVXNlZFJlY2VudGx5KCkpIHsKKyAgICAgIC8vIGZhY2UgaGFzIGJlZW4gaWRsZSBzaW5jZSB0aGUgbGFzdCB0aW1lIGNsb3NlSWZJZGxlCisgICAgICAvLyBoYXMgYmVlbiBjYWxsZWQuIEdvaW5nIHRvIGNsb3NlIGl0CisgICAgICBORkRfTE9HX0RFQlVHKCJGb3VuZCBpZGxlIGZhY2UgaWQ6ICIgPDwgZ2V0SWQoKSk7CisKKyAgICAgIE5GRF9MT0dfSU5GTygiW2lkOiIgPDwgdGhpcy0+Z2V0SWQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIsdXJpOiIgPDwgdGhpcy0+Z2V0UmVtb3RlVXJpKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiXSBJZGxlIGZvciBtb3JlIHRoYW4gIiA8PCBtX2lkbGVUaW1lb3V0IDw8ICIsIGNsb3NpbmciKTsKKyAgICAgIGNsb3NlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmVzZXRSZWNlbnRVc2FnZSgpOworCisgICAgICBtX2xhc3RJZGxlQ2hlY2sgPSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgbV9jbG9zZUlmSWRsZUV2ZW50ID0gc2NoZWR1bGVyOjpzY2hlZHVsZShtX2lkbGVUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZVZHBGYWNlOjpjbG9zZUlmSWRsZSwgdGhpcykpOworICAgIH0KKyAgfQorICAvLyBlbHNlIGRvIG5vdGhpbmcgYW5kIGRvIG5vdCByZXNjaGVkdWxlIHRoZSBldmVudAorfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS91ZHAtZmFjZS5ocHAgYi9ORkQvZGFlbW9uL2ZhY2UvdWRwLWZhY2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzM3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvdWRwLWZhY2UuaHBwCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX1VEUF9GQUNFX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfVURQX0ZBQ0VfSFBQCisKKyNpbmNsdWRlICJkYXRhZ3JhbS1mYWNlLmhwcCIKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCisvKioKKyAqIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBGYWNlIGFic3RyYWN0aW9uIHRoYXQgdXNlcyBVRFAKKyAqICAgICAgICBhcyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBtZWNoYW5pc20KKyAqLworY2xhc3MgVWRwRmFjZSA6IHB1YmxpYyBEYXRhZ3JhbUZhY2U8Ym9vc3Q6OmFzaW86OmlwOjp1ZHA+Cit7CitwdWJsaWM6CisgIFVkcEZhY2UoY29uc3Qgc2hhcmVkX3B0cjxwcm90b2NvbDo6c29ja2V0PiYgc29ja2V0LAorICAgICAgICAgIGJvb2wgaXNPbkRlbWFuZCwKKyAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiBpZGxlVGltZW91dCk7CisKKyAgdmlydHVhbAorICB+VWRwRmFjZSgpOworCisgIHZpcnR1YWwgbmRuOjpuZmQ6OkZhY2VTdGF0dXMKKyAgZ2V0RmFjZVN0YXR1cygpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkCisgIGNsb3NlSWZJZGxlKCk7CisKK3ByaXZhdGU6CisgIEV2ZW50SWQgbV9jbG9zZUlmSWRsZUV2ZW50OworICB0aW1lOjpzZWNvbmRzIG1faWRsZVRpbWVvdXQ7CisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IG1fbGFzdElkbGVDaGVjazsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX1VEUF9GQUNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3VkcC1mYWN0b3J5LmNwcCBiL05GRC9kYWVtb24vZmFjZS91ZHAtZmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4ZDRmYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS91ZHAtZmFjdG9yeS5jcHAKQEAgLTAsMCArMSwzNjEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ1ZHAtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAiY29yZS9nbG9iYWwtaW8uaHBwIgorI2luY2x1ZGUgImNvcmUvcmVzb2x2ZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvbmV0d29yay1pbnRlcmZhY2UuaHBwIgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBuZmQgeworCit1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmFzaW87CisKK05GRF9MT0dfSU5JVCgiVWRwRmFjdG9yeSIpOworCitzdGF0aWMgY29uc3QgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzX3Y0IEFMTF9WNF9FTkRQT0lOVCgKKyAgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMC4wLjAuMCIpKTsKKworc3RhdGljIGNvbnN0IGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzc192NiBBTExfVjZfRU5EUE9JTlQoCisgIGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjo6IikpOworCitVZHBGYWN0b3J5OjpVZHBGYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0UG9ydC8qID0gIjYzNjMiKi8pCisgIDogbV9kZWZhdWx0UG9ydChkZWZhdWx0UG9ydCkKK3sKK30KKwordm9pZAorVWRwRmFjdG9yeTo6cHJvaGliaXRFbmRwb2ludChjb25zdCB1ZHA6OkVuZHBvaW50JiBlbmRwb2ludCkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOjppcDsKKworICBjb25zdCBhZGRyZXNzJiBhZGRyZXNzID0gZW5kcG9pbnQuYWRkcmVzcygpOworCisgIGlmIChhZGRyZXNzLmlzX3Y0KCkgJiYgYWRkcmVzcyA9PSBBTExfVjRfRU5EUE9JTlQpCisgICAgeworICAgICAgcHJvaGliaXRBbGxJcHY0RW5kcG9pbnRzKGVuZHBvaW50LnBvcnQoKSk7CisgICAgfQorICBlbHNlIGlmIChlbmRwb2ludC5hZGRyZXNzKCkuaXNfdjYoKSAmJiBhZGRyZXNzID09IEFMTF9WNl9FTkRQT0lOVCkKKyAgICB7CisgICAgICBwcm9oaWJpdEFsbElwdjZFbmRwb2ludHMoZW5kcG9pbnQucG9ydCgpKTsKKyAgICB9CisKKyAgTkZEX0xPR19UUkFDRSgicHJvaGliaXRpbmcgVURQICIgPDwgZW5kcG9pbnQpOworCisgIG1fcHJvaGliaXRlZEVuZHBvaW50cy5pbnNlcnQoZW5kcG9pbnQpOworfQorCit2b2lkCitVZHBGYWN0b3J5Ojpwcm9oaWJpdEFsbElwdjRFbmRwb2ludHMoY29uc3QgdWludDE2X3QgcG9ydCkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOjppcDsKKworICBmb3IgKGNvbnN0IE5ldHdvcmtJbnRlcmZhY2VJbmZvJiBuaWMgOiBsaXN0TmV0d29ya0ludGVyZmFjZXMoKSkgeworICAgIGZvciAoY29uc3QgYWRkcmVzc192NCYgYWRkciA6IG5pYy5pcHY0QWRkcmVzc2VzKSB7CisgICAgICBpZiAoYWRkciAhPSBBTExfVjRfRU5EUE9JTlQpIHsKKyAgICAgICAgcHJvaGliaXRFbmRwb2ludCh1ZHA6OkVuZHBvaW50KGFkZHIsIHBvcnQpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmljLmlzQnJvYWRjYXN0Q2FwYWJsZSgpICYmIG5pYy5icm9hZGNhc3RBZGRyZXNzICE9IEFMTF9WNF9FTkRQT0lOVCkKKyAgICB7CisgICAgICBORkRfTE9HX1RSQUNFKCJwcm9oaWJpdGluZyBicm9hZGNhc3QgYWRkcmVzczogIiA8PCBuaWMuYnJvYWRjYXN0QWRkcmVzcy50b19zdHJpbmcoKSk7CisgICAgICBwcm9oaWJpdEVuZHBvaW50KHVkcDo6RW5kcG9pbnQobmljLmJyb2FkY2FzdEFkZHJlc3MsIHBvcnQpKTsKKyAgICB9CisgIH0KKworICBwcm9oaWJpdEVuZHBvaW50KHVkcDo6RW5kcG9pbnQoYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjI1NS4yNTUuMjU1LjI1NSIpLCBwb3J0KSk7Cit9CisKK3ZvaWQKK1VkcEZhY3Rvcnk6OnByb2hpYml0QWxsSXB2NkVuZHBvaW50cyhjb25zdCB1aW50MTZfdCBwb3J0KQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmFzaW86OmlwOworCisgIGZvciAoY29uc3QgTmV0d29ya0ludGVyZmFjZUluZm8mIG5pYyA6IGxpc3ROZXR3b3JrSW50ZXJmYWNlcygpKSB7CisgICAgZm9yIChjb25zdCBhZGRyZXNzX3Y2JiBhZGRyIDogbmljLmlwdjZBZGRyZXNzZXMpIHsKKyAgICAgIGlmIChhZGRyICE9IEFMTF9WNl9FTkRQT0lOVCkgeworICAgICAgICBwcm9oaWJpdEVuZHBvaW50KHVkcDo6RW5kcG9pbnQoYWRkciwgcG9ydCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzaGFyZWRfcHRyPFVkcENoYW5uZWw+CitVZHBGYWN0b3J5OjpjcmVhdGVDaGFubmVsKGNvbnN0IHVkcDo6RW5kcG9pbnQmIGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiB0aW1lb3V0KQoreworICBORkRfTE9HX0RFQlVHKCJDcmVhdGluZyB1bmljYXN0IGNoYW5uZWwgIiA8PCBlbmRwb2ludCk7CisKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsID0gZmluZENoYW5uZWwoZW5kcG9pbnQpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oY2hhbm5lbCkpCisgICAgcmV0dXJuIGNoYW5uZWw7CisKKyAgLy9jaGVja2luZyBpZiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIG11bHRpY2FzdCBmYWNlCisgIHNoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4gbXVsdGljYXN0ID0gZmluZE11bHRpY2FzdEZhY2UoZW5kcG9pbnQpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obXVsdGljYXN0KSkKKyAgICB0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIFVEUCB1bmljYXN0IGNoYW5uZWwsIGxvY2FsICIKKyAgICAgICAgICAgICAgICAiZW5kcG9pbnQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgZm9yIGEgVURQIG11bHRpY2FzdCBmYWNlIik7CisKKyAgaWYgKGVuZHBvaW50LmFkZHJlc3MoKS5pc19tdWx0aWNhc3QoKSkgeworICAgIHRocm93IEVycm9yKCJUaGlzIG1ldGhvZCBpcyBvbmx5IGZvciB1bmljYXN0IGNoYW5uZWwuIFRoZSBwcm92aWRlZCAiCisgICAgICAgICAgICAgICAgImVuZHBvaW50IGlzIG11bHRpY2FzdC4gVXNlIGNyZWF0ZU11bHRpY2FzdEZhY2UgdG8gIgorICAgICAgICAgICAgICAgICJjcmVhdGUgYSBtdWx0aWNhc3QgZmFjZSIpOworICB9CisKKyAgY2hhbm5lbCA9IG1ha2Vfc2hhcmVkPFVkcENoYW5uZWw+KGVuZHBvaW50LCB0aW1lb3V0KTsKKyAgbV9jaGFubmVsc1tlbmRwb2ludF0gPSBjaGFubmVsOworICBwcm9oaWJpdEVuZHBvaW50KGVuZHBvaW50KTsKKworICByZXR1cm4gY2hhbm5lbDsKK30KKworc2hhcmVkX3B0cjxVZHBDaGFubmVsPgorVWRwRmFjdG9yeTo6Y3JlYXRlQ2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgbG9jYWxIb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9jYWxQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiB0aW1lb3V0KQoreworICByZXR1cm4gY3JlYXRlQ2hhbm5lbChVZHBSZXNvbHZlcjo6c3luY1Jlc29sdmUobG9jYWxIb3N0LCBsb2NhbFBvcnQpLCB0aW1lb3V0KTsKK30KKworc2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlPgorVWRwRmFjdG9yeTo6Y3JlYXRlTXVsdGljYXN0RmFjZShjb25zdCB1ZHA6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1ZHA6OkVuZHBvaW50JiBtdWx0aWNhc3RFbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5ldHdvcmtJbnRlcmZhY2VOYW1lIC8qICIiICovKQoreworICAvL2NoZWNraW5nIGlmIHRoZSBsb2NhbCBhbmQgbXVsdGljYXN0IGVuZHBvaW50IGFyZSBhbHJlYWR5IGluIHVzZSBmb3IgYSBtdWx0aWNhc3QgZmFjZQorICBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+IG11bHRpY2FzdEZhY2UgPSBmaW5kTXVsdGljYXN0RmFjZShsb2NhbEVuZHBvaW50KTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KG11bHRpY2FzdEZhY2UpKSB7CisgICAgaWYgKG11bHRpY2FzdEZhY2UtPmdldE11bHRpY2FzdEdyb3VwKCkgPT0gbXVsdGljYXN0RW5kcG9pbnQpCisgICAgICByZXR1cm4gbXVsdGljYXN0RmFjZTsKKyAgICBlbHNlCisgICAgICB0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIFVEUCBtdWx0aWNhc3QgZmFjZSwgbG9jYWwgIgorICAgICAgICAgICAgICAgICAgImVuZHBvaW50IGlzIGFscmVhZHkgYWxsb2NhdGVkIGZvciBhIFVEUCBtdWx0aWNhc3QgZmFjZSAiCisgICAgICAgICAgICAgICAgICAib24gYSBkaWZmZXJlbnQgbXVsdGljYXN0IGdyb3VwIik7CisgIH0KKworICAvL2NoZWNraW5nIGlmIHRoZSBsb2NhbCBlbmRwb2ludCBpcyBhbHJlYWR5IGluIHVzZSBmb3IgYW4gdW5pY2FzdCBjaGFubmVsCisgIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gdW5pY2FzdCA9IGZpbmRDaGFubmVsKGxvY2FsRW5kcG9pbnQpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4odW5pY2FzdCkpIHsKKyAgICB0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIFVEUCBtdWx0aWNhc3QgZmFjZSwgbG9jYWwgIgorICAgICAgICAgICAgICAgICJlbmRwb2ludCBpcyBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgYSBVRFAgdW5pY2FzdCBjaGFubmVsIik7CisgIH0KKworICBpZiAobV9wcm9oaWJpdGVkRW5kcG9pbnRzLmZpbmQobXVsdGljYXN0RW5kcG9pbnQpICE9IG1fcHJvaGliaXRlZEVuZHBvaW50cy5lbmQoKSkgeworICAgIHRocm93IEVycm9yKCJDYW5ub3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgVURQIG11bHRpY2FzdCBmYWNlLCAiCisgICAgICAgICAgICAgICAgInJlbW90ZSBlbmRwb2ludCBpcyBvd25lZCBieSB0aGlzIE5GRCBpbnN0YW5jZSIpOworICB9CisKKyAgaWYgKGxvY2FsRW5kcG9pbnQuYWRkcmVzcygpLmlzX3Y2KCkgfHwgbXVsdGljYXN0RW5kcG9pbnQuYWRkcmVzcygpLmlzX3Y2KCkpIHsKKyAgICB0aHJvdyBFcnJvcigiSVB2NiBtdWx0aWNhc3QgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFBsZWFzZSBwcm92aWRlIGFuIElQdjQgYWRkcmVzcyIpOworICB9CisKKyAgaWYgKGxvY2FsRW5kcG9pbnQucG9ydCgpICE9IG11bHRpY2FzdEVuZHBvaW50LnBvcnQoKSkgeworICAgIHRocm93IEVycm9yKCJDYW5ub3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgVURQIG11bHRpY2FzdCBmYWNlLCAiCisgICAgICAgICAgICAgICAgImJvdGggZW5kcG9pbnRzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHBvcnQgbnVtYmVyLiAiKTsKKyAgfQorCisgIGlmICghbXVsdGljYXN0RW5kcG9pbnQuYWRkcmVzcygpLmlzX211bHRpY2FzdCgpKSB7CisgICAgdGhyb3cgRXJyb3IoIkNhbm5vdCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBVRFAgbXVsdGljYXN0IGZhY2UsICIKKyAgICAgICAgICAgICAgICAidGhlIG11bHRpY2FzdCBncm91cCBnaXZlbiBhcyBpbnB1dCBpcyBub3QgYSBtdWx0aWNhc3QgYWRkcmVzcyIpOworICB9CisKKyAgc2hhcmVkX3B0cjxpcDo6dWRwOjpzb2NrZXQ+IHJlY2VpdmVTb2NrZXQgPQorICAgIG1ha2Vfc2hhcmVkPGlwOjp1ZHA6OnNvY2tldD4ocmVmKGdldEdsb2JhbElvU2VydmljZSgpKSk7CisKKyAgc2hhcmVkX3B0cjxpcDo6dWRwOjpzb2NrZXQ+IHNlbmRTb2NrZXQgPQorICAgIG1ha2Vfc2hhcmVkPGlwOjp1ZHA6OnNvY2tldD4ocmVmKGdldEdsb2JhbElvU2VydmljZSgpKSk7CisKKyAgcmVjZWl2ZVNvY2tldC0+b3BlbihtdWx0aWNhc3RFbmRwb2ludC5wcm90b2NvbCgpKTsKKyAgcmVjZWl2ZVNvY2tldC0+c2V0X29wdGlvbihpcDo6dWRwOjpzb2NrZXQ6OnJldXNlX2FkZHJlc3ModHJ1ZSkpOworCisgIHNlbmRTb2NrZXQtPm9wZW4obXVsdGljYXN0RW5kcG9pbnQucHJvdG9jb2woKSk7CisgIHNlbmRTb2NrZXQtPnNldF9vcHRpb24oaXA6OnVkcDo6c29ja2V0OjpyZXVzZV9hZGRyZXNzKHRydWUpKTsKKyAgc2VuZFNvY2tldC0+c2V0X29wdGlvbihpcDo6bXVsdGljYXN0OjplbmFibGVfbG9vcGJhY2soZmFsc2UpKTsKKworICB0cnkgeworICAgIHNlbmRTb2NrZXQtPmJpbmQodWRwOjpFbmRwb2ludChpcDo6YWRkcmVzc192NDo6YW55KCksIG11bHRpY2FzdEVuZHBvaW50LnBvcnQoKSkpOworICAgIHJlY2VpdmVTb2NrZXQtPmJpbmQobXVsdGljYXN0RW5kcG9pbnQpOworCisgICAgaWYgKGxvY2FsRW5kcG9pbnQuYWRkcmVzcygpICE9IGlwOjphZGRyZXNzOjpmcm9tX3N0cmluZygiMC4wLjAuMCIpKSB7CisgICAgICBzZW5kU29ja2V0LT5zZXRfb3B0aW9uKGlwOjptdWx0aWNhc3Q6Om91dGJvdW5kX2ludGVyZmFjZShsb2NhbEVuZHBvaW50LmFkZHJlc3MoKS50b192NCgpKSk7CisgICAgfQorICAgIHNlbmRTb2NrZXQtPnNldF9vcHRpb24oaXA6Om11bHRpY2FzdDo6am9pbl9ncm91cChtdWx0aWNhc3RFbmRwb2ludC5hZGRyZXNzKCkudG9fdjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFbmRwb2ludC5hZGRyZXNzKCkudG9fdjQoKSkpOworCisgICAgcmVjZWl2ZVNvY2tldC0+c2V0X29wdGlvbihpcDo6bXVsdGljYXN0Ojpqb2luX2dyb3VwKG11bHRpY2FzdEVuZHBvaW50LmFkZHJlc3MoKS50b192NCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEVuZHBvaW50LmFkZHJlc3MoKS50b192NCgpKSk7CisgIH0KKyAgY2F0Y2ggKGJvb3N0OjpzeXN0ZW06OnN5c3RlbV9lcnJvciYgZSkgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG1zZzsKKyAgICBtc2cgPDwgIkZhaWxlZCB0byBwcm9wZXJseSBjb25maWd1cmUgdGhlIHNvY2tldCwgY2hlY2sgdGhlIGFkZHJlc3MgKCIgPDwgZS53aGF0KCkgPDwgIikiOworICAgIHRocm93IEVycm9yKG1zZy5zdHIoKSk7CisgIH0KKworI2lmIGRlZmluZWQoX19saW51eF9fKQorICAvL09uIGxpbnV4IHN5c3RlbSwgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgTXVsdGljYXN0VWRwRmFjZSBmb3IgdGhlIHNhbWUgbXVsdGljYXN0IGdyb3VwIGJ1dAorICAvL2JvdW5kIG9uIGRpZmZlcmVudCBuZXR3b3JrIGludGVyZmFjZXMsIHRoZSBzb2NrZXQgaGFzIHRvIGJlIGJvdW5kIHdpdGggdGhlIHNwZWNpZmljIGludGVyZmFjZQorICAvL3VzaW5nIFNPX0JJTkRUT0RFVklDRSwgb3RoZXJ3aXNlIHRoZSBmYWNlIHdpbGwgcmVjZWl2ZSBwYWNrZXRzIGFsc28gZnJvbSBvdGhlciBpbnRlcmZhY2VzLgorICAvL1dpdGhvdXQgU09fQklORFRPREVWSUNFIGV2ZXJ5IE11bHRpY2FzdFVkcEZhY2UgdGhhdCBoYXZlIGpvaW5lZCB0aGUgc2FtZSBtdWx0aWNhc3QgZ3JvdXAKKyAgLy9vbiBkaWZmZXJlbnQgaW50ZXJmYWNlcyB3aWxsIHJlY2VpdmUgdGhlIHNhbWUgcGFja2V0LgorICAvL1RoaXMgYXBwbGllcyBvbmx5IG9uIGxpbnV4LCBmb3IgT1MgWCB0aGUgaXA6Om11bHRpY2FzdDo6am9pbl9ncm91cCBpcyBlbm91Z2ggdG8gZ2V0CisgIC8vdGhlIGRlc2lyZWQgYmVoYXZpb3VyCisgIGlmICghbmV0d29ya0ludGVyZmFjZU5hbWUuZW1wdHkoKSkgeworICAgIGlmICg6OnNldHNvY2tvcHQocmVjZWl2ZVNvY2tldC0+bmF0aXZlX2hhbmRsZSgpLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlTmFtZS5jX3N0cigpLCBuZXR3b3JrSW50ZXJmYWNlTmFtZS5zaXplKCkrMSkgPT0gLTEpeworICAgICAgdGhyb3cgRXJyb3IoIkNhbm5vdCBiaW5kIG11bHRpY2FzdCBmYWNlIHRvICIgKyBuZXR3b3JrSW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICAgKyAiIG1ha2Ugc3VyZSB5b3UgaGF2ZSBDQVBfTkVUX1JBVyBjYXBhYmlsaXR5IiApOworICAgIH0KKyAgfQorCisjZW5kaWYKKworICBtdWx0aWNhc3RGYWNlID0gbWFrZV9zaGFyZWQ8TXVsdGljYXN0VWRwRmFjZT4ocmVjZWl2ZVNvY2tldCwgc2VuZFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRW5kcG9pbnQsIG11bHRpY2FzdEVuZHBvaW50KTsKKyAgbXVsdGljYXN0RmFjZS0+b25GYWlsICs9IGJpbmQoJlVkcEZhY3Rvcnk6OmFmdGVyRmFjZUZhaWxlZCwgdGhpcywgbG9jYWxFbmRwb2ludCk7CisKKyAgbV9tdWx0aWNhc3RGYWNlc1tsb2NhbEVuZHBvaW50XSA9IG11bHRpY2FzdEZhY2U7CisKKyAgcmV0dXJuIG11bHRpY2FzdEZhY2U7Cit9CisKK3NoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4KK1VkcEZhY3Rvcnk6OmNyZWF0ZU11bHRpY2FzdEZhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGxvY2FsSXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtdWx0aWNhc3RJcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG11bHRpY2FzdFBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXR3b3JrSW50ZXJmYWNlTmFtZSAvKiAiIiAqLykKK3sKKworICByZXR1cm4gY3JlYXRlTXVsdGljYXN0RmFjZShVZHBSZXNvbHZlcjo6c3luY1Jlc29sdmUobG9jYWxJcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdFBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVZHBSZXNvbHZlcjo6c3luY1Jlc29sdmUobXVsdGljYXN0SXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3RQb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZU5hbWUpOworfQorCit2b2lkCitVZHBGYWN0b3J5OjpjcmVhdGVGYWNlKGNvbnN0IEZhY2VVcmkmIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpCit7CisgIHJlc29sdmVyOjpBZGRyZXNzU2VsZWN0b3IgYWRkcmVzc1NlbGVjdG9yID0gcmVzb2x2ZXI6OkFueUFkZHJlc3MoKTsKKyAgaWYgKHVyaS5nZXRTY2hlbWUoKSA9PSAidWRwNCIpCisgICAgYWRkcmVzc1NlbGVjdG9yID0gcmVzb2x2ZXI6OklwdjRBZGRyZXNzKCk7CisgIGVsc2UgaWYgKHVyaS5nZXRTY2hlbWUoKSA9PSAidWRwNiIpCisgICAgYWRkcmVzc1NlbGVjdG9yID0gcmVzb2x2ZXI6OklwdjZBZGRyZXNzKCk7CisKKyAgaWYgKCF1cmkuZ2V0UGF0aCgpLmVtcHR5KCkgJiYgdXJpLmdldFBhdGgoKSAhPSAiLyIpCisgICAgeworICAgICAgb25Db25uZWN0RmFpbGVkKCJJbnZhbGlkIFVSSSIpOworICAgIH0KKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKHVyaS5nZXRIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmdldFBvcnQoKS5lbXB0eSgpID8gbV9kZWZhdWx0UG9ydCA6IHVyaS5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVWRwRmFjdG9yeTo6Y29udGludWVDcmVhdGVGYWNlQWZ0ZXJSZXNvbHZlLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ3JlYXRlZCwgb25Db25uZWN0RmFpbGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3RGYWlsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1NlbGVjdG9yKTsKKworfQorCit2b2lkCitVZHBGYWN0b3J5Ojpjb250aW51ZUNyZWF0ZUZhY2VBZnRlclJlc29sdmUoY29uc3QgdWRwOjpFbmRwb2ludCYgZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCkKK3sKKyAgaWYgKGVuZHBvaW50LmFkZHJlc3MoKS5pc19tdWx0aWNhc3QoKSkgeworICAgIG9uQ29ubmVjdEZhaWxlZCgiVGhlIHByb3ZpZGVkIGFkZHJlc3MgaXMgbXVsdGljYXN0LiBQbGVhc2UgdXNlIGNyZWF0ZU11bHRpY2FzdEZhY2UgbWV0aG9kIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1fcHJvaGliaXRlZEVuZHBvaW50cy5maW5kKGVuZHBvaW50KSAhPSBtX3Byb2hpYml0ZWRFbmRwb2ludHMuZW5kKCkpCisgICAgeworICAgICAgb25Db25uZWN0RmFpbGVkKCJSZXF1ZXN0ZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgIihyZXNlcnZlZCBieSB0aGlzIE5GRCBvciBkaXNhbGxvd2VkIGJ5IGZhY2UgbWFuYWdlbWVudCBwcm90b2NvbCkiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLy8gdmVyeSBzaW1wbGUgbG9naWMgZm9yIG5vdworCisgIGZvciAoQ2hhbm5lbE1hcDo6aXRlcmF0b3IgY2hhbm5lbCA9IG1fY2hhbm5lbHMuYmVnaW4oKTsKKyAgICAgICBjaGFubmVsICE9IG1fY2hhbm5lbHMuZW5kKCk7CisgICAgICAgKytjaGFubmVsKQorICB7CisgICAgaWYgKChjaGFubmVsLT5maXJzdC5hZGRyZXNzKCkuaXNfdjQoKSAmJiBlbmRwb2ludC5hZGRyZXNzKCkuaXNfdjQoKSkgfHwKKyAgICAgICAgKGNoYW5uZWwtPmZpcnN0LmFkZHJlc3MoKS5pc192NigpICYmIGVuZHBvaW50LmFkZHJlc3MoKS5pc192NigpKSkKKyAgICB7CisgICAgICBjaGFubmVsLT5zZWNvbmQtPmNvbm5lY3QoZW5kcG9pbnQsIG9uQ3JlYXRlZCwgb25Db25uZWN0RmFpbGVkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgb25Db25uZWN0RmFpbGVkKCJObyBjaGFubmVscyBhdmFpbGFibGUgdG8gY29ubmVjdCB0byAiICsKKyAgICAgICAgICAgICAgICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVuZHBvaW50KSk7Cit9CisKK3NoYXJlZF9wdHI8VWRwQ2hhbm5lbD4KK1VkcEZhY3Rvcnk6OmZpbmRDaGFubmVsKGNvbnN0IHVkcDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpCit7CisgIENoYW5uZWxNYXA6Oml0ZXJhdG9yIGkgPSBtX2NoYW5uZWxzLmZpbmQobG9jYWxFbmRwb2ludCk7CisgIGlmIChpICE9IG1fY2hhbm5lbHMuZW5kKCkpCisgICAgcmV0dXJuIGktPnNlY29uZDsKKyAgZWxzZQorICAgIHJldHVybiBzaGFyZWRfcHRyPFVkcENoYW5uZWw+KCk7Cit9CisKK3NoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4KK1VkcEZhY3Rvcnk6OmZpbmRNdWx0aWNhc3RGYWNlKGNvbnN0IHVkcDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpCit7CisgIE11bHRpY2FzdEZhY2VNYXA6Oml0ZXJhdG9yIGkgPSBtX211bHRpY2FzdEZhY2VzLmZpbmQobG9jYWxFbmRwb2ludCk7CisgIGlmIChpICE9IG1fbXVsdGljYXN0RmFjZXMuZW5kKCkpCisgICAgcmV0dXJuIGktPnNlY29uZDsKKyAgZWxzZQorICAgIHJldHVybiBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+KCk7Cit9CisKK3ZvaWQKK1VkcEZhY3Rvcnk6OmFmdGVyRmFjZUZhaWxlZCh1ZHA6OkVuZHBvaW50JiBlbmRwb2ludCkKK3sKKyAgTkZEX0xPR19ERUJVRygiYWZ0ZXJGYWNlRmFpbGVkOiAiIDw8IGVuZHBvaW50KTsKKyAgbV9tdWx0aWNhc3RGYWNlcy5lcmFzZShlbmRwb2ludCk7Cit9CisKK3N0ZDo6bGlzdDxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID4KK1VkcEZhY3Rvcnk6OmdldENoYW5uZWxzKCkgY29uc3QKK3sKKyAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPiBjaGFubmVsczsKKyAgZm9yIChDaGFubmVsTWFwOjpjb25zdF9pdGVyYXRvciBpID0gbV9jaGFubmVscy5iZWdpbigpOyBpICE9IG1fY2hhbm5lbHMuZW5kKCk7ICsraSkKKyAgICB7CisgICAgICBjaGFubmVscy5wdXNoX2JhY2soaS0+c2Vjb25kKTsKKyAgICB9CisKKyAgcmV0dXJuIGNoYW5uZWxzOworfQorCisKKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2UvdWRwLWZhY3RvcnkuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL3VkcC1mYWN0b3J5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdmN2RlCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3VkcC1mYWN0b3J5LmhwcApAQCAtMCwwICsxLDIyNSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfVURQX0ZBQ1RPUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9VRFBfRkFDVE9SWV9IUFAKKworI2luY2x1ZGUgInByb3RvY29sLWZhY3RvcnkuaHBwIgorI2luY2x1ZGUgInVkcC1jaGFubmVsLmhwcCIKKyNpbmNsdWRlICJtdWx0aWNhc3QtdWRwLWZhY2UuaHBwIgorCisKK25hbWVzcGFjZSBuZmQgeworCisvLyBAdG9kbyBUaGUgbXVsdGljYXN0IHN1cHBvcnQgZm9yIGlwdjYgbXVzdCBiZSBpbXBsZW1lbnRlZAorCitjbGFzcyBVZHBGYWN0b3J5IDogcHVibGljIFByb3RvY29sRmFjdG9yeQoreworcHVibGljOgorICAvKioKKyAgICogXGJyaWVmIEV4Y2VwdGlvbiBvZiBVZHBGYWN0b3J5CisgICAqLworICBjbGFzcyBFcnJvciA6IHB1YmxpYyBQcm90b2NvbEZhY3Rvcnk6OkVycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IFByb3RvY29sRmFjdG9yeTo6RXJyb3Iod2hhdCkKKyAgICB7CisgICAgfQorICB9OworCisgIHR5cGVkZWYgc3RkOjptYXA8IHVkcDo6RW5kcG9pbnQsIHNoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4gPiBNdWx0aWNhc3RGYWNlTWFwOworCisgIGV4cGxpY2l0CisgIFVkcEZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRQb3J0ID0gIjYzNjMiKTsKKworICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBVRFAtYmFzZWQgY2hhbm5lbCB1c2luZyB1ZHA6OkVuZHBvaW50CisgICAqCisgICAqIHVkcDo6RW5kcG9pbnQgaXMgcmVhbGx5IGFuIGFsaWFzIGZvciBib29zdDo6YXNpbzo6aXA6OnVkcDo6ZW5kcG9pbnQuCisgICAqCisgICAqIElmIHRoaXMgbWV0aG9kIGNhbGxlZCB0d2ljZSB3aXRoIHRoZSBzYW1lIGVuZHBvaW50LCBvbmx5IG9uZSBjaGFubmVsCisgICAqIHdpbGwgYmUgY3JlYXRlZC4gIFRoZSBzZWNvbmQgY2FsbCB3aWxsIGp1c3QgcmV0cmlldmUgdGhlIGV4aXN0aW5nCisgICAqIGNoYW5uZWwuCisgICAqCisgICAqIElmIGEgbXVsdGljYXN0IGZhY2UgaXMgYWxyZWFkeSBhY3RpdmUgb24gdGhlIHNhbWUgbG9jYWwgZW5kcG9pbnQsCisgICAqIHRoZSBjcmVhdGlvbiBmYWlscyBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bgorICAgKgorICAgKiBPbmNlIGEgZmFjZSBpcyBjcmVhdGVkLCBpZiBpdCBkb2Vzbid0IHNlbmQvcmVjZWl2ZSBhbnl0aGluZyBmb3IKKyAgICogYSBwZXJpb2Qgb2YgdGltZSBlcXVhbCB0byB0aW1lb3V0LCBpdCB3aWxsIGJlIGRlc3Ryb3llZAorICAgKiBAdG9kbyB0aGlzIGZ1bmNpb25hbGl0eSBoYXMgdG8gYmUgaW1wbGVtZW50ZWQKKyAgICoKKyAgICogXHJldHVybnMgYWx3YXlzIGEgdmFsaWQgcG9pbnRlciB0byBhIFVkcENoYW5uZWwgb2JqZWN0LCBhbiBleGNlcHRpb24KKyAgICogICAgICAgICAgaXMgdGhyb3duIGlmIGl0IGNhbm5vdCBiZSBjcmVhdGVkLgorICAgKgorICAgKiBcdGhyb3dzIFVkcEZhY3Rvcnk6OkVycm9yCisgICAqCisgICAqIFxzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvMV80Ml8wL2RvYy9odG1sL2Jvb3N0X2FzaW8vcmVmZXJlbmNlL2lwX191ZHAvZW5kcG9pbnQuaHRtbAorICAgKiAgICAgIGZvciBkZXRhaWxzIG9uIHdheXMgdG8gY3JlYXRlIHVkcDo6RW5kcG9pbnQKKyAgICovCisgIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4KKyAgY3JlYXRlQ2hhbm5lbChjb25zdCB1ZHA6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHRpbWU6OnNlY29uZHMmIHRpbWVvdXQgPSB0aW1lOjpzZWNvbmRzKDYwMCkpOworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIFVEUC1iYXNlZCBjaGFubmVsIHVzaW5nIHNwZWNpZmllZCBob3N0IGFuZCBwb3J0IG51bWJlcgorICAgKgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgcHJvdmlkZWQgaG9zdCBhbmQgcG9ydCBudW1iZXJzCisgICAqIGFuZCB3aWxsIHRocm93IFVkcEZhY3Rvcnk6OkVycm9yIHdoZW4gY2hhbm5lbCBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICoKKyAgICogTm90ZSB0aGF0IHRoaXMgY2FsbCB3aWxsICoqQkxPQ0sqKiB1bnRpbCByZXNvbHV0aW9uIGlzIGRvbmUgb3IgZmFpbGVkLgorICAgKgorICAgKiBJZiBsb2NhbEhvc3QgaXMgYSBJUHY2IGFkZHJlc3Mgb2YgYSBzcGVjaWZpYyBkZXZpY2UsIGl0IG11c3QgYmUgaW4gdGhlIGZvcm06CisgICAqIGlwIGFkZHJlc3MlaW50ZXJmYWNlIG5hbWUKKyAgICogRXhhbXBsZTogZmU4MDo6NWU5Njo5ZGZmOmZlN2Q6OWM4ZCVlbjEKKyAgICogT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSA6OgorICAgKgorICAgKiBcdGhyb3dzIFVkcENoYW5uZWw6OkVycm9yIGlmIHRoZSBiaW5kIG9uIHRoZSBzb2NrZXQgZmFpbHMKKyAgICogXHRocm93cyBVZHBGYWN0b3J5OjpFcnJvcgorICAgKi8KKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPgorICBjcmVhdGVDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhbEhvc3QsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvY2FsUG9ydCwKKyAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjpzZWNvbmRzJiB0aW1lb3V0ID0gdGltZTo6c2Vjb25kcyg2MDApKTsKKworICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBNdWx0aWNhc3RVZHBGYWNlIHVzaW5nIHVkcDo6RW5kcG9pbnQKKyAgICoKKyAgICogdWRwOjpFbmRwb2ludCBpcyByZWFsbHkgYW4gYWxpYXMgZm9yIGJvb3N0Ojphc2lvOjppcDo6dWRwOjplbmRwb2ludC4KKyAgICoKKyAgICogVGhlIGZhY2Ugd2lsbCBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAKKyAgICoKKyAgICogSWYgdGhpcyBtZXRob2QgY2FsbGVkIHR3aWNlIHdpdGggdGhlIHNhbWUgZW5kcG9pbnQgYW5kIGdyb3VwLCBvbmx5IG9uZSBmYWNlCisgICAqIHdpbGwgYmUgY3JlYXRlZC4gIFRoZSBzZWNvbmQgY2FsbCB3aWxsIGp1c3QgcmV0cmlldmUgdGhlIGV4aXN0aW5nCisgICAqIGNoYW5uZWwuCisgICAqCisgICAqIElmIGFuIHVuaWNhc3QgZmFjZSBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGUgc2FtZSBsb2NhbCBOSUMgYW5kIHBvcnQsIHRoZQorICAgKiBjcmVhdGlvbiBmYWlscyBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bgorICAgKgorICAgKiBccGFyYW0gbmV0d29ya0ludGVyZmFjZU5hbWUgbmFtZSBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGZhY2Ugd2lsbCBiZSBib3VuZAorICAgKiAgICAgICAgKFVzZWQgb25seSBvbiBtdWx0aWhvbWVkIGxpbnV4IG1hY2hpbmUgd2l0aCBtb3JlIHRoYW4gb25lIE11bHRpY2FzdFVkcEZhY2UgZm9yCisgICAqICAgICAgICB0aGUgc2FtZSBtdWx0aWNhc3QgZ3JvdXAuIElmIHNwZWNpZmllZCwgd2lsbCByZXF1aXJlcyBDQVBfTkVUX1JBVyBjYXBhYmlsaXR5KQorICAgKiAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGNhbiBiZSBwcm92aWRlZCBpbiBvdGhlciBzeXN0ZW0gb3IgaW4gbGludXggbWFjaGluZSB3aXRoIG9ubHkgb25lCisgICAqICAgICAgICBNdWx0aWNhc3RVZHBGYWNlIHBlciBtdWx0aWNhc3QgZ3JvdXAKKyAgICoKKyAgICoKKyAgICogXHJldHVybnMgYWx3YXlzIGEgdmFsaWQgcG9pbnRlciB0byBhIE11bHRpY2FzdFVkcEZhY2Ugb2JqZWN0LCBhbiBleGNlcHRpb24KKyAgICogICAgICAgICAgaXMgdGhyb3duIGlmIGl0IGNhbm5vdCBiZSBjcmVhdGVkLgorICAgKgorICAgKiBcdGhyb3dzIFVkcEZhY3Rvcnk6OkVycm9yCisgICAqCisgICAqIFxzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvMV80Ml8wL2RvYy9odG1sL2Jvb3N0X2FzaW8vcmVmZXJlbmNlL2lwX191ZHAvZW5kcG9pbnQuaHRtbAorICAgKiAgICAgIGZvciBkZXRhaWxzIG9uIHdheXMgdG8gY3JlYXRlIHVkcDo6RW5kcG9pbnQKKyAgICovCisgIHNoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4KKyAgY3JlYXRlTXVsdGljYXN0RmFjZShjb25zdCB1ZHA6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVkcDo6RW5kcG9pbnQmIG11bHRpY2FzdEVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXR3b3JrSW50ZXJmYWNlTmFtZSA9ICIiKTsKKworICBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+CisgIGNyZWF0ZU11bHRpY2FzdEZhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGxvY2FsSXAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG11bHRpY2FzdElwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtdWx0aWNhc3RQb3J0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXR3b3JrSW50ZXJmYWNlTmFtZSA9ICIiKTsKKworICAvLyBmcm9tIEZhY3RvcnkKKyAgdmlydHVhbCB2b2lkCisgIGNyZWF0ZUZhY2UoY29uc3QgRmFjZVVyaSYgdXJpLAorICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uQ3JlYXRlZCwKKyAgICAgICAgICAgICBjb25zdCBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpOworCisgIHZpcnR1YWwgc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPgorICBnZXRDaGFubmVscygpIGNvbnN0OworCisgIC8qKgorICAgKiBcYnJpZWYgR2V0IG1hcCBvZiBjb25maWd1cmVkIG11bHRpY2FzdCBmYWNlcworICAgKi8KKyAgY29uc3QgTXVsdGljYXN0RmFjZU1hcCYKKyAgZ2V0TXVsdGljYXN0RmFjZXMoKSBjb25zdDsKKworUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFOgorCisgIHZvaWQKKyAgcHJvaGliaXRFbmRwb2ludChjb25zdCB1ZHA6OkVuZHBvaW50JiBlbmRwb2ludCk7CisKKyAgdm9pZAorICBwcm9oaWJpdEFsbElwdjRFbmRwb2ludHMoY29uc3QgdWludDE2X3QgcG9ydCk7CisKKyAgdm9pZAorICBwcm9oaWJpdEFsbElwdjZFbmRwb2ludHMoY29uc3QgdWludDE2X3QgcG9ydCk7CisKKyAgdm9pZAorICBhZnRlckZhY2VGYWlsZWQodWRwOjpFbmRwb2ludCYgZW5kcG9pbnQpOworCisgIC8qKgorICAgKiBcYnJpZWYgTG9vayB1cCBVZHBDaGFubmVsIHVzaW5nIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludAorICAgKgorICAgKiBccmV0dXJucyBzaGFyZWQgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgVWRwQ2hhbm5lbCBvYmplY3QKKyAgICogICAgICAgICAgb3IgZW1wdHkgc2hhcmVkIHBvaW50ZXIgd2hlbiBzdWNoIGNoYW5uZWwgZG9lcyBub3QgZXhpc3QKKyAgICoKKyAgICogXHRocm93cyBuZXZlcgorICAgKi8KKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPgorICBmaW5kQ2hhbm5lbChjb25zdCB1ZHA6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50KTsKKworCisgIC8qKgorICAgKiBcYnJpZWYgTG9vayB1cCBtdWx0aWNhc3QgVWRwRmFjZSB1c2luZyBzcGVjaWZpZWQgbG9jYWwgZW5kcG9pbnQKKyAgICoKKyAgICogXHJldHVybnMgc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIG11bHRpY2FzdCBNdWx0aWNhc3RVZHBGYWNlIG9iamVjdAorICAgKiAgICAgICAgICBvciBlbXB0eSBzaGFyZWQgcG9pbnRlciB3aGVuIHN1Y2ggZmFjZSBkb2VzIG5vdCBleGlzdAorICAgKgorICAgKiBcdGhyb3dzIG5ldmVyCisgICAqLworICBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+CisgIGZpbmRNdWx0aWNhc3RGYWNlKGNvbnN0IHVkcDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpOworCisgIHZvaWQKKyAgY29udGludWVDcmVhdGVGYWNlQWZ0ZXJSZXNvbHZlKGNvbnN0IHVkcDo6RW5kcG9pbnQmIGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKTsKKworUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFOgorICB0eXBlZGVmIHN0ZDo6bWFwPCB1ZHA6OkVuZHBvaW50LCBzaGFyZWRfcHRyPFVkcENoYW5uZWw+ID4gQ2hhbm5lbE1hcDsKKworICBDaGFubmVsTWFwIG1fY2hhbm5lbHM7CisgIE11bHRpY2FzdEZhY2VNYXAgbV9tdWx0aWNhc3RGYWNlczsKKworICBzdGQ6OnN0cmluZyBtX2RlZmF1bHRQb3J0OworICBzdGQ6OnNldDx1ZHA6OkVuZHBvaW50PiBtX3Byb2hpYml0ZWRFbmRwb2ludHM7Cit9OworCisKK2lubGluZSBjb25zdCBVZHBGYWN0b3J5OjpNdWx0aWNhc3RGYWNlTWFwJgorVWRwRmFjdG9yeTo6Z2V0TXVsdGljYXN0RmFjZXMoKSBjb25zdAoreworICByZXR1cm4gbV9tdWx0aWNhc3RGYWNlczsKK30KKworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9VRFBfRkFDVE9SWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1jaGFubmVsLmNwcCBiL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1jaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRmMzMzCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWNoYW5uZWwuY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAidW5peC1zdHJlYW0tY2hhbm5lbC5ocHAiCisjaW5jbHVkZSAiY29yZS9nbG9iYWwtaW8uaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4gLy8gZm9yIGNobW9kKCkKKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiVW5peFN0cmVhbUNoYW5uZWwiKTsKKwordXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOjpsb2NhbDsKKworVW5peFN0cmVhbUNoYW5uZWw6OlVuaXhTdHJlYW1DaGFubmVsKGNvbnN0IHVuaXhfc3RyZWFtOjpFbmRwb2ludCYgZW5kcG9pbnQpCisgIDogbV9lbmRwb2ludChlbmRwb2ludCkKKyAgLCBtX2lzTGlzdGVuaW5nKGZhbHNlKQoreworICBzZXRVcmkoRmFjZVVyaShlbmRwb2ludCkpOworfQorCitVbml4U3RyZWFtQ2hhbm5lbDo6flVuaXhTdHJlYW1DaGFubmVsKCkKK3sKKyAgaWYgKG1faXNMaXN0ZW5pbmcpCisgICAgeworICAgICAgLy8gdXNlIHRoZSBub24tdGhyb3dpbmcgdmFyaWFudHMgZHVyaW5nIGRlc3RydWN0aW9uCisgICAgICAvLyBhbmQgaWdub3JlIGFueSBlcnJvcnMKKyAgICAgIGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZXJyb3I7CisgICAgICBtX2FjY2VwdG9yLT5jbG9zZShlcnJvcik7CisgICAgICBORkRfTE9HX1RSQUNFKCJbIiA8PCBtX2VuZHBvaW50IDw8ICJdIFJlbW92aW5nIHNvY2tldCBmaWxlIik7CisgICAgICBib29zdDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKG1fZW5kcG9pbnQucGF0aCgpLCBlcnJvcik7CisgICAgfQorfQorCit2b2lkCitVbml4U3RyZWFtQ2hhbm5lbDo6bGlzdGVuKGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uRmFjZUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25BY2NlcHRGYWlsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYWNrbG9nLyogPSBhY2NlcHRvcjo6bWF4X2Nvbm5lY3Rpb25zKi8pCit7CisgIGlmIChtX2lzTGlzdGVuaW5nKSB7CisgICAgTkZEX0xPR19XQVJOKCJbIiA8PCBtX2VuZHBvaW50IDw8ICJdIEFscmVhZHkgbGlzdGVuaW5nIik7CisgICAgcmV0dXJuOworICB9CisKKyAgbmFtZXNwYWNlIGZzID0gYm9vc3Q6OmZpbGVzeXN0ZW07CisKKyAgZnM6OnBhdGggc29ja2V0UGF0aChtX2VuZHBvaW50LnBhdGgoKSk7CisgIGZzOjpmaWxlX3R5cGUgdHlwZSA9IGZzOjpzeW1saW5rX3N0YXR1cyhzb2NrZXRQYXRoKS50eXBlKCk7CisKKyAgaWYgKHR5cGUgPT0gZnM6OnNvY2tldF9maWxlKQorICAgIHsKKyAgICAgIGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZXJyb3I7CisgICAgICBzdHJlYW1fcHJvdG9jb2w6OnNvY2tldCBzb2NrZXQoZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpOworICAgICAgc29ja2V0LmNvbm5lY3QobV9lbmRwb2ludCwgZXJyb3IpOworICAgICAgTkZEX0xPR19UUkFDRSgiWyIgPDwgbV9lbmRwb2ludCA8PCAiXSBjb25uZWN0KCkgb24gZXhpc3Rpbmcgc29ja2V0IGZpbGUgcmV0dXJuZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlcnJvci5tZXNzYWdlKCkpOworICAgICAgaWYgKCFlcnJvcikKKyAgICAgICAgeworICAgICAgICAgIC8vIHNvbWVvbmUgYW5zd2VyZWQsIGxlYXZlIHRoZSBzb2NrZXQgYWxvbmUKKyAgICAgICAgICB0aHJvdyBFcnJvcigiU29ja2V0IGZpbGUgYXQgIiArIG1fZW5kcG9pbnQucGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlbG9uZ3MgdG8gYW5vdGhlciBORkQgcHJvY2VzcyIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChlcnJvciA9PSBib29zdDo6c3lzdGVtOjplcnJjOjpjb25uZWN0aW9uX3JlZnVzZWQgfHwKKyAgICAgICAgICAgICAgIGVycm9yID09IGJvb3N0OjpzeXN0ZW06OmVycmM6OnRpbWVkX291dCkKKyAgICAgICAgeworICAgICAgICAgIC8vIG5vIG9uZSBpcyBsaXN0ZW5pbmcgb24gdGhlIHJlbW90ZSBzaWRlLAorICAgICAgICAgIC8vIHdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoZSBzb2NrZXQgZmlsZQorICAgICAgICAgIE5GRF9MT0dfSU5GTygiWyIgPDwgbV9lbmRwb2ludCA8PCAiXSBSZW1vdmluZyBzdGFsZSBzb2NrZXQgZmlsZSIpOworICAgICAgICAgIGZzOjpyZW1vdmUoc29ja2V0UGF0aCk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKHR5cGUgIT0gZnM6OmZpbGVfbm90X2ZvdW5kKQorICAgIHsKKyAgICAgIHRocm93IEVycm9yKG1fZW5kcG9pbnQucGF0aCgpICsgIiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbm90IGEgc29ja2V0IGZpbGUiKTsKKyAgICB9CisKKyAgbV9hY2NlcHRvciA9IG1ha2Vfc2hhcmVkPHN0cmVhbV9wcm90b2NvbDo6YWNjZXB0b3I+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworICBtX2FjY2VwdG9yLT5vcGVuKCk7CisgIG1fYWNjZXB0b3ItPmJpbmQobV9lbmRwb2ludCk7CisgIG1fYWNjZXB0b3ItPmxpc3RlbihiYWNrbG9nKTsKKyAgbV9pc0xpc3RlbmluZyA9IHRydWU7CisKKyAgaWYgKDo6Y2htb2QobV9lbmRwb2ludC5wYXRoKCkuY19zdHIoKSwgMDY2NikgPCAwKQorICAgIHsKKyAgICAgIHRocm93IEVycm9yKCJGYWlsZWQgdG8gY2htb2QoKSBzb2NrZXQgZmlsZSBhdCAiICsgbV9lbmRwb2ludC5wYXRoKCkpOworICAgIH0KKworICBzaGFyZWRfcHRyPHN0cmVhbV9wcm90b2NvbDo6c29ja2V0PiBjbGllbnRTb2NrZXQgPQorICAgIG1ha2Vfc2hhcmVkPHN0cmVhbV9wcm90b2NvbDo6c29ja2V0PihyZWYoZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpKTsKKworICBtX2FjY2VwdG9yLT5hc3luY19hY2NlcHQoKmNsaWVudFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlVuaXhTdHJlYW1DaGFubmVsOjpoYW5kbGVTdWNjZXNzZnVsQWNjZXB0LCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6YXNpbzo6cGxhY2Vob2xkZXJzOjplcnJvciwgY2xpZW50U29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhY2VDcmVhdGVkLCBvbkFjY2VwdEZhaWxlZCkpOworfQorCit2b2lkCitVbml4U3RyZWFtQ2hhbm5lbDo6aGFuZGxlU3VjY2Vzc2Z1bEFjY2VwdChjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8c3RyZWFtX3Byb3RvY29sOjpzb2NrZXQ+JiBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkFjY2VwdEZhaWxlZCkKK3sKKyAgaWYgKGVycm9yKSB7CisgICAgaWYgKGVycm9yID09IGJvb3N0OjpzeXN0ZW06OmVycmM6Om9wZXJhdGlvbl9jYW5jZWxlZCkgLy8gd2hlbiBzb2NrZXQgaXMgY2xvc2VkIGJ5IHNvbWVvbmUKKyAgICAgIHJldHVybjsKKworICAgIE5GRF9MT0dfREVCVUcoIlsiIDw8IG1fZW5kcG9pbnQgPDwgIl0gQ29ubmVjdGlvbiBmYWlsZWQ6ICIgPDwgZXJyb3IubWVzc2FnZSgpKTsKKyAgICBvbkFjY2VwdEZhaWxlZCgiQ29ubmVjdGlvbiBmYWlsZWQ6ICIgKyBlcnJvci5tZXNzYWdlKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIE5GRF9MT0dfREVCVUcoIlsiIDw8IG1fZW5kcG9pbnQgPDwgIl0gPDwgSW5jb21pbmcgY29ubmVjdGlvbiIpOworCisgIHNoYXJlZF9wdHI8c3RyZWFtX3Byb3RvY29sOjpzb2NrZXQ+IGNsaWVudFNvY2tldCA9CisgICAgbWFrZV9zaGFyZWQ8c3RyZWFtX3Byb3RvY29sOjpzb2NrZXQ+KHJlZihnZXRHbG9iYWxJb1NlcnZpY2UoKSkpOworCisgIC8vIHByZXBhcmUgYWNjZXB0aW5nIHRoZSBuZXh0IGNvbm5lY3Rpb24KKyAgbV9hY2NlcHRvci0+YXN5bmNfYWNjZXB0KCpjbGllbnRTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZVbml4U3RyZWFtQ2hhbm5lbDo6aGFuZGxlU3VjY2Vzc2Z1bEFjY2VwdCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmFzaW86OnBsYWNlaG9sZGVyczo6ZXJyb3IsIGNsaWVudFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GYWNlQ3JlYXRlZCwgb25BY2NlcHRGYWlsZWQpKTsKKworICBzaGFyZWRfcHRyPFVuaXhTdHJlYW1GYWNlPiBmYWNlID0gbWFrZV9zaGFyZWQ8VW5peFN0cmVhbUZhY2U+KHNvY2tldCk7CisgIG9uRmFjZUNyZWF0ZWQoZmFjZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWNoYW5uZWwuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWNoYW5uZWwuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjNjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvdW5peC1zdHJlYW0tY2hhbm5lbC5ocHAKQEAgLTAsMCArMSw5NSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfVU5JWF9TVFJFQU1fQ0hBTk5FTF9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GQUNFX1VOSVhfU1RSRUFNX0NIQU5ORUxfSFBQCisKKyNpbmNsdWRlICJjaGFubmVsLmhwcCIKKyNpbmNsdWRlICJ1bml4LXN0cmVhbS1mYWNlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK25hbWVzcGFjZSB1bml4X3N0cmVhbSB7Cit0eXBlZGVmIGJvb3N0Ojphc2lvOjpsb2NhbDo6c3RyZWFtX3Byb3RvY29sOjplbmRwb2ludCBFbmRwb2ludDsKK30gLy8gbmFtZXNwYWNlIHVuaXhfc3RyZWFtCisKKy8qKgorICogXGJyaWVmIENsYXNzIGltcGxlbWVudGluZyBhIGxvY2FsIGNoYW5uZWwgdG8gY3JlYXRlIGZhY2VzCisgKgorICogQ2hhbm5lbCBjYW4gY3JlYXRlIGZhY2VzIGFzIGEgcmVzcG9uc2UgdG8gaW5jb21pbmcgSVBDIGNvbm5lY3Rpb25zCisgKiAoVW5peFN0cmVhbUNoYW5uZWw6Omxpc3RlbiBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIHRoYXQgdG8gd29yaykuCisgKi8KK2NsYXNzIFVuaXhTdHJlYW1DaGFubmVsIDogcHVibGljIENoYW5uZWwKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIFxicmllZiBVbml4U3RyZWFtQ2hhbm5lbC1yZWxhdGVkIGVycm9yCisgICAqLworICBzdHJ1Y3QgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgICBFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgd2hhdCkgOiBzdGQ6OnJ1bnRpbWVfZXJyb3Iod2hhdCkge30KKyAgfTsKKworICAvKioKKyAgICogXGJyaWVmIENyZWF0ZSBVbml4U3RyZWFtIGNoYW5uZWwgZm9yIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQKKyAgICoKKyAgICogVG8gZW5hYmxlIGNyZWF0aW9uIG9mIGZhY2VzIHVwb24gaW5jb21pbmcgY29ubmVjdGlvbnMsIG9uZQorICAgKiBuZWVkcyB0byBleHBsaWNpdGx5IGNhbGwgVW5peFN0cmVhbUNoYW5uZWw6Omxpc3RlbiBtZXRob2QuCisgICAqLworICBleHBsaWNpdAorICBVbml4U3RyZWFtQ2hhbm5lbChjb25zdCB1bml4X3N0cmVhbTo6RW5kcG9pbnQmIGVuZHBvaW50KTsKKworICB2aXJ0dWFsCisgIH5Vbml4U3RyZWFtQ2hhbm5lbCgpOworCisgIC8qKgorICAgKiBcYnJpZWYgRW5hYmxlIGxpc3RlbmluZyBvbiB0aGUgbG9jYWwgZW5kcG9pbnQsIGFjY2VwdCBjb25uZWN0aW9ucywKKyAgICogICAgICAgIGFuZCBjcmVhdGUgZmFjZXMgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZQorICAgKiBccGFyYW0gb25GYWNlQ3JlYXRlZCAgQ2FsbGJhY2sgdG8gbm90aWZ5IHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgdGhlIGZhY2UKKyAgICogXHBhcmFtIG9uQWNjZXB0RmFpbGVkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGNoYW5uZWwgZmFpbHMgKGFjY2VwdCBjYWxsCisgICAqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGFuIGVycm9yKQorICAgKiBccGFyYW0gYmFja2xvZyAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGluY29taW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgKi8KKyAgdm9pZAorICBsaXN0ZW4oY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25GYWNlQ3JlYXRlZCwKKyAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25BY2NlcHRGYWlsZWQsCisgICAgICAgICBpbnQgYmFja2xvZyA9IGJvb3N0Ojphc2lvOjpsb2NhbDo6c3RyZWFtX3Byb3RvY29sOjphY2NlcHRvcjo6bWF4X2Nvbm5lY3Rpb25zKTsKKworcHJpdmF0ZToKKyAgdm9pZAorICBoYW5kbGVTdWNjZXNzZnVsQWNjZXB0KGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OmxvY2FsOjpzdHJlYW1fcHJvdG9jb2w6OnNvY2tldD4mIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKTsKKworcHJpdmF0ZToKKyAgdW5peF9zdHJlYW06OkVuZHBvaW50IG1fZW5kcG9pbnQ7CisgIHNoYXJlZF9wdHI8Ym9vc3Q6OmFzaW86OmxvY2FsOjpzdHJlYW1fcHJvdG9jb2w6OmFjY2VwdG9yPiBtX2FjY2VwdG9yOworICBib29sIG1faXNMaXN0ZW5pbmc7Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9VTklYX1NUUkVBTV9DSEFOTkVMX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWZhY2UuY3BwIGIvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZmYzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2ZhY2UvdW5peC1zdHJlYW0tZmFjZS5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgInVuaXgtc3RyZWFtLWZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLy8gVGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIHNwZWNpYWxpemUgdGhlIGxvZ2dlciwKKy8vIG90aGVyd2lzZSwgZXZlcnl0aGluZyBjb3VsZCBiZSBwdXQgaW50byB0aGUgaGVhZGVyIGZpbGUuCisKK05GRF9MT0dfSU5DTEFTU18yVEVNUExBVEVfU1BFQ0lBTElaQVRJT05fREVGSU5FKFN0cmVhbUZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml4U3RyZWFtRmFjZTo6cHJvdG9jb2wsIExvY2FsRmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4U3RyZWFtRmFjZSIpOworCitCT09TVF9TVEFUSUNfQVNTRVJUKChib29zdDo6aXNfc2FtZTxVbml4U3RyZWFtRmFjZTo6cHJvdG9jb2w6OnNvY2tldDo6bmF0aXZlX2hhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgaW50Pjo6dmFsdWUpKTsKKworVW5peFN0cmVhbUZhY2U6OlVuaXhTdHJlYW1GYWNlKGNvbnN0IHNoYXJlZF9wdHI8VW5peFN0cmVhbUZhY2U6OnByb3RvY29sOjpzb2NrZXQ+JiBzb2NrZXQpCisgIDogU3RyZWFtRmFjZTxwcm90b2NvbCwgTG9jYWxGYWNlPihGYWNlVXJpOjpmcm9tRmQoc29ja2V0LT5uYXRpdmVfaGFuZGxlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZVVyaShzb2NrZXQtPmxvY2FsX2VuZHBvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LCB0cnVlKQoreworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1mYWNlLmhwcCBiL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1mYWNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ4MmM0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWZhY2UuaHBwCkBAIC0wLDAgKzEsNDkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX1VOSVhfU1RSRUFNX0ZBQ0VfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9VTklYX1NUUkVBTV9GQUNFX0hQUAorCisjaW5jbHVkZSAic3RyZWFtLWZhY2UuaHBwIgorCisjaWZuZGVmIEhBVkVfVU5JWF9TT0NLRVRTCisjZXJyb3IgIkNhbm5vdCBpbmNsdWRlIHRoaXMgZmlsZSB3aGVuIFVOSVggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSIKKyNlbmRpZgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqCisgKiBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgRmFjZSBhYnN0cmFjdGlvbiB0aGF0IHVzZXMgc3RyZWFtLW9yaWVudGVkCisgKiAgICAgICAgVW5peCBkb21haW4gc29ja2V0cyBhcyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBtZWNoYW5pc20KKyAqLworY2xhc3MgVW5peFN0cmVhbUZhY2UgOiBwdWJsaWMgU3RyZWFtRmFjZTxib29zdDo6YXNpbzo6bG9jYWw6OnN0cmVhbV9wcm90b2NvbCwgTG9jYWxGYWNlPgoreworcHVibGljOgorICBleHBsaWNpdAorICBVbml4U3RyZWFtRmFjZShjb25zdCBzaGFyZWRfcHRyPHByb3RvY29sOjpzb2NrZXQ+JiBzb2NrZXQpOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZBQ0VfVU5JWF9TVFJFQU1fRkFDRV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1mYWN0b3J5LmNwcCBiL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1mYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzUxM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ1bml4LXN0cmVhbS1mYWN0b3J5LmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPiAvLyBmb3IgY2Fub25pY2FsKCkKKworbmFtZXNwYWNlIG5mZCB7CisKK3NoYXJlZF9wdHI8VW5peFN0cmVhbUNoYW5uZWw+CitVbml4U3RyZWFtRmFjdG9yeTo6Y3JlYXRlQ2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgdW5peFNvY2tldFBhdGgpCit7CisgIGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIHAodW5peFNvY2tldFBhdGgpOworICBwID0gYm9vc3Q6OmZpbGVzeXN0ZW06OmNhbm9uaWNhbChwLnBhcmVudF9wYXRoKCkpIC8gcC5maWxlbmFtZSgpOworICB1bml4X3N0cmVhbTo6RW5kcG9pbnQgZW5kcG9pbnQocC5zdHJpbmcoKSk7CisKKyAgc2hhcmVkX3B0cjxVbml4U3RyZWFtQ2hhbm5lbD4gY2hhbm5lbCA9IGZpbmRDaGFubmVsKGVuZHBvaW50KTsKKyAgaWYgKGNoYW5uZWwpCisgICAgcmV0dXJuIGNoYW5uZWw7CisKKyAgY2hhbm5lbCA9IG1ha2Vfc2hhcmVkPFVuaXhTdHJlYW1DaGFubmVsPihlbmRwb2ludCk7CisgIG1fY2hhbm5lbHNbZW5kcG9pbnRdID0gY2hhbm5lbDsKKyAgcmV0dXJuIGNoYW5uZWw7Cit9CisKK3NoYXJlZF9wdHI8VW5peFN0cmVhbUNoYW5uZWw+CitVbml4U3RyZWFtRmFjdG9yeTo6ZmluZENoYW5uZWwoY29uc3QgdW5peF9zdHJlYW06OkVuZHBvaW50JiBlbmRwb2ludCkKK3sKKyAgQ2hhbm5lbE1hcDo6aXRlcmF0b3IgaSA9IG1fY2hhbm5lbHMuZmluZChlbmRwb2ludCk7CisgIGlmIChpICE9IG1fY2hhbm5lbHMuZW5kKCkpCisgICAgcmV0dXJuIGktPnNlY29uZDsKKyAgZWxzZQorICAgIHJldHVybiBzaGFyZWRfcHRyPFVuaXhTdHJlYW1DaGFubmVsPigpOworfQorCit2b2lkCitVbml4U3RyZWFtRmFjdG9yeTo6Y3JlYXRlRmFjZShjb25zdCBGYWNlVXJpJiB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpCit7CisgIHRocm93IEVycm9yKCJVbml4U3RyZWFtRmFjdG9yeSBkb2VzIG5vdCBzdXBwb3J0ICdjcmVhdGVGYWNlJyBvcGVyYXRpb24iKTsKK30KKworc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPgorVW5peFN0cmVhbUZhY3Rvcnk6OmdldENoYW5uZWxzKCkgY29uc3QKK3sKKyAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPiBjaGFubmVsczsKKyAgZm9yIChDaGFubmVsTWFwOjpjb25zdF9pdGVyYXRvciBpID0gbV9jaGFubmVscy5iZWdpbigpOyBpICE9IG1fY2hhbm5lbHMuZW5kKCk7ICsraSkKKyAgICB7CisgICAgICBjaGFubmVscy5wdXNoX2JhY2soaS0+c2Vjb25kKTsKKyAgICB9CisKKyAgcmV0dXJuIGNoYW5uZWxzOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1mYWN0b3J5LmhwcCBiL05GRC9kYWVtb24vZmFjZS91bml4LXN0cmVhbS1mYWN0b3J5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmFmZjMwCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLWZhY3RvcnkuaHBwCkBAIC0wLDAgKzEsODkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX1VOSVhfU1RSRUFNX0ZBQ1RPUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9VTklYX1NUUkVBTV9GQUNUT1JZX0hQUAorCisjaW5jbHVkZSAicHJvdG9jb2wtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAidW5peC1zdHJlYW0tY2hhbm5lbC5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBVbml4U3RyZWFtRmFjdG9yeSA6IHB1YmxpYyBQcm90b2NvbEZhY3RvcnkKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIFxicmllZiBFeGNlcHRpb24gb2YgVW5peFN0cmVhbUZhY3RvcnkKKyAgICovCisgIHN0cnVjdCBFcnJvciA6IHB1YmxpYyBQcm90b2NvbEZhY3Rvcnk6OkVycm9yCisgIHsKKyAgICBFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgd2hhdCkgOiBQcm90b2NvbEZhY3Rvcnk6OkVycm9yKHdoYXQpIHt9CisgIH07CisKKyAgLyoqCisgICAqIFxicmllZiBDcmVhdGUgc3RyZWFtLW9yaWVudGVkIFVuaXggY2hhbm5lbCB1c2luZyBzcGVjaWZpZWQgc29ja2V0IHBhdGgKKyAgICoKKyAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHR3aWNlIHdpdGggdGhlIHNhbWUgcGF0aCwgb25seSBvbmUgY2hhbm5lbAorICAgKiB3aWxsIGJlIGNyZWF0ZWQuICBUaGUgc2Vjb25kIGNhbGwgd2lsbCBqdXN0IHJldHJpZXZlIHRoZSBleGlzdGluZworICAgKiBjaGFubmVsLgorICAgKgorICAgKiBccmV0dXJucyBhbHdheXMgYSB2YWxpZCBwb2ludGVyIHRvIGEgVW5peFN0cmVhbUNoYW5uZWwgb2JqZWN0LAorICAgKiAgICAgICAgICBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGNoYW5uZWwgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAqCisgICAqIFx0aHJvd3MgVW5peFN0cmVhbUZhY3Rvcnk6OkVycm9yCisgICAqLworICBzaGFyZWRfcHRyPFVuaXhTdHJlYW1DaGFubmVsPgorICBjcmVhdGVDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiB1bml4U29ja2V0UGF0aCk7CisKKyAgLy8gZnJvbSBGYWN0b3J5CisKKyAgdmlydHVhbCB2b2lkCisgIGNyZWF0ZUZhY2UoY29uc3QgRmFjZVVyaSYgdXJpLAorICAgICAgICAgICAgIGNvbnN0IEZhY2VDcmVhdGVkQ2FsbGJhY2smIG9uQ3JlYXRlZCwKKyAgICAgICAgICAgICBjb25zdCBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpOworCisgIHZpcnR1YWwgc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPgorICBnZXRDaGFubmVscygpIGNvbnN0OworCitwcml2YXRlOgorICAvKioKKyAgICogXGJyaWVmIExvb2sgdXAgVW5peFN0cmVhbUNoYW5uZWwgdXNpbmcgc3BlY2lmaWVkIGVuZHBvaW50CisgICAqCisgICAqIFxyZXR1cm5zIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBVbml4U3RyZWFtQ2hhbm5lbCBvYmplY3QKKyAgICogICAgICAgICAgb3IgZW1wdHkgc2hhcmVkIHBvaW50ZXIgd2hlbiBzdWNoIGNoYW5uZWwgZG9lcyBub3QgZXhpc3QKKyAgICoKKyAgICogXHRocm93cyBuZXZlcgorICAgKi8KKyAgc2hhcmVkX3B0cjxVbml4U3RyZWFtQ2hhbm5lbD4KKyAgZmluZENoYW5uZWwoY29uc3QgdW5peF9zdHJlYW06OkVuZHBvaW50JiBlbmRwb2ludCk7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgc3RkOjptYXA8IHVuaXhfc3RyZWFtOjpFbmRwb2ludCwgc2hhcmVkX3B0cjxVbml4U3RyZWFtQ2hhbm5lbD4gPiBDaGFubmVsTWFwOworICBDaGFubmVsTWFwIG1fY2hhbm5lbHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9VTklYX1NUUkVBTV9GQUNUT1JZX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldC1jaGFubmVsLmNwcCBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtY2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiZGJhYwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtY2hhbm5lbC5jcHAKQEAgLTAsMCArMSwxOTYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ3ZWJzb2NrZXQtY2hhbm5lbC5ocHAiCisKKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiV2ViU29ja2V0Q2hhbm5lbCIpOworCit1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmFzaW87CisKK1dlYlNvY2tldENoYW5uZWw6OldlYlNvY2tldENoYW5uZWwoY29uc3Qgd2Vic29ja2V0OjpFbmRwb2ludCYgbG9jYWxFbmRwb2ludCkKKyAgOiBtX2xvY2FsRW5kcG9pbnQobG9jYWxFbmRwb2ludCkKKyAgLCBtX2lzTGlzdGVuaW5nKGZhbHNlKQorICAsIG1fcGluZ0ludGVydmFsKDEwMDAwKQoreworICAvLyBTZXR1cCBXZWJTb2NrZXQgc2VydmVyCisgIG1fc2VydmVyLmNsZWFyX2FjY2Vzc19jaGFubmVscyh3ZWJzb2NrZXRwcDo6bG9nOjphbGV2ZWw6OmFsbCk7CisgIG1fc2VydmVyLmNsZWFyX2Vycm9yX2NoYW5uZWxzKHdlYnNvY2tldHBwOjpsb2c6OmFsZXZlbDo6YWxsKTsKKworICBtX3NlcnZlci5zZXRfbWVzc2FnZV9oYW5kbGVyKGJpbmQoJldlYlNvY2tldENoYW5uZWw6OmhhbmRsZU1lc3NhZ2UsIHRoaXMsIF8xLCBfMikpOworICBtX3NlcnZlci5zZXRfb3Blbl9oYW5kbGVyKGJpbmQoJldlYlNvY2tldENoYW5uZWw6OmhhbmRsZU9wZW4sIHRoaXMsIF8xKSk7CisgIG1fc2VydmVyLnNldF9jbG9zZV9oYW5kbGVyKGJpbmQoJldlYlNvY2tldENoYW5uZWw6OmhhbmRsZUNsb3NlLCB0aGlzLCBfMSkpOworICBtX3NlcnZlci5pbml0X2FzaW8oJmdldEdsb2JhbElvU2VydmljZSgpKTsKKyAgLy8gQWx3YXlzIHNldCBTT19SRVVTRUFERFIgZmxhZworICBtX3NlcnZlci5zZXRfcmV1c2VfYWRkcih0cnVlKTsKKworICAvLyBEZXRlY3QgZGlzY29ubmVjdGlvbiB1c2luZyBQT05HIG1lc3NhZ2UKKyAgbV9zZXJ2ZXIuc2V0X3BvbmdfaGFuZGxlcihiaW5kKCZXZWJTb2NrZXRDaGFubmVsOjpoYW5kbGVQb25nLCB0aGlzLCBfMSwgXzIpKTsKKyAgbV9zZXJ2ZXIuc2V0X3BvbmdfdGltZW91dF9oYW5kbGVyKGJpbmQoJldlYlNvY2tldENoYW5uZWw6OmhhbmRsZVBvbmdUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfMSwgXzIpKTsKKworICB0aGlzLT5zZXRVcmkoRmFjZVVyaShsb2NhbEVuZHBvaW50LCAid3MiKSk7Cit9CisKK1dlYlNvY2tldENoYW5uZWw6On5XZWJTb2NrZXRDaGFubmVsKCkKK3sKK30KKwordm9pZAorV2ViU29ja2V0Q2hhbm5lbDo6c2V0UG9uZ1RpbWVvdXQodGltZTo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpCit7CisgIG1fc2VydmVyLnNldF9wb25nX3RpbWVvdXQoc3RhdGljX2Nhc3Q8bG9uZz4odGltZW91dC5jb3VudCgpKSk7Cit9CisKK3ZvaWQKK1dlYlNvY2tldENoYW5uZWw6OmhhbmRsZVBvbmdUaW1lb3V0KHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbCBoZGwsIHN0ZDo6c3RyaW5nIG1zZykKK3sKKyAgQ2hhbm5lbEZhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jaGFubmVsRmFjZXMuZmluZChoZGwpOworICBpZiAoaXQgIT0gbV9jaGFubmVsRmFjZXMuZW5kKCkpCisgICAgeworICAgICAgaXQtPnNlY29uZC0+Y2xvc2UoKTsKKyAgICAgIE5GRF9MT0dfREVCVUcoImhhbmRsZVBvbmdUaW1lb3V0OiByZW1vdmUgIiA8PCBpdC0+c2Vjb25kLT5nZXRSZW1vdGVVcmkoKSk7CisgICAgICBtX2NoYW5uZWxGYWNlcy5lcmFzZShpdCk7CisgICAgfQorfQorCit2b2lkCitXZWJTb2NrZXRDaGFubmVsOjpoYW5kbGVQb25nKHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbCBoZGwsIHN0ZDo6c3RyaW5nIG1zZykKK3sKKyAgQ2hhbm5lbEZhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jaGFubmVsRmFjZXMuZmluZChoZGwpOworICBpZiAoaXQgIT0gbV9jaGFubmVsRmFjZXMuZW5kKCkpCisgICAgeworICAgICAgTkZEX0xPR19UUkFDRSgiaGFuZGxlUG9uZzogZnJvbSAiIDw8IGl0LT5zZWNvbmQtPmdldFJlbW90ZVVyaSgpKTsKKyAgICB9Cit9CisKK3ZvaWQKK1dlYlNvY2tldENoYW5uZWw6OmhhbmRsZU1lc3NhZ2Uod2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vic29ja2V0OjpTZXJ2ZXI6Om1lc3NhZ2VfcHRyIG1zZykKK3sKKyAgQ2hhbm5lbEZhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jaGFubmVsRmFjZXMuZmluZChoZGwpOworICBpZiAoaXQgIT0gbV9jaGFubmVsRmFjZXMuZW5kKCkpCisgICAgeworICAgICAgaXQtPnNlY29uZC0+aGFuZGxlUmVjZWl2ZShtc2ctPmdldF9wYXlsb2FkKCkpOworICAgIH0KK30KKwordm9pZAorV2ViU29ja2V0Q2hhbm5lbDo6aGFuZGxlT3Blbih3ZWJzb2NrZXRwcDo6Y29ubmVjdGlvbl9oZGwgaGRsKQoreworICBzdGQ6OnN0cmluZyByZW1vdGU7CisgIHRyeQorICAgIHsKKyAgICAgIHJlbW90ZSA9ICJ3c2NsaWVudDovLyIgKyBtX3NlcnZlci5nZXRfY29uX2Zyb21faGRsKGhkbCktPmdldF9yZW1vdGVfZW5kcG9pbnQoKTsKKyAgICB9CisgIGNhdGNoICh3ZWJzb2NrZXRwcDo6bGliOjplcnJvcl9jb2RlJikKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJoYW5kbGVPcGVuOiBjYW5ub3QgZ2V0IHJlbW90ZSB1cmkiKTsKKyAgICAgIHdlYnNvY2tldHBwOjpsaWI6OmVycm9yX2NvZGUgZWNvZGU7CisgICAgICBtX3NlcnZlci5jbG9zZShoZGwsIHdlYnNvY2tldHBwOjpjbG9zZTo6c3RhdHVzOjpub3JtYWwsICJjbG9zZWQgYnkgY2hhbm5lbCIsIGVjb2RlKTsKKyAgICB9CisgIHNoYXJlZF9wdHI8V2ViU29ja2V0RmFjZT4gZmFjZSA9IG5kbjo6bWFrZV9zaGFyZWQ8V2ViU29ja2V0RmFjZT4oRmFjZVVyaShyZW1vdGUpLCB0aGlzLT5nZXRVcmkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGwsIHJlZihtX3NlcnZlcikpOworICBtX29uRmFjZUNyZWF0ZWRDYWxsYmFjayhmYWNlKTsKKyAgbV9jaGFubmVsRmFjZXNbaGRsXSA9IGZhY2U7CisKKyAgLy8gU2NoZWR1bGUgUElORyBtZXNzYWdlCisgIEV2ZW50SWQgcGluZ0V2ZW50ID0gc2NoZWR1bGVyOjpzY2hlZHVsZShtX3BpbmdJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJldlYlNvY2tldENoYW5uZWw6OnNlbmRQaW5nLCB0aGlzLCBoZGwpKTsKKyAgZmFjZS0+c2V0UGluZ0V2ZW50SWQocGluZ0V2ZW50KTsKK30KKwordm9pZAorV2ViU29ja2V0Q2hhbm5lbDo6c2VuZFBpbmcod2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCkKK3sKKyAgQ2hhbm5lbEZhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jaGFubmVsRmFjZXMuZmluZChoZGwpOworICBpZiAoaXQgIT0gbV9jaGFubmVsRmFjZXMuZW5kKCkpCisgICAgeworICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBtX3NlcnZlci5waW5nKGhkbCwgIk5GRC1XZWJTb2NrZXQiKTsKKyAgICAgICAgfQorICAgICAgY2F0Y2ggKHdlYnNvY2tldHBwOjpsaWI6OmVycm9yX2NvZGUmKQorICAgICAgICB7CisgICAgICAgICAgaXQtPnNlY29uZC0+Y2xvc2UoKTsKKyAgICAgICAgICBORkRfTE9HX0RFQlVHKCJzZW5kUGluZzogZmFpbGVkIHRvIHBpbmcgIiA8PCBpdC0+c2Vjb25kLT5nZXRSZW1vdGVVcmkoKSk7CisgICAgICAgICAgbV9jaGFubmVsRmFjZXMuZXJhc2UoaXQpOworICAgICAgICB9CisKKyAgICAgIE5GRF9MT0dfVFJBQ0UoInNlbmRQaW5nOiB0byAiIDw8IGl0LT5zZWNvbmQtPmdldFJlbW90ZVVyaSgpKTsKKworICAgICAgLy8gU2NoZWR1bGUgbmV4dCBQSU5HIG1lc3NhZ2UKKyAgICAgIEV2ZW50SWQgcGluZ0V2ZW50ID0gc2NoZWR1bGVyOjpzY2hlZHVsZShtX3BpbmdJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZXZWJTb2NrZXRDaGFubmVsOjpzZW5kUGluZywgdGhpcywgaGRsKSk7CisgICAgICBpdC0+c2Vjb25kLT5zZXRQaW5nRXZlbnRJZChwaW5nRXZlbnQpOworICAgIH0KK30KKwordm9pZAorV2ViU29ja2V0Q2hhbm5lbDo6aGFuZGxlQ2xvc2Uod2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCkKK3sKKyAgQ2hhbm5lbEZhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jaGFubmVsRmFjZXMuZmluZChoZGwpOworICBpZiAoaXQgIT0gbV9jaGFubmVsRmFjZXMuZW5kKCkpCisgICAgeworICAgICAgaXQtPnNlY29uZC0+Y2xvc2UoKTsKKyAgICAgIE5GRF9MT0dfREVCVUcoImhhbmRsZUNsb3NlOiByZW1vdmUgIiA8PCBpdC0+c2Vjb25kLT5nZXRSZW1vdGVVcmkoKSk7CisgICAgICBtX2NoYW5uZWxGYWNlcy5lcmFzZShpdCk7CisgICAgfQorfQorCisKK3ZvaWQKK1dlYlNvY2tldENoYW5uZWw6Omxpc3Rlbihjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkZhY2VDcmVhdGVkKQoreworICBpZiAobV9pc0xpc3RlbmluZykKKyAgICB7CisgICAgICB0aHJvdyBFcnJvcigiTGlzdGVuIGFscmVhZHkgY2FsbGVkIG9uIHRoaXMgY2hhbm5lbCIpOworICAgIH0KKyAgbV9pc0xpc3RlbmluZyA9IHRydWU7CisKKyAgbV9vbkZhY2VDcmVhdGVkQ2FsbGJhY2sgPSBvbkZhY2VDcmVhdGVkOworCisgIHRyeQorICAgIHsKKyAgICAgIG1fc2VydmVyLmxpc3RlbihtX2xvY2FsRW5kcG9pbnQpOworICAgIH0KKyAgY2F0Y2ggKHdlYnNvY2tldHBwOjpsaWI6OmVycm9yX2NvZGUgZWMpCisgICAgeworICAgICAgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBsaXN0ZW4gb24gbG9jYWwgZW5kcG9pbnQiKTsKKyAgICB9CisKKyAgbV9zZXJ2ZXIuc3RhcnRfYWNjZXB0KCk7Cit9CisKK3NpemVfdAorV2ViU29ja2V0Q2hhbm5lbDo6c2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX2NoYW5uZWxGYWNlcy5zaXplKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldC1jaGFubmVsLmhwcCBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtY2hhbm5lbC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjNmFlMgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtY2hhbm5lbC5ocHAKQEAgLTAsMCArMSwxNTEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GQUNFX1dFQlNPQ0tFVF9DSEFOTkVMX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZBQ0VfV0VCU09DS0VUX0NIQU5ORUxfSFBQCisKKyNpbmNsdWRlICJjaGFubmVsLmhwcCIKKyNpbmNsdWRlICJjb3JlL2dsb2JhbC1pby5ocHAiCisjaW5jbHVkZSAiY29yZS9zY2hlZHVsZXIuaHBwIgorI2luY2x1ZGUgIndlYnNvY2tldC1mYWNlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKKy8qKgorICogXGJyaWVmIENsYXNzIGltcGxlbWVudGluZyBXZWJTb2NrZXQtYmFzZWQgY2hhbm5lbCB0byBjcmVhdGUgZmFjZXMKKyAqCisgKgorICovCitjbGFzcyBXZWJTb2NrZXRDaGFubmVsIDogcHVibGljIENoYW5uZWwKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIFxicmllZiBFeGNlcHRpb24gb2YgV2ViU29ja2V0Q2hhbm5lbAorICAgKi8KKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IHJ1bnRpbWVfZXJyb3Iod2hhdCkKKyAgICB7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIFdlYlNvY2tldCBjaGFubmVsIGZvciB0aGUgbG9jYWwgZW5kcG9pbnQKKyAgICoKKyAgICogVG8gZW5hYmxlIGNyZWF0aW9uIG9mIGZhY2VzIHVwb24gaW5jb21pbmcgY29ubmVjdGlvbnMsCisgICAqIG9uZSBuZWVkcyB0byBleHBsaWNpdGx5IGNhbGwgV2ViU29ja2V0Q2hhbm5lbDo6bGlzdGVuIG1ldGhvZC4KKyAgICogVGhlIGNyZWF0ZWQgc29ja2V0IGlzIGJvdW5kIHRvIHRoZSBsb2NhbEVuZHBvaW50LgorICAgKgorICAgKiBcdGhyb3cgV2ViU29ja2V0Q2hhbm5lbDo6RXJyb3IgaWYgYmluZCBvbiB0aGUgc29ja2V0IGZhaWxzCisgICAqLworICBleHBsaWNpdAorICBXZWJTb2NrZXRDaGFubmVsKGNvbnN0IHdlYnNvY2tldDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpOworCisgIHZpcnR1YWwKKyAgfldlYlNvY2tldENoYW5uZWwoKTsKKworICAvKioKKyAgICogXGJyaWVmIEVuYWJsZSBsaXN0ZW5pbmcgb24gdGhlIGxvY2FsIGVuZHBvaW50LCBhY2NlcHQgY29ubmVjdGlvbnMsCisgICAqICAgICAgICBhbmQgY3JlYXRlIGZhY2VzIHdoZW4gcmVtb3RlIGhvc3QgbWFrZXMgYSBjb25uZWN0aW9uCisgICAqIFxwYXJhbSBvbkZhY2VDcmVhdGVkICBDYWxsYmFjayB0byBub3RpZnkgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZiB0aGUgZmFjZQorICAgKgorICAgKiBcdGhyb3dzIFdlYlNvY2tldENoYW5uZWw6OkVycm9yIGlmIGNhbGxlZCBtdWx0aXBsZSB0aW1lcworICAgKi8KKyAgdm9pZAorICBsaXN0ZW4oY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25GYWNlQ3JlYXRlZCk7CisKKyAgLyoqCisgICAqIFxicmllZiBHZXQgbnVtYmVyIG9mIGZhY2VzIGluIHRoZSBjaGFubmVsCisgICAqLworICBzaXplX3QKKyAgc2l6ZSgpIGNvbnN0OworCisgIGJvb2wKKyAgaXNMaXN0ZW5pbmcoKSBjb25zdDsKKworICB2b2lkCisgIHNldFBpbmdJbnRlcnZhbCh0aW1lOjptaWxsaXNlY29uZHMgaW50ZXJ2YWwpCisgIHsKKyAgICBtX3BpbmdJbnRlcnZhbCA9IGludGVydmFsOworICB9CisKKyAgdm9pZAorICBzZXRQb25nVGltZW91dCh0aW1lOjptaWxsaXNlY29uZHMgdGltZW91dCk7CisKK3ByaXZhdGU6CisgIHZvaWQKKyAgc2VuZFBpbmcod2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCk7CisKKyAgdm9pZAorICBoYW5kbGVQb25nKHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbCBoZGwsIHN0ZDo6c3RyaW5nIG1zZyk7CisKKyAgdm9pZAorICBoYW5kbGVQb25nVGltZW91dCh3ZWJzb2NrZXRwcDo6Y29ubmVjdGlvbl9oZGwgaGRsLCBzdGQ6OnN0cmluZyBtc2cpOworCisgIHZvaWQKKyAgaGFuZGxlTWVzc2FnZSh3ZWJzb2NrZXRwcDo6Y29ubmVjdGlvbl9oZGwgaGRsLCB3ZWJzb2NrZXQ6OlNlcnZlcjo6bWVzc2FnZV9wdHIgbXNnKTsKKworICB2b2lkCisgIGhhbmRsZU9wZW4od2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCk7CisKKyAgdm9pZAorICBoYW5kbGVDbG9zZSh3ZWJzb2NrZXRwcDo6Y29ubmVjdGlvbl9oZGwgaGRsKTsKKworcHJpdmF0ZToKKyAgd2Vic29ja2V0OjpFbmRwb2ludCBtX2xvY2FsRW5kcG9pbnQ7CisKKyAgd2Vic29ja2V0OjpTZXJ2ZXIgbV9zZXJ2ZXI7CisKKyAgLyoqCisgICAqIENhbGxiYWNrcyBmb3IgZmFjZSBjcmVhdGlvbi4KKyAgICogTmV3IGNvbW11bmljYXRpb25zIGFyZSBkZXRlY3RlZCB1c2luZyBhc3luY19yZWNlaXZlX2Zyb20uCisgICAqIEl0cyBoYW5kbGVyIGhhcyBhIGZpeGVkIHNpZ25hdHVyZS4gTm8gc3BhY2UgZm9yIHRoZSBmYWNlIGNhbGxiYWNrCisgICAqLworICBGYWNlQ3JlYXRlZENhbGxiYWNrIG1fb25GYWNlQ3JlYXRlZENhbGxiYWNrOworCisgIHR5cGVkZWYgc3RkOjptYXA8IHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbCwgc2hhcmVkX3B0cjxXZWJTb2NrZXRGYWNlPiwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpvd25lcl9sZXNzPHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbD4gPiBDaGFubmVsRmFjZU1hcDsKKyAgQ2hhbm5lbEZhY2VNYXAgbV9jaGFubmVsRmFjZXM7CisKKyAgLyoqCisgICAqIFxicmllZiBJZiB0cnVlLCBpdCBtZWFucyB0aGUgZnVuY3Rpb24gbGlzdGVuIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkCisgICAqLworICBib29sIG1faXNMaXN0ZW5pbmc7CisKKyAgdGltZTo6bWlsbGlzZWNvbmRzIG1fcGluZ0ludGVydmFsOworfTsKKworaW5saW5lIGJvb2wKK1dlYlNvY2tldENoYW5uZWw6OmlzTGlzdGVuaW5nKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1faXNMaXN0ZW5pbmc7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX1dFQlNPQ0tFVF9DSEFOTkVMX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldC1mYWNlLmNwcCBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkOGIzYwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtZmFjZS5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ3ZWJzb2NrZXQtZmFjZS5ocHAiCisjaW5jbHVkZSAiY29yZS9nbG9iYWwtaW8uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJXZWJTb2NrZXRGYWNlIik7CisKK1dlYlNvY2tldEZhY2U6OldlYlNvY2tldEZhY2UoY29uc3QgRmFjZVVyaSYgcmVtb3RlVXJpLCBjb25zdCBGYWNlVXJpJiBsb2NhbFVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vic29ja2V0OjpTZXJ2ZXImIHNlcnZlcikKKyAgOiBGYWNlKHJlbW90ZVVyaSwgbG9jYWxVcmkpCisgICwgbV9oYW5kbGUoaGRsKQorICAsIG1fc2VydmVyKHNlcnZlcikKKyAgLCBtX2Nsb3NlZChmYWxzZSkKK3sKKyAgdGhpcy0+c2V0T25EZW1hbmQodHJ1ZSk7Cit9CisKK3ZvaWQKK1dlYlNvY2tldEZhY2U6OnNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIGlmIChtX2Nsb3NlZCkKKyAgICByZXR1cm47CisKKyAgdGhpcy0+b25TZW5kSW50ZXJlc3QoaW50ZXJlc3QpOworICBjb25zdCBCbG9jayYgcGF5bG9hZCA9IGludGVyZXN0LndpcmVFbmNvZGUoKTsKKyAgdGhpcy0+Z2V0TXV0YWJsZUNvdW50ZXJzKCkuZ2V0Tk91dEJ5dGVzKCkgKz0gcGF5bG9hZC5zaXplKCk7CisKKyAgdHJ5IHsKKyAgICBtX3NlcnZlci5zZW5kKG1faGFuZGxlLCBwYXlsb2FkLndpcmUoKSwgcGF5bG9hZC5zaXplKCksCisgICAgICAgICAgICAgICAgICB3ZWJzb2NrZXRwcDo6ZnJhbWU6Om9wY29kZTo6YmluYXJ5KTsKKyAgfQorICBjYXRjaCAoY29uc3Qgd2Vic29ja2V0cHA6OmxpYjo6ZXJyb3JfY29kZSYgZSkgeworICAgIE5GRF9MT0dfREVCVUcoIkZhaWxlZCB0byBzZW5kIEludGVyZXN0IGJlY2F1c2U6ICIgPDwgZQorICAgICAgICAgICAgICAgICAgPDwgIigiIDw8IGUubWVzc2FnZSgpIDw8ICIpIik7CisgIH0KK30KKwordm9pZAorV2ViU29ja2V0RmFjZTo6c2VuZERhdGEoY29uc3QgRGF0YSYgZGF0YSkKK3sKKyAgaWYgKG1fY2xvc2VkKQorICAgIHJldHVybjsKKworICB0aGlzLT5vblNlbmREYXRhKGRhdGEpOworICBjb25zdCBCbG9jayYgcGF5bG9hZCA9IGRhdGEud2lyZUVuY29kZSgpOworICB0aGlzLT5nZXRNdXRhYmxlQ291bnRlcnMoKS5nZXROT3V0Qnl0ZXMoKSArPSBwYXlsb2FkLnNpemUoKTsKKworICB0cnkgeworICAgIG1fc2VydmVyLnNlbmQobV9oYW5kbGUsIHBheWxvYWQud2lyZSgpLCBwYXlsb2FkLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgIHdlYnNvY2tldHBwOjpmcmFtZTo6b3Bjb2RlOjpiaW5hcnkpOworICB9CisgIGNhdGNoIChjb25zdCB3ZWJzb2NrZXRwcDo6bGliOjplcnJvcl9jb2RlJiBlKSB7CisgICAgTkZEX0xPR19ERUJVRygiRmFpbGVkIHRvIHNlbmQgRGF0YSBiZWNhdXNlOiAiIDw8IGUKKyAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBlLm1lc3NhZ2UoKSA8PCAiKSIpOworICB9Cit9CisKK3ZvaWQKK1dlYlNvY2tldEZhY2U6OmNsb3NlKCkKK3sKKyAgaWYgKG1fY2xvc2VkID09IGZhbHNlKQorICAgIHsKKyAgICAgIG1fY2xvc2VkID0gdHJ1ZTsKKyAgICAgIHNjaGVkdWxlcjo6Y2FuY2VsKG1fcGluZ0V2ZW50SWQpOworICAgICAgd2Vic29ja2V0cHA6OmxpYjo6ZXJyb3JfY29kZSBlY29kZTsKKyAgICAgIG1fc2VydmVyLmNsb3NlKG1faGFuZGxlLCB3ZWJzb2NrZXRwcDo6Y2xvc2U6OnN0YXR1czo6bm9ybWFsLCAiY2xvc2VkIGJ5IG5mZCIsIGVjb2RlKTsKKworICAgICAgZmFpbCgiRmFjZSBjbG9zZWQiKTsKKyAgICB9Cit9CisKK3ZvaWQKK1dlYlNvY2tldEZhY2U6OmhhbmRsZVJlY2VpdmUoY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykKK3sKKyAgLy8gQ29weSBtZXNzYWdlIGludG8gRmFjZSBpbnRlcm5hbCBidWZmZXIKKyAgaWYgKG1zZy5zaXplKCkgPiBuZG46Ok1BWF9ORE5fUEFDS0VUX1NJWkUpCisgICAgeworICAgICAgTkZEX0xPR19XQVJOKCJbaWQ6IiA8PCB0aGlzLT5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgPDwgIl0gUmVjZWl2ZWQgV2ViU29ja2V0IG1lc3NhZ2Ugc2l6ZSBbIgorICAgICAgICAgICAgICAgICAgIDw8IG1zZy5zaXplKCkgPDwgIl0gaXMgdG9vIGJpZyIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0aGlzLT5nZXRNdXRhYmxlQ291bnRlcnMoKS5nZXROSW5CeXRlcygpICs9IG1zZy5zaXplKCk7CisKKyAgLy8gVHJ5IHRvIHBhcnNlIG1lc3NhZ2UgZGF0YQorICBib29sIGlzT2sgPSB0cnVlOworICBCbG9jayBlbGVtZW50OworICBpc09rID0gQmxvY2s6OmZyb21CdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4obXNnLmNfc3RyKCkpLCBtc2cuc2l6ZSgpLCBlbGVtZW50KTsKKyAgaWYgKCFpc09rKQorICAgIHsKKyAgICAgIE5GRF9MT0dfV0FSTigiW2lkOiIgPDwgdGhpcy0+Z2V0SWQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJdIFJlY2VpdmVkIGludmFsaWQgTkROIHBhY2tldCBvZiBsZW5ndGggWyIKKyAgICAgICAgICAgICAgICAgICA8PCBtc2cuc2l6ZSgpIDw8ICJdIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghdGhpcy0+ZGVjb2RlQW5kRGlzcGF0Y2hJbnB1dChlbGVtZW50KSkKKyAgICB7CisgICAgICBORkRfTE9HX1dBUk4oIltpZDoiIDw8IHRoaXMtPmdldElkKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiXSBSZWNlaXZlZCB1bnJlY29nbml6ZWQgYmxvY2sgb2YgdHlwZSBbIgorICAgICAgICAgICAgICAgICAgIDw8IGVsZW1lbnQudHlwZSgpIDw8ICJdIik7CisgICAgICAvLyBpZ25vcmUgdW5rbm93biBwYWNrZXQgYW5kIHByb2NlZWQKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldC1mYWNlLmhwcCBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhMTExMQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtZmFjZS5ocHAKQEAgLTAsMCArMSw4NSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfV0VCU09DS0VUX0ZBQ0VfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9XRUJTT0NLRVRfRkFDRV9IUFAKKworI2luY2x1ZGUgImZhY2UuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisKKyNpZm5kZWYgSEFWRV9XRUJTT0NLRVQKKyNlcnJvciAiQ2Fubm90IGluY2x1ZGUgdGhpcyBmaWxlIHdoZW4gV2ViU29ja2V0IHN1cHBvcnQgaXMgbm90IGVuYWJsZWQiCisjZW5kaWYgLy8gSEFWRV9XRUJTT0NLRVQKKworI2luY2x1ZGUgIndlYnNvY2tldHBwLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK25hbWVzcGFjZSB3ZWJzb2NrZXQgewordHlwZWRlZiBib29zdDo6YXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgRW5kcG9pbnQ7Cit0eXBlZGVmIHdlYnNvY2tldHBwOjpzZXJ2ZXI8d2Vic29ja2V0cHA6OmNvbmZpZzo6YXNpbz4gU2VydmVyOworfSAvLyBuYW1lc3BhY2Ugd2Vic29ja2V0CisKKworLyoqCisgKiBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgRmFjZSBhYnN0cmFjdGlvbiB0aGF0IHVzZXMgV2ViU29ja2V0CisgKiAgICAgICAgYXMgdW5kZXJseWluZyB0cmFuc3BvcnQgbWVjaGFuaXNtCisgKi8KK2NsYXNzIFdlYlNvY2tldEZhY2UgOiBwdWJsaWMgRmFjZQoreworcHVibGljOgorICBXZWJTb2NrZXRGYWNlKGNvbnN0IEZhY2VVcmkmIHJlbW90ZVVyaSwgY29uc3QgRmFjZVVyaSYgbG9jYWxVcmksCisgICAgICAgICAgICAgICAgd2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCwgd2Vic29ja2V0OjpTZXJ2ZXImIHNlcnZlcik7CisKKyAgLy8gZnJvbSBGYWNlCisgIHZpcnR1YWwgdm9pZAorICBzZW5kSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KTsKKworICB2aXJ0dWFsIHZvaWQKKyAgc2VuZERhdGEoY29uc3QgRGF0YSYgZGF0YSk7CisKKyAgdmlydHVhbCB2b2lkCisgIGNsb3NlKCk7CisKKyAgdm9pZAorICBzZXRQaW5nRXZlbnRJZChFdmVudElkJiBpZCkKKyAgeworICAgIG1fcGluZ0V2ZW50SWQgPSBpZDsKKyAgfQorCisgIHZvaWQKKyAgaGFuZGxlUmVjZWl2ZShjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworcHJpdmF0ZToKKyAgd2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIG1faGFuZGxlOworICB3ZWJzb2NrZXQ6OlNlcnZlciYgbV9zZXJ2ZXI7CisgIEV2ZW50SWQgbV9waW5nRXZlbnRJZDsKKyAgYm9vbCBtX2Nsb3NlZDsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX1dFQlNPQ0tFVF9GQUNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldC1mYWN0b3J5LmNwcCBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtZmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmM2FmZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXQtZmFjdG9yeS5jcHAKQEAgLTAsMCArMSw5MSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIndlYnNvY2tldC1mYWN0b3J5LmhwcCIKKyNpbmNsdWRlICJjb3JlL3Jlc29sdmVyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBib29zdDo6YXNpbzsKKworTkZEX0xPR19JTklUKCJXZWJTb2NrZXRGYWN0b3J5Iik7CisKK1dlYlNvY2tldEZhY3Rvcnk6OldlYlNvY2tldEZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRQb3J0KQorICA6IG1fZGVmYXVsdFBvcnQoZGVmYXVsdFBvcnQpCit7Cit9CisKK3NoYXJlZF9wdHI8V2ViU29ja2V0Q2hhbm5lbD4KK1dlYlNvY2tldEZhY3Rvcnk6OmNyZWF0ZUNoYW5uZWwoY29uc3Qgd2Vic29ja2V0OjpFbmRwb2ludCYgZW5kcG9pbnQpCit7CisgIHNoYXJlZF9wdHI8V2ViU29ja2V0Q2hhbm5lbD4gY2hhbm5lbCA9IGZpbmRDaGFubmVsKGVuZHBvaW50KTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGNoYW5uZWwpKQorICAgIHJldHVybiBjaGFubmVsOworCisgIGNoYW5uZWwgPSBtYWtlX3NoYXJlZDxXZWJTb2NrZXRDaGFubmVsPihlbmRwb2ludCk7CisgIG1fY2hhbm5lbHNbZW5kcG9pbnRdID0gY2hhbm5lbDsKKworICByZXR1cm4gY2hhbm5lbDsKK30KKworc2hhcmVkX3B0cjxXZWJTb2NrZXRDaGFubmVsPgorV2ViU29ja2V0RmFjdG9yeTo6Y3JlYXRlQ2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBvcnQpCit7CisgIGlwOjp0Y3A6OmVuZHBvaW50IHRjcEVuZHBvaW50ID0gVGNwUmVzb2x2ZXI6OnN5bmNSZXNvbHZlKGhvc3QsIHBvcnQpOworICB3ZWJzb2NrZXQ6OkVuZHBvaW50IGVuZHBvaW50KHRjcEVuZHBvaW50LmFkZHJlc3MoKSwgdGNwRW5kcG9pbnQucG9ydCgpKTsKKyAgcmV0dXJuIGNyZWF0ZUNoYW5uZWwoZW5kcG9pbnQpOworfQorCitzaGFyZWRfcHRyPFdlYlNvY2tldENoYW5uZWw+CitXZWJTb2NrZXRGYWN0b3J5OjpmaW5kQ2hhbm5lbChjb25zdCB3ZWJzb2NrZXQ6OkVuZHBvaW50JiBsb2NhbEVuZHBvaW50KQoreworICBDaGFubmVsTWFwOjppdGVyYXRvciBpID0gbV9jaGFubmVscy5maW5kKGxvY2FsRW5kcG9pbnQpOworICBpZiAoaSAhPSBtX2NoYW5uZWxzLmVuZCgpKQorICAgIHJldHVybiBpLT5zZWNvbmQ7CisgIGVsc2UKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxXZWJTb2NrZXRDaGFubmVsPigpOworfQorCit2b2lkCitXZWJTb2NrZXRGYWN0b3J5OjpjcmVhdGVGYWNlKGNvbnN0IEZhY2VVcmkmIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlQ29ubmVjdEZhaWxlZENhbGxiYWNrJiBvbkNvbm5lY3RGYWlsZWQpCit7CisgIHRocm93IEVycm9yKCJXZWJTb2NrZXRGYWN0b3J5IGRvZXMgbm90IHN1cHBvcnQgJ2NyZWF0ZUZhY2UnIG9wZXJhdGlvbiIpOworfQorCitzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+CitXZWJTb2NrZXRGYWN0b3J5OjpnZXRDaGFubmVscygpIGNvbnN0Cit7CisgIHN0ZDo6bGlzdDxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID4gY2hhbm5lbHM7CisgIGZvciAoQ2hhbm5lbE1hcDo6Y29uc3RfaXRlcmF0b3IgaSA9IG1fY2hhbm5lbHMuYmVnaW4oKTsgaSAhPSBtX2NoYW5uZWxzLmVuZCgpOyArK2kpCisgICAgeworICAgICAgY2hhbm5lbHMucHVzaF9iYWNrKGktPnNlY29uZCk7CisgICAgfQorCisgIHJldHVybiBjaGFubmVsczsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2ZhY2Uvd2Vic29ja2V0LWZhY3RvcnkuaHBwIGIvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldC1mYWN0b3J5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E2MzI0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldC1mYWN0b3J5LmhwcApAQCAtMCwwICsxLDExMCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfV0VCU09DS0VUX0ZBQ1RPUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9XRUJTT0NLRVRfRkFDVE9SWV9IUFAKKworI2luY2x1ZGUgInByb3RvY29sLWZhY3RvcnkuaHBwIgorI2luY2x1ZGUgIndlYnNvY2tldC1jaGFubmVsLmhwcCIKKworCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgV2ViU29ja2V0RmFjdG9yeSA6IHB1YmxpYyBQcm90b2NvbEZhY3RvcnkKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIFxicmllZiBFeGNlcHRpb24gb2YgV2ViU29ja2V0RmFjdG9yeQorICAgKi8KKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgUHJvdG9jb2xGYWN0b3J5OjpFcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0KQorICAgICAgOiBQcm90b2NvbEZhY3Rvcnk6OkVycm9yKHdoYXQpCisgICAgeworICAgIH0KKyAgfTsKKworICBleHBsaWNpdAorICBXZWJTb2NrZXRGYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0UG9ydCk7CisKKyAgLyoqCisgICAqIFxicmllZiBDcmVhdGUgV2ViU29ja2V0LWJhc2VkIGNoYW5uZWwgdXNpbmcgd2Vic29ja2V0OjpFbmRwb2ludAorICAgKgorICAgKiB3ZWJzb2NrZXQ6OkVuZHBvaW50IGlzIHJlYWxseSBhbiBhbGlhcyBmb3IgYm9vc3Q6OmFzaW86OmlwOjp0Y3A6OmVuZHBvaW50LgorICAgKgorICAgKiBJZiB0aGlzIG1ldGhvZCBjYWxsZWQgdHdpY2Ugd2l0aCB0aGUgc2FtZSBlbmRwb2ludCwgb25seSBvbmUgY2hhbm5lbAorICAgKiB3aWxsIGJlIGNyZWF0ZWQuICBUaGUgc2Vjb25kIGNhbGwgd2lsbCBqdXN0IHJldHJpZXZlIHRoZSBleGlzdGluZworICAgKiBjaGFubmVsLgorICAgKgorICAgKiBccmV0dXJucyBhbHdheXMgYSB2YWxpZCBwb2ludGVyIHRvIGEgV2ViU29ja2V0Q2hhbm5lbCBvYmplY3QsIGFuIGV4Y2VwdGlvbgorICAgKiAgICAgICAgICBpcyB0aHJvd24gaWYgaXQgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAqCisgICAqIFx0aHJvd3MgV2ViU29ja2V0RmFjdG9yeTo6RXJyb3IsIFRjcFJlc29sdmVyOjpFcnJvcgorICAgKgorICAgKi8KKyAgc2hhcmVkX3B0cjxXZWJTb2NrZXRDaGFubmVsPgorICBjcmVhdGVDaGFubmVsKGNvbnN0IHdlYnNvY2tldDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpOworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlIFdlYlNvY2tldC1iYXNlZCBjaGFubmVsIHVzaW5nIHNwZWNpZmllZCBpcCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlcgorICAgKgorICAgKiBcdGhyb3dzIFdlYlNvY2tldEZhY3Rvcnk6OkVycm9yCisgICAqLworICBzaGFyZWRfcHRyPFdlYlNvY2tldENoYW5uZWw+CisgIGNyZWF0ZUNoYW5uZWwoY29uc3Qgc3RkOjpzdHJpbmcmIGlwQWRkcmVzcywgY29uc3Qgc3RkOjpzdHJpbmcmIHBvcnQpOworCisgIC8vIGZyb20gRmFjdG9yeQorICB2aXJ0dWFsIHZvaWQKKyAgY3JlYXRlRmFjZShjb25zdCBGYWNlVXJpJiB1cmksCisgICAgICAgICAgICAgY29uc3QgRmFjZUNyZWF0ZWRDYWxsYmFjayYgb25DcmVhdGVkLAorICAgICAgICAgICAgIGNvbnN0IEZhY2VDb25uZWN0RmFpbGVkQ2FsbGJhY2smIG9uQ29ubmVjdEZhaWxlZCk7CisKKyAgdmlydHVhbCBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+CisgIGdldENoYW5uZWxzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisKKyAgLyoqCisgICAqIFxicmllZiBMb29rIHVwIFdlYlNvY2tldENoYW5uZWwgdXNpbmcgc3BlY2lmaWVkIGxvY2FsIGVuZHBvaW50CisgICAqCisgICAqIFxyZXR1cm5zIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBXZWJTb2NrZXRDaGFubmVsIG9iamVjdAorICAgKiAgICAgICAgICBvciBlbXB0eSBzaGFyZWQgcG9pbnRlciB3aGVuIHN1Y2ggY2hhbm5lbCBkb2VzIG5vdCBleGlzdAorICAgKgorICAgKiBcdGhyb3dzIG5ldmVyCisgICAqLworICBzaGFyZWRfcHRyPFdlYlNvY2tldENoYW5uZWw+CisgIGZpbmRDaGFubmVsKGNvbnN0IHdlYnNvY2tldDo6RW5kcG9pbnQmIGxvY2FsRW5kcG9pbnQpOworCisgIHR5cGVkZWYgc3RkOjptYXA8IHdlYnNvY2tldDo6RW5kcG9pbnQsIHNoYXJlZF9wdHI8V2ViU29ja2V0Q2hhbm5lbD4gPiBDaGFubmVsTWFwOworICBDaGFubmVsTWFwIG1fY2hhbm5lbHM7CisKKyAgc3RkOjpzdHJpbmcgbV9kZWZhdWx0UG9ydDsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GQUNFX1dFQlNPQ0tFVF9GQUNUT1JZX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mYWNlL3dlYnNvY2tldHBwLmhwcCBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXRwcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MGJkMQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZmFjZS93ZWJzb2NrZXRwcC5ocHAKQEAgLTAsMCArMSw0MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZBQ0VfV0VCU09DS0VUUFBfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRkFDRV9XRUJTT0NLRVRQUF9IUFAKKworI2lmbmRlZiBIQVZFX1dFQlNPQ0tFVAorI2Vycm9yICJUaGlzIGZpbGUgbXVzdCBub3QgYmUgaW5jbHVkZWQgd2hlbiBXZWJTb2NrZXQgRmFjZSBzdXBwb3J0IGlzIGRpc2FibGVkIgorI2VuZGlmCisKKy8vIHN1cHByZXNzIHdlYnNvY2tldHBwIHdhcm5pbmdzCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjcHJhZ21hIGNsYW5nIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgIndlYnNvY2tldHBwL2NvbmZpZy9hc2lvX25vX3Rscy5ocHAiCisjaW5jbHVkZSAid2Vic29ja2V0cHAvc2VydmVyLmhwcCIKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRkFDRV9XRUJTT0NLRVRQUF9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvYXZhaWxhYmxlLXN0cmF0ZWdpZXMuY3BwIGIvTkZEL2RhZW1vbi9mdy9hdmFpbGFibGUtc3RyYXRlZ2llcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViZTI3MAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZncvYXZhaWxhYmxlLXN0cmF0ZWdpZXMuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJiZXN0LXJvdXRlLXN0cmF0ZWd5LmhwcCIKKyNpbmNsdWRlICJicm9hZGNhc3Qtc3RyYXRlZ3kuaHBwIgorI2luY2x1ZGUgImNsaWVudC1jb250cm9sLXN0cmF0ZWd5LmhwcCIKKyNpbmNsdWRlICJuY2Mtc3RyYXRlZ3kuaHBwIgorI2luY2x1ZGUgImJlc3Qtcm91dGUtc3RyYXRlZ3kyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgZncgeworCitzaGFyZWRfcHRyPFN0cmF0ZWd5PgorbWFrZURlZmF1bHRTdHJhdGVneShGb3J3YXJkZXImIGZvcndhcmRlcikKK3sKKyAgcmV0dXJuIG1ha2Vfc2hhcmVkPEJlc3RSb3V0ZVN0cmF0ZWd5Mj4ocmVmKGZvcndhcmRlcikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgoraW5saW5lIHZvaWQKK2luc3RhbGxTdHJhdGVneShGb3J3YXJkZXImIGZvcndhcmRlcikKK3sKKyAgU3RyYXRlZ3lDaG9pY2UmIHN0cmF0ZWd5Q2hvaWNlID0gZm9yd2FyZGVyLmdldFN0cmF0ZWd5Q2hvaWNlKCk7CisgIGlmICghc3RyYXRlZ3lDaG9pY2UuaGFzU3RyYXRlZ3koUzo6U1RSQVRFR1lfTkFNRSkpIHsKKyAgICBzdHJhdGVneUNob2ljZS5pbnN0YWxsKG1ha2Vfc2hhcmVkPFM+KHJlZihmb3J3YXJkZXIpKSk7CisgIH0KK30KKwordm9pZAoraW5zdGFsbFN0cmF0ZWdpZXMoRm9yd2FyZGVyJiBmb3J3YXJkZXIpCit7CisgIGluc3RhbGxTdHJhdGVneTxCZXN0Um91dGVTdHJhdGVneT4oZm9yd2FyZGVyKTsKKyAgaW5zdGFsbFN0cmF0ZWd5PEJyb2FkY2FzdFN0cmF0ZWd5Pihmb3J3YXJkZXIpOworICBpbnN0YWxsU3RyYXRlZ3k8Q2xpZW50Q29udHJvbFN0cmF0ZWd5Pihmb3J3YXJkZXIpOworICBpbnN0YWxsU3RyYXRlZ3k8TmNjU3RyYXRlZ3k+KGZvcndhcmRlcik7CisgIGluc3RhbGxTdHJhdGVneTxCZXN0Um91dGVTdHJhdGVneTI+KGZvcndhcmRlcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGZ3Cit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvYXZhaWxhYmxlLXN0cmF0ZWdpZXMuaHBwIGIvTkZEL2RhZW1vbi9mdy9hdmFpbGFibGUtc3RyYXRlZ2llcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2YTFiNAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZncvYXZhaWxhYmxlLXN0cmF0ZWdpZXMuaHBwCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GV19BVkFJTEFCTEVfU1RSQVRFR0lFU19IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GV19BVkFJTEFCTEVfU1RSQVRFR0lFU19IUFAKKworI2luY2x1ZGUgInN0cmF0ZWd5LmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgZncgeworCitzaGFyZWRfcHRyPFN0cmF0ZWd5PgorbWFrZURlZmF1bHRTdHJhdGVneShGb3J3YXJkZXImIGZvcndhcmRlcik7CisKK3ZvaWQKK2luc3RhbGxTdHJhdGVnaWVzKEZvcndhcmRlciYgZm9yd2FyZGVyKTsKKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GV19BVkFJTEFCTEVfU1RSQVRFR0lFU19IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvYmVzdC1yb3V0ZS1zdHJhdGVneS5jcHAgYi9ORkQvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGJiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJiZXN0LXJvdXRlLXN0cmF0ZWd5LmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgZncgeworCitjb25zdCBOYW1lIEJlc3RSb3V0ZVN0cmF0ZWd5OjpTVFJBVEVHWV9OQU1FKCJuZG46L2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvYmVzdC1yb3V0ZS8lRkQlMDEiKTsKKworQmVzdFJvdXRlU3RyYXRlZ3k6OkJlc3RSb3V0ZVN0cmF0ZWd5KEZvcndhcmRlciYgZm9yd2FyZGVyLCBjb25zdCBOYW1lJiBuYW1lKQorICA6IFN0cmF0ZWd5KGZvcndhcmRlciwgbmFtZSkKK3sKK30KKworQmVzdFJvdXRlU3RyYXRlZ3k6On5CZXN0Um91dGVTdHJhdGVneSgpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorcHJlZGljYXRlX1BpdEVudHJ5X2NhbkZvcndhcmRUb19OZXh0SG9wKHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmliOjpOZXh0SG9wJiBuZXh0aG9wKQoreworICByZXR1cm4gcGl0RW50cnktPmNhbkZvcndhcmRUbygqbmV4dGhvcC5nZXRGYWNlKCkpOworfQorCit2b2lkCitCZXN0Um91dGVTdHJhdGVneTo6YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoY29uc3QgRmFjZSYgaW5GYWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5LAorICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpCit7CisgIGlmIChwaXRFbnRyeS0+aGFzVW5leHBpcmVkT3V0UmVjb3JkcygpKSB7CisgICAgLy8gbm90IGEgbmV3IEludGVyZXN0LCBkb24ndCBmb3J3YXJkCisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHMgPSBmaWJFbnRyeS0+Z2V0TmV4dEhvcHMoKTsKKyAgZmliOjpOZXh0SG9wTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGQ6OmZpbmRfaWYobmV4dGhvcHMuYmVnaW4oKSwgbmV4dGhvcHMuZW5kKCksCisgICAgYmluZCgmcHJlZGljYXRlX1BpdEVudHJ5X2NhbkZvcndhcmRUb19OZXh0SG9wLCBwaXRFbnRyeSwgXzEpKTsKKworICBpZiAoaXQgPT0gbmV4dGhvcHMuZW5kKCkpIHsKKyAgICB0aGlzLT5yZWplY3RQZW5kaW5nSW50ZXJlc3QocGl0RW50cnkpOworICAgIHJldHVybjsKKyAgfQorCisgIHNoYXJlZF9wdHI8RmFjZT4gb3V0RmFjZSA9IGl0LT5nZXRGYWNlKCk7CisgIHRoaXMtPnNlbmRJbnRlcmVzdChwaXRFbnRyeSwgb3V0RmFjZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGZ3Cit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvYmVzdC1yb3V0ZS1zdHJhdGVneS5ocHAgYi9ORkQvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzY0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kuaHBwCkBAIC0wLDAgKzEsNjYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GV19CRVNUX1JPVVRFX1NUUkFURUdZX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZXX0JFU1RfUk9VVEVfU1RSQVRFR1lfSFBQCisKKyNpbmNsdWRlICJzdHJhdGVneS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIGZ3IHsKKworLyoqIFxicmllZiBCZXN0IFJvdXRlIHN0cmF0ZWd5IHZlcnNpb24gMQorICoKKyAqICBUaGlzIHN0cmF0ZWd5IGZvcndhcmRzIGEgbmV3IEludGVyZXN0IHRvIHRoZSBsb3dlc3QtY29zdCBuZXh0aG9wCisgKiAgdGhhdCBpcyBub3Qgc2FtZSBhcyB0aGUgZG93bnN0cmVhbSwgYW5kIGRvZXMgbm90IHZpb2xhdGUgc2NvcGUuCisgKiAgU3Vic2VxdWVudCBzaW1pbGFyIEludGVyZXN0cyBvciBjb25zdW1lciByZXRyYW5zbWlzc2lvbnMgYXJlIHN1cHByZXNzZWQKKyAqICB1bnRpbCBhZnRlciBJbnRlcmVzdExpZmV0aW1lIGV4cGlyeS4KKyAqCisgKiAgXGRlcHJlY2F0ZWQgVGhpcyBzdHJhdGVneSBpcyBzdXBlcmNlZGVkIGJ5IEJlc3QgUm91dGUgc3RyYXRlZ3kgdmVyc2lvbiAyLAorICogICAgICAgICAgICAgIHdoaWNoIGFsbG93cyBjb25zdW1lciByZXRyYW5zbWlzc2lvbnMuIFRoaXMgdmVyc2lvbiBpcyBrZXB0IGZvcgorICogICAgICAgICAgICAgIGNvbXBhcmlzb24gcHVycG9zZXMgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgZ2VuZXJhbCB1c2FnZS4KKyAqLworY2xhc3MgQmVzdFJvdXRlU3RyYXRlZ3kgOiBwdWJsaWMgU3RyYXRlZ3kKK3sKK3B1YmxpYzoKKyAgQmVzdFJvdXRlU3RyYXRlZ3koRm9yd2FyZGVyJiBmb3J3YXJkZXIsIGNvbnN0IE5hbWUmIG5hbWUgPSBTVFJBVEVHWV9OQU1FKTsKKworICB2aXJ0dWFsCisgIH5CZXN0Um91dGVTdHJhdGVneSgpOworCisgIHZpcnR1YWwgdm9pZAorICBhZnRlclJlY2VpdmVJbnRlcmVzdChjb25zdCBGYWNlJiBpbkZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkgREVDTF9PVkVSUklERTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgTmFtZSBTVFJBVEVHWV9OQU1FOworfTsKKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GV19CRVNUX1JPVVRFX1NUUkFURUdZX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mdy9iZXN0LXJvdXRlLXN0cmF0ZWd5Mi5jcHAgYi9ORkQvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDRmNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mdy9iZXN0LXJvdXRlLXN0cmF0ZWd5Mi5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJiZXN0LXJvdXRlLXN0cmF0ZWd5Mi5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmdyB7CisKK05GRF9MT0dfSU5JVCgiQmVzdFJvdXRlU3RyYXRlZ3kyIik7CisKK2NvbnN0IE5hbWUgQmVzdFJvdXRlU3RyYXRlZ3kyOjpTVFJBVEVHWV9OQU1FKCJuZG46L2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvYmVzdC1yb3V0ZS8lRkQlMDIiKTsKKy8vLyBcdG9kbyBkb24ndCB1c2UgZml4ZWQgaW50ZXJ2YWw7IG1ha2UgaXQgYWRhcHRpdmUgb3IgdXNlIGV4cG9uZW50aWFsIGJhY2stb2ZmICMxOTEzCitjb25zdCB0aW1lOjptaWxsaXNlY29uZHMgQmVzdFJvdXRlU3RyYXRlZ3kyOjpNSU5fUkVUUkFOU01JU1NJT05fSU5URVJWQUwoMTAwKTsKKworQmVzdFJvdXRlU3RyYXRlZ3kyOjpCZXN0Um91dGVTdHJhdGVneTIoRm9yd2FyZGVyJiBmb3J3YXJkZXIsIGNvbnN0IE5hbWUmIG5hbWUpCisgIDogU3RyYXRlZ3koZm9yd2FyZGVyLCBuYW1lKQoreworfQorCisvKiogXGJyaWVmIGRldGVybWluZXMgd2hldGhlciBhIE5leHRIb3AgaXMgZWxpZ2libGUKKyAqICBccGFyYW0gY3VycmVudERvd25zdHJlYW0gaW5jb21pbmcgRmFjZUlkIG9mIGN1cnJlbnQgSW50ZXJlc3QKKyAqICBccGFyYW0gd2FudFVudXNlZCBpZiB0cnVlLCBOZXh0SG9wIG11c3Qgbm90IGhhdmUgdW5leHBpcmVkIE91dFJlY29yZAorICogIFxwYXJhbSBub3cgdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSwgaWdub3JlZCBpZiAhd2FudFVudXNlZAorICovCitzdGF0aWMgaW5saW5lIGJvb2wKK3ByZWRpY2F0ZV9OZXh0SG9wX2VsaWdpYmxlKGNvbnN0IHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4mIHBpdEVudHJ5LAorICBjb25zdCBmaWI6Ok5leHRIb3AmIG5leHRob3AsIEZhY2VJZCBjdXJyZW50RG93bnN0cmVhbSwKKyAgYm9vbCB3YW50VW51c2VkID0gZmFsc2UsCisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IG5vdyA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50OjptaW4oKSkKK3sKKyAgc2hhcmVkX3B0cjxGYWNlPiB1cHN0cmVhbSA9IG5leHRob3AuZ2V0RmFjZSgpOworCisgIC8vIHVwc3RyZWFtIGlzIGN1cnJlbnQgZG93bnN0cmVhbQorICBpZiAodXBzdHJlYW0tPmdldElkKCkgPT0gY3VycmVudERvd25zdHJlYW0pCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIGZvcndhcmRpbmcgd291bGQgdmlvbGF0ZSBzY29wZQorICBpZiAocGl0RW50cnktPnZpb2xhdGVzU2NvcGUoKnVwc3RyZWFtKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHdhbnRVbnVzZWQpIHsKKyAgICAvLyBOZXh0SG9wIG11c3Qgbm90IGhhdmUgdW5leHBpcmVkIE91dFJlY29yZAorICAgIHBpdDo6T3V0UmVjb3JkQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3Igb3V0UmVjb3JkID0gcGl0RW50cnktPmdldE91dFJlY29yZCgqdXBzdHJlYW0pOworICAgIGlmIChvdXRSZWNvcmQgIT0gcGl0RW50cnktPmdldE91dFJlY29yZHMoKS5lbmQoKSAmJgorICAgICAgICBvdXRSZWNvcmQtPmdldEV4cGlyeSgpID4gbm93KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorY29tcGFyZV9PdXRSZWNvcmRfbGFzdFJlbmV3ZWQoY29uc3QgcGl0OjpPdXRSZWNvcmQmIGEsIGNvbnN0IHBpdDo6T3V0UmVjb3JkJiBiKQoreworICByZXR1cm4gYS5nZXRMYXN0UmVuZXdlZCgpIDwgYi5nZXRMYXN0UmVuZXdlZCgpOworfQorCisvKiogXGJyaWVmIHBpY2sgYW4gZWxpZ2libGUgTmV4dEhvcCB3aXRoIGVhcmxpZXN0IE91dFJlY29yZAorICogIFxub3RlIEl0IGlzIGFzc3VtZWQgdGhhdCBldmVyeSBuZXh0aG9wIGhhcyBhbiBPdXRSZWNvcmQKKyAqLworc3RhdGljIGlubGluZSBmaWI6Ok5leHRIb3BMaXN0Ojpjb25zdF9pdGVyYXRvcgorZmluZEVsaWdpYmxlTmV4dEhvcFdpdGhFYXJsaWVzdE91dFJlY29yZChjb25zdCBzaGFyZWRfcHRyPHBpdDo6RW50cnk+JiBwaXRFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VJZCBjdXJyZW50RG93bnN0cmVhbSkKK3sKKyAgZmliOjpOZXh0SG9wTGlzdDo6Y29uc3RfaXRlcmF0b3IgZm91bmQgPSBuZXh0aG9wcy5lbmQoKTsKKyAgdGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQgZWFybGllc3RSZW5ld2VkID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQ6Om1heCgpOworICBmb3IgKGZpYjo6TmV4dEhvcExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmV4dGhvcHMuYmVnaW4oKTsgaXQgIT0gbmV4dGhvcHMuZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoIXByZWRpY2F0ZV9OZXh0SG9wX2VsaWdpYmxlKHBpdEVudHJ5LCAqaXQsIGN1cnJlbnREb3duc3RyZWFtKSkKKyAgICAgIGNvbnRpbnVlOworICAgIHBpdDo6T3V0UmVjb3JkQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3Igb3V0UmVjb3JkID0gcGl0RW50cnktPmdldE91dFJlY29yZCgqaXQtPmdldEZhY2UoKSk7CisgICAgQk9PU1RfQVNTRVJUKG91dFJlY29yZCAhPSBwaXRFbnRyeS0+Z2V0T3V0UmVjb3JkcygpLmVuZCgpKTsKKyAgICBpZiAob3V0UmVjb3JkLT5nZXRMYXN0UmVuZXdlZCgpIDwgZWFybGllc3RSZW5ld2VkKSB7CisgICAgICBmb3VuZCA9IGl0OworICAgICAgZWFybGllc3RSZW5ld2VkID0gb3V0UmVjb3JkLT5nZXRMYXN0UmVuZXdlZCgpOworICAgIH0KKyAgfQorICByZXR1cm4gZm91bmQ7Cit9CisKK3ZvaWQKK0Jlc3RSb3V0ZVN0cmF0ZWd5Mjo6YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoY29uc3QgRmFjZSYgaW5GYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpCit7CisgIGNvbnN0IGZpYjo6TmV4dEhvcExpc3QmIG5leHRob3BzID0gZmliRW50cnktPmdldE5leHRIb3BzKCk7CisgIGZpYjo6TmV4dEhvcExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmV4dGhvcHMuZW5kKCk7CisKKyAgYm9vbCBpc05ld1BpdEVudHJ5ID0gIXBpdEVudHJ5LT5oYXNVbmV4cGlyZWRPdXRSZWNvcmRzKCk7CisgIGlmIChpc05ld1BpdEVudHJ5KSB7CisgICAgLy8gZm9yd2FyZCB0byBuZXh0aG9wIHdpdGggbG93ZXN0IGNvc3QgZXhjZXB0IGRvd25zdHJlYW0KKyAgICBpdCA9IHN0ZDo6ZmluZF9pZihuZXh0aG9wcy5iZWdpbigpLCBuZXh0aG9wcy5lbmQoKSwKKyAgICAgIGJpbmQoJnByZWRpY2F0ZV9OZXh0SG9wX2VsaWdpYmxlLCBwaXRFbnRyeSwgXzEsIGluRmFjZS5nZXRJZCgpLAorICAgICAgICAgICBmYWxzZSwgdGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQ6Om1pbigpKSk7CisKKyAgICBpZiAoaXQgPT0gbmV4dGhvcHMuZW5kKCkpIHsKKyAgICAgIE5GRF9MT0dfREVCVUcoaW50ZXJlc3QgPDwgIiBmcm9tPSIgPDwgaW5GYWNlLmdldElkKCkgPDwgIiBub05leHRIb3AiKTsKKyAgICAgIHRoaXMtPnJlamVjdFBlbmRpbmdJbnRlcmVzdChwaXRFbnRyeSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2hhcmVkX3B0cjxGYWNlPiBvdXRGYWNlID0gaXQtPmdldEZhY2UoKTsKKyAgICB0aGlzLT5zZW5kSW50ZXJlc3QocGl0RW50cnksIG91dEZhY2UpOworICAgIE5GRF9MT0dfREVCVUcoaW50ZXJlc3QgPDwgIiBmcm9tPSIgPDwgaW5GYWNlLmdldElkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbmV3UGl0RW50cnktdG89IiA8PCBvdXRGYWNlLT5nZXRJZCgpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyB3aGVuIHdhcyB0aGUgbGFzdCBvdXRnb2luZyBJbnRlcmVzdD8KKyAgY29uc3QgcGl0OjpPdXRSZWNvcmRDb2xsZWN0aW9uJiBvdXRSZWNvcmRzID0gcGl0RW50cnktPmdldE91dFJlY29yZHMoKTsKKyAgcGl0OjpPdXRSZWNvcmRDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBsYXN0T3V0Z29pbmcgPSBzdGQ6Om1heF9lbGVtZW50KAorICAgIG91dFJlY29yZHMuYmVnaW4oKSwgb3V0UmVjb3Jkcy5lbmQoKSwgJmNvbXBhcmVfT3V0UmVjb3JkX2xhc3RSZW5ld2VkKTsKKyAgQk9PU1RfQVNTRVJUKGxhc3RPdXRnb2luZyAhPSBvdXRSZWNvcmRzLmVuZCgpKTsgLy8gb3RoZXJ3aXNlIGl0J3MgbmV3IFBJVCBlbnRyeQorCisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IG5vdyA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6RHVyYXRpb24gc2luY2VMYXN0T3V0Z29pbmcgPSBub3cgLSBsYXN0T3V0Z29pbmctPmdldExhc3RSZW5ld2VkKCk7CisgIGJvb2wgc2hvdWxkUmV0cmFuc21pdCA9IHNpbmNlTGFzdE91dGdvaW5nID49IE1JTl9SRVRSQU5TTUlTU0lPTl9JTlRFUlZBTDsKKyAgaWYgKCFzaG91bGRSZXRyYW5zbWl0KSB7CisgICAgTkZEX0xPR19ERUJVRyhpbnRlcmVzdCA8PCAiIGZyb209IiA8PCBpbkZhY2UuZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkb250UmV0cmFuc21pdCBzaW5jZUxhc3RPdXRnb2luZz0iIDw8IHNpbmNlTGFzdE91dGdvaW5nLmNvdW50KCkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGZpbmQgYW4gdW51c2VkIHVwc3RyZWFtIHdpdGggbG93ZXN0IGNvc3QgZXhjZXB0IGRvd25zdHJlYW0KKyAgaXQgPSBzdGQ6OmZpbmRfaWYobmV4dGhvcHMuYmVnaW4oKSwgbmV4dGhvcHMuZW5kKCksCisgICAgYmluZCgmcHJlZGljYXRlX05leHRIb3BfZWxpZ2libGUsIHBpdEVudHJ5LCBfMSwgaW5GYWNlLmdldElkKCksIHRydWUsIG5vdykpOworICBpZiAoaXQgIT0gbmV4dGhvcHMuZW5kKCkpIHsKKyAgICBzaGFyZWRfcHRyPEZhY2U+IG91dEZhY2UgPSBpdC0+Z2V0RmFjZSgpOworICAgIHRoaXMtPnNlbmRJbnRlcmVzdChwaXRFbnRyeSwgb3V0RmFjZSk7CisgICAgTkZEX0xPR19ERUJVRyhpbnRlcmVzdCA8PCAiIGZyb209IiA8PCBpbkZhY2UuZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXRyYW5zbWl0LXVudXNlZC10bz0iIDw8IG91dEZhY2UtPmdldElkKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGZpbmQgYW4gZWxpZ2libGUgdXBzdHJlYW0gdGhhdCBpcyB1c2VkIGVhcmxpZXN0CisgIGl0ID0gZmluZEVsaWdpYmxlTmV4dEhvcFdpdGhFYXJsaWVzdE91dFJlY29yZChwaXRFbnRyeSwgbmV4dGhvcHMsIGluRmFjZS5nZXRJZCgpKTsKKyAgaWYgKGl0ID09IG5leHRob3BzLmVuZCgpKSB7CisgICAgTkZEX0xPR19ERUJVRyhpbnRlcmVzdCA8PCAiIGZyb209IiA8PCBpbkZhY2UuZ2V0SWQoKSA8PCAiIHJldHJhbnNtaXROb05leHRIb3AiKTsKKyAgfQorICBlbHNlIHsKKyAgICBzaGFyZWRfcHRyPEZhY2U+IG91dEZhY2UgPSBpdC0+Z2V0RmFjZSgpOworICAgIHRoaXMtPnNlbmRJbnRlcmVzdChwaXRFbnRyeSwgb3V0RmFjZSk7CisgICAgTkZEX0xPR19ERUJVRyhpbnRlcmVzdCA8PCAiIGZyb209IiA8PCBpbkZhY2UuZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXRyYW5zbWl0LXJldHJ5LXRvPSIgPDwgb3V0RmFjZS0+Z2V0SWQoKSk7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mdy9iZXN0LXJvdXRlLXN0cmF0ZWd5Mi5ocHAgYi9ORkQvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI1OWQwCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mdy9iZXN0LXJvdXRlLXN0cmF0ZWd5Mi5ocHAKQEAgLTAsMCArMSw2MSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZXX0JFU1RfUk9VVEVfU1RSQVRFR1kyX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZXX0JFU1RfUk9VVEVfU1RSQVRFR1kyX0hQUAorCisjaW5jbHVkZSAic3RyYXRlZ3kuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmdyB7CisKKy8qKiBcYnJpZWYgQmVzdCBSb3V0ZSBzdHJhdGVneSB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBzdHJhdGVneSBmb3J3YXJkcyBhIG5ldyBJbnRlcmVzdCB0byB0aGUgbG93ZXN0LWNvc3QgbmV4dGhvcCAoZXhjZXB0IGRvd25zdHJlYW0pLgorICogIEFmdGVyIHRoYXQsIGl0IHJlY29nbml6ZXMgY29uc3VtZXIgcmV0cmFuc21pc3Npb246CisgKiAgaWYgYSBzaW1pbGFyIEludGVyZXN0IGFycml2ZXMgZnJvbSBhbnkgZG93bnN0cmVhbSBhZnRlciBNSU5fUkVUUkFOU01JU1NJT05fSU5URVJWQUwsCisgKiAgdGhlIHN0cmF0ZWd5IGZvcndhcmRzIHRoZSBJbnRlcmVzdCBhZ2FpbiB0byB0aGUgbG93ZXN0LWNvc3QgbmV4dGhvcCAoZXhjZXB0IGRvd25zdHJlYW0pCisgKiAgdGhhdCBpcyBub3QgcHJldmlvdXNseSB1c2VkLiBJZiBhbGwgbmV4dGhvcHMgaGF2ZSBiZWVuIHVzZWQsIHRoZSBzdHJhdGVneSBzdGFydHMgb3Zlci4KKyAqLworY2xhc3MgQmVzdFJvdXRlU3RyYXRlZ3kyIDogcHVibGljIFN0cmF0ZWd5Cit7CitwdWJsaWM6CisgIEJlc3RSb3V0ZVN0cmF0ZWd5MihGb3J3YXJkZXImIGZvcndhcmRlciwgY29uc3QgTmFtZSYgbmFtZSA9IFNUUkFURUdZX05BTUUpOworCisgIHZpcnR1YWwgdm9pZAorICBhZnRlclJlY2VpdmVJbnRlcmVzdChjb25zdCBGYWNlJiBpbkZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkgREVDTF9PVkVSUklERTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgTmFtZSBTVFJBVEVHWV9OQU1FOworICBzdGF0aWMgY29uc3QgdGltZTo6bWlsbGlzZWNvbmRzIE1JTl9SRVRSQU5TTUlTU0lPTl9JTlRFUlZBTDsKK307CisKK30gLy8gbmFtZXNwYWNlIGZ3Cit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRldfQkVTVF9ST1VURV9TVFJBVEVHWTJfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L2Jyb2FkY2FzdC1zdHJhdGVneS5jcHAgYi9ORkQvZGFlbW9uL2Z3L2Jyb2FkY2FzdC1zdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhYjE3YgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZncvYnJvYWRjYXN0LXN0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDYzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiYnJvYWRjYXN0LXN0cmF0ZWd5LmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgZncgeworCitjb25zdCBOYW1lIEJyb2FkY2FzdFN0cmF0ZWd5OjpTVFJBVEVHWV9OQU1FKCJuZG46L2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvYnJvYWRjYXN0LyVGRCUwMSIpOworCitCcm9hZGNhc3RTdHJhdGVneTo6QnJvYWRjYXN0U3RyYXRlZ3koRm9yd2FyZGVyJiBmb3J3YXJkZXIsIGNvbnN0IE5hbWUmIG5hbWUpCisgIDogU3RyYXRlZ3koZm9yd2FyZGVyLCBuYW1lKQoreworfQorCitCcm9hZGNhc3RTdHJhdGVneTo6fkJyb2FkY2FzdFN0cmF0ZWd5KCkKK3sKK30KKwordm9pZAorQnJvYWRjYXN0U3RyYXRlZ3k6OmFmdGVyUmVjZWl2ZUludGVyZXN0KGNvbnN0IEZhY2UmIGluRmFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QsCisgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSwKKyAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KQoreworICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBuZXh0aG9wcyA9IGZpYkVudHJ5LT5nZXROZXh0SG9wcygpOworCisgIGZvciAoZmliOjpOZXh0SG9wTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBuZXh0aG9wcy5iZWdpbigpOyBpdCAhPSBuZXh0aG9wcy5lbmQoKTsgKytpdCkgeworICAgIHNoYXJlZF9wdHI8RmFjZT4gb3V0RmFjZSA9IGl0LT5nZXRGYWNlKCk7CisgICAgaWYgKHBpdEVudHJ5LT5jYW5Gb3J3YXJkVG8oKm91dEZhY2UpKSB7CisgICAgICB0aGlzLT5zZW5kSW50ZXJlc3QocGl0RW50cnksIG91dEZhY2UpOworICAgIH0KKyAgfQorCisgIGlmICghcGl0RW50cnktPmhhc1VuZXhwaXJlZE91dFJlY29yZHMoKSkgeworICAgIHRoaXMtPnJlamVjdFBlbmRpbmdJbnRlcmVzdChwaXRFbnRyeSk7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mdy9icm9hZGNhc3Qtc3RyYXRlZ3kuaHBwIGIvTkZEL2RhZW1vbi9mdy9icm9hZGNhc3Qtc3RyYXRlZ3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDdiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2Jyb2FkY2FzdC1zdHJhdGVneS5ocHAKQEAgLTAsMCArMSw1OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZXX0JST0FEQ0FTVF9TVFJBVEVHWV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GV19CUk9BRENBU1RfU1RSQVRFR1lfSFBQCisKKyNpbmNsdWRlICJzdHJhdGVneS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIGZ3IHsKKworLyoqIFxjbGFzcyBCcm9hZGNhc3RTdHJhdGVneQorICogIFxicmllZiBhIGZvcndhcmRpbmcgc3RyYXRlZ3kgdGhhdCBmb3J3YXJkcyBJbnRlcmVzdAorICogICAgICAgICB0byBhbGwgbmV4dGhvcHMKKyAqLworY2xhc3MgQnJvYWRjYXN0U3RyYXRlZ3kgOiBwdWJsaWMgU3RyYXRlZ3kKK3sKK3B1YmxpYzoKKyAgQnJvYWRjYXN0U3RyYXRlZ3koRm9yd2FyZGVyJiBmb3J3YXJkZXIsIGNvbnN0IE5hbWUmIG5hbWUgPSBTVFJBVEVHWV9OQU1FKTsKKworICB2aXJ0dWFsCisgIH5Ccm9hZGNhc3RTdHJhdGVneSgpOworCisgIHZpcnR1YWwgdm9pZAorICBhZnRlclJlY2VpdmVJbnRlcmVzdChjb25zdCBGYWNlJiBpbkZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkgREVDTF9PVkVSUklERTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgTmFtZSBTVFJBVEVHWV9OQU1FOworfTsKKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GV19CUk9BRENBU1RfU1RSQVRFR1lfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L2NsaWVudC1jb250cm9sLXN0cmF0ZWd5LmNwcCBiL05GRC9kYWVtb24vZncvY2xpZW50LWNvbnRyb2wtc3RyYXRlZ3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzAwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2NsaWVudC1jb250cm9sLXN0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDc0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiY2xpZW50LWNvbnRyb2wtc3RyYXRlZ3kuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgZncgeworCitORkRfTE9HX0lOSVQoIkNsaWVudENvbnRyb2xTdHJhdGVneSIpOworCitjb25zdCBOYW1lCitDbGllbnRDb250cm9sU3RyYXRlZ3k6OlNUUkFURUdZX05BTUUoIm5kbjovbG9jYWxob3N0L25mZC9zdHJhdGVneS9jbGllbnQtY29udHJvbC8lRkQlMDEiKTsKKworQ2xpZW50Q29udHJvbFN0cmF0ZWd5OjpDbGllbnRDb250cm9sU3RyYXRlZ3koRm9yd2FyZGVyJiBmb3J3YXJkZXIsIGNvbnN0IE5hbWUmIG5hbWUpCisgIDogQmVzdFJvdXRlU3RyYXRlZ3koZm9yd2FyZGVyLCBuYW1lKQoreworfQorCitDbGllbnRDb250cm9sU3RyYXRlZ3k6On5DbGllbnRDb250cm9sU3RyYXRlZ3koKQoreworfQorCit2b2lkCitDbGllbnRDb250cm9sU3RyYXRlZ3k6OmFmdGVyUmVjZWl2ZUludGVyZXN0KGNvbnN0IEZhY2UmIGluRmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KQoreworICAvLyBTdHJhdGVneSBuZWVkbid0IGNoZWNrIHdoZXRoZXIgTG9jYWxDb250cm9sSGVhZGVyLU5leHRIb3BGYWNlSWQgaXMgZW5hYmxlZC4KKyAgLy8gTG9jYWxGYWNlIGRvZXMgdGhpcyBjaGVjay4KKyAgaWYgKCFpbnRlcmVzdC5nZXRMb2NhbENvbnRyb2xIZWFkZXIoKS5oYXNOZXh0SG9wRmFjZUlkKCkpIHsKKyAgICB0aGlzLT5CZXN0Um91dGVTdHJhdGVneTo6YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoaW5GYWNlLCBpbnRlcmVzdCwgZmliRW50cnksIHBpdEVudHJ5KTsKKyAgICByZXR1cm47CisgIH0KKworICBGYWNlSWQgb3V0RmFjZUlkID0gc3RhdGljX2Nhc3Q8RmFjZUlkPihpbnRlcmVzdC5nZXROZXh0SG9wRmFjZUlkKCkpOworICBzaGFyZWRfcHRyPEZhY2U+IG91dEZhY2UgPSB0aGlzLT5nZXRGYWNlKG91dEZhY2VJZCk7CisgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4ob3V0RmFjZSkpIHsKKyAgICAvLyBJZiBvdXRGYWNlIGRvZXNuJ3QgZXhpc3QsIGl0J3MgYmV0dGVyIHRvIHJlamVjdCB0aGUgSW50ZXJlc3QKKyAgICAvLyB0aGFuIHRvIHVzZSBCZXN0Um91dGVTdHJhdGVneS4KKyAgICBORkRfTE9HX1dBUk4oIkludGVyZXN0ICIgPDwgaW50ZXJlc3QuZ2V0TmFtZSgpIDw8CisgICAgICAgICAgICAgICAgICIgTmV4dEhvcEZhY2VJZD0iIDw8IG91dEZhY2VJZCA8PCAiIG5vbi1leGlzdGVudCBmYWNlIik7CisgICAgdGhpcy0+cmVqZWN0UGVuZGluZ0ludGVyZXN0KHBpdEVudHJ5KTsKKyAgICByZXR1cm47CisgIH0KKworICB0aGlzLT5zZW5kSW50ZXJlc3QocGl0RW50cnksIG91dEZhY2UpOworfQorCit9IC8vIG5hbWVzcGFjZSBmdworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L2NsaWVudC1jb250cm9sLXN0cmF0ZWd5LmhwcCBiL05GRC9kYWVtb24vZncvY2xpZW50LWNvbnRyb2wtc3RyYXRlZ3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGRiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2NsaWVudC1jb250cm9sLXN0cmF0ZWd5LmhwcApAQCAtMCwwICsxLDU4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fRldfQ0xJRU5UX0NPTlRST0xfU1RSQVRFR1lfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRldfQ0xJRU5UX0NPTlRST0xfU1RSQVRFR1lfSFBQCisKKyNpbmNsdWRlICJiZXN0LXJvdXRlLXN0cmF0ZWd5LmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgZncgeworCisvKiogXGJyaWVmIGEgZm9yd2FyZGluZyBzdHJhdGVneSB0aGF0IGZvcndhcmRzIEludGVyZXN0cworICogICAgICAgICBhY2NvcmRpbmcgdG8gTmV4dEhvcEZhY2VJZCBmaWVsZCBpbiBMb2NhbENvbnRyb2xIZWFkZXIKKyAqLworY2xhc3MgQ2xpZW50Q29udHJvbFN0cmF0ZWd5IDogcHVibGljIEJlc3RSb3V0ZVN0cmF0ZWd5Cit7CitwdWJsaWM6CisgIENsaWVudENvbnRyb2xTdHJhdGVneShGb3J3YXJkZXImIGZvcndhcmRlciwgY29uc3QgTmFtZSYgbmFtZSA9IFNUUkFURUdZX05BTUUpOworCisgIHZpcnR1YWwKKyAgfkNsaWVudENvbnRyb2xTdHJhdGVneSgpOworCisgIHZpcnR1YWwgdm9pZAorICBhZnRlclJlY2VpdmVJbnRlcmVzdChjb25zdCBGYWNlJiBpbkZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkgREVDTF9PVkVSUklERTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgTmFtZSBTVFJBVEVHWV9OQU1FOworfTsKKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GV19DTElFTlRfQ09OVFJPTF9TVFJBVEVHWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvZmFjZS10YWJsZS5jcHAgYi9ORkQvZGFlbW9uL2Z3L2ZhY2UtdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZGI1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2ZhY2UtdGFibGUuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZmFjZS10YWJsZS5ocHAiCisjaW5jbHVkZSAiZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitORkRfTE9HX0lOSVQoIkZhY2VUYWJsZSIpOworCitGYWNlVGFibGU6OkZhY2VUYWJsZShGb3J3YXJkZXImIGZvcndhcmRlcikKKyAgOiBtX2ZvcndhcmRlcihmb3J3YXJkZXIpCisgICwgbV9sYXN0RmFjZUlkKEZBQ0VJRF9SRVNFUlZFRF9NQVgpCit7Cit9CisKK0ZhY2VUYWJsZTo6fkZhY2VUYWJsZSgpCit7CisKK30KKworc2hhcmVkX3B0cjxGYWNlPgorRmFjZVRhYmxlOjpnZXQoRmFjZUlkIGlkKSBjb25zdAoreworICBzdGQ6Om1hcDxGYWNlSWQsIHNoYXJlZF9wdHI8RmFjZT4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9IG1fZmFjZXMuZmluZChpZCk7CisgIHJldHVybiAoaSA9PSBtX2ZhY2VzLmVuZCgpKSA/IChzaGFyZWRfcHRyPEZhY2U+KCkpIDogKGktPnNlY29uZCk7Cit9CisKK3NpemVfdAorRmFjZVRhYmxlOjpzaXplKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fZmFjZXMuc2l6ZSgpOworfQorCit2b2lkCitGYWNlVGFibGU6OmFkZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpCit7CisgIGlmIChmYWNlLT5nZXRJZCgpICE9IElOVkFMSURfRkFDRUlEICYmIG1fZmFjZXMuY291bnQoZmFjZS0+Z2V0SWQoKSkgPiAwKSB7CisgICAgTkZEX0xPR19XQVJOKCJUcnlpbmcgdG8gYWRkIGV4aXN0aW5nIGZhY2UgaWQ9IiA8PCBmYWNlLT5nZXRJZCgpIDw8ICIgdG8gdGhlIGZhY2UgdGFibGUiKTsKKyAgICByZXR1cm47CisgIH0KKworICBGYWNlSWQgZmFjZUlkID0gKyttX2xhc3RGYWNlSWQ7CisgIEJPT1NUX0FTU0VSVChmYWNlSWQgPiBGQUNFSURfUkVTRVJWRURfTUFYKTsKKyAgdGhpcy0+YWRkSW1wbChmYWNlLCBmYWNlSWQpOworfQorCit2b2lkCitGYWNlVGFibGU6OmFkZFJlc2VydmVkKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSwgRmFjZUlkIGZhY2VJZCkKK3sKKyAgQk9PU1RfQVNTRVJUKGZhY2UtPmdldElkKCkgPT0gSU5WQUxJRF9GQUNFSUQpOworICBCT09TVF9BU1NFUlQobV9mYWNlcy5jb3VudChmYWNlLT5nZXRJZCgpKSA9PSAwKTsKKyAgQk9PU1RfQVNTRVJUKGZhY2VJZCA8PSBGQUNFSURfUkVTRVJWRURfTUFYKTsKKyAgdGhpcy0+YWRkSW1wbChmYWNlLCBmYWNlSWQpOworfQorCit2b2lkCitGYWNlVGFibGU6OmFkZEltcGwoc2hhcmVkX3B0cjxGYWNlPiBmYWNlLCBGYWNlSWQgZmFjZUlkKQoreworICBmYWNlLT5zZXRJZChmYWNlSWQpOworICBtX2ZhY2VzW2ZhY2VJZF0gPSBmYWNlOworICBORkRfTE9HX0lORk8oIkFkZGVkIGZhY2UgaWQ9IiA8PCBmYWNlSWQgPDwgIiByZW1vdGU9IiA8PCBmYWNlLT5nZXRSZW1vdGVVcmkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBsb2NhbD0iIDw8IGZhY2UtPmdldExvY2FsVXJpKCkpOworCisgIGZhY2UtPm9uUmVjZWl2ZUludGVyZXN0ICs9IGJpbmQoJkZvcndhcmRlcjo6b25JbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9mb3J3YXJkZXIsIHJlZigqZmFjZSksIF8xKTsKKyAgZmFjZS0+b25SZWNlaXZlRGF0YSAgICAgKz0gYmluZCgmRm9yd2FyZGVyOjpvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fZm9yd2FyZGVyLCByZWYoKmZhY2UpLCBfMSk7CisgIGZhY2UtPm9uRmFpbCAgICAgICAgICAgICs9IGJpbmQoJkZhY2VUYWJsZTo6cmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGZhY2UpOworCisgIHRoaXMtPm9uQWRkKGZhY2UpOworfQorCit2b2lkCitGYWNlVGFibGU6OnJlbW92ZShzaGFyZWRfcHRyPEZhY2U+IGZhY2UpCit7CisgIHRoaXMtPm9uUmVtb3ZlKGZhY2UpOworCisgIEZhY2VJZCBmYWNlSWQgPSBmYWNlLT5nZXRJZCgpOworICBtX2ZhY2VzLmVyYXNlKGZhY2VJZCk7CisgIGZhY2UtPnNldElkKElOVkFMSURfRkFDRUlEKTsKKyAgTkZEX0xPR19JTkZPKCJSZW1vdmVkIGZhY2UgaWQ9IiA8PCBmYWNlSWQgPDwgIiByZW1vdGU9IiA8PCBmYWNlLT5nZXRSZW1vdGVVcmkoKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jYWw9IiA8PCBmYWNlLT5nZXRMb2NhbFVyaSgpKTsKKworICAvLyBYWFggVGhpcyBjbGVhcnMgYWxsIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgRXZlbnRFbWl0dGVyCisgIC8vICAgICBkb2VzIG5vdCBzdXBwb3J0IG9ubHkgcmVtb3ZpbmcgRm9yd2FyZGVyJ3Mgc3Vic2NyaXB0aW9uCisgIGZhY2UtPm9uUmVjZWl2ZUludGVyZXN0LmNsZWFyKCk7CisgIGZhY2UtPm9uUmVjZWl2ZURhdGEgICAgLmNsZWFyKCk7CisgIGZhY2UtPm9uU2VuZEludGVyZXN0ICAgLmNsZWFyKCk7CisgIGZhY2UtPm9uU2VuZERhdGEgICAgICAgLmNsZWFyKCk7CisgIC8vIGRvbid0IGNsZWFyIG9uRmFpbCBiZWNhdXNlIG90aGVyIGZ1bmN0aW9ucyBtYXkgbmVlZCB0byBleGVjdXRlCisKKyAgbV9mb3J3YXJkZXIuZ2V0RmliKCkucmVtb3ZlTmV4dEhvcEZyb21BbGxFbnRyaWVzKGZhY2UpOworfQorCitGYWNlVGFibGU6OkZvcndhcmRSYW5nZQorRmFjZVRhYmxlOjpnZXRGb3J3YXJkUmFuZ2UoKSBjb25zdAoreworICByZXR1cm4gbV9mYWNlcyB8IGJvb3N0OjphZGFwdG9yczo6bWFwX3ZhbHVlczsKK30KKworRmFjZVRhYmxlOjpjb25zdF9pdGVyYXRvcgorRmFjZVRhYmxlOjpiZWdpbigpIGNvbnN0Cit7CisgIHJldHVybiB0aGlzLT5nZXRGb3J3YXJkUmFuZ2UoKS5iZWdpbigpOworfQorCitGYWNlVGFibGU6OmNvbnN0X2l0ZXJhdG9yCitGYWNlVGFibGU6OmVuZCgpIGNvbnN0Cit7CisgIHJldHVybiB0aGlzLT5nZXRGb3J3YXJkUmFuZ2UoKS5lbmQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L2ZhY2UtdGFibGUuaHBwIGIvTkZEL2RhZW1vbi9mdy9mYWNlLXRhYmxlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzU5OTllCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mdy9mYWNlLXRhYmxlLmhwcApAQCAtMCwwICsxLDEwNiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZXX0ZBQ0VfVEFCTEVfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRldfRkFDRV9UQUJMRV9IUFAKKworI2luY2x1ZGUgImZhY2UvZmFjZS5ocHAiCisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9tYXAuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgRm9yd2FyZGVyOworCisvKiogXGJyaWVmIGNvbnRhaW5lciBvZiBhbGwgRmFjZXMKKyAqLworY2xhc3MgRmFjZVRhYmxlIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgRmFjZVRhYmxlKEZvcndhcmRlciYgZm9yd2FyZGVyKTsKKworICBWSVJUVUFMX1dJVEhfVEVTVFMKKyAgfkZhY2VUYWJsZSgpOworCisgIFZJUlRVQUxfV0lUSF9URVNUUyB2b2lkCisgIGFkZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpOworCisgIC8vLyBhZGQgYSBzcGVjaWFsIEZhY2Ugd2l0aCBhIHJlc2VydmVkIEZhY2VJZAorICBWSVJUVUFMX1dJVEhfVEVTVFMgdm9pZAorICBhZGRSZXNlcnZlZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UsIEZhY2VJZCBmYWNlSWQpOworCisgIFZJUlRVQUxfV0lUSF9URVNUUyBzaGFyZWRfcHRyPEZhY2U+CisgIGdldChGYWNlSWQgaWQpIGNvbnN0OworCisgIHNpemVfdAorICBzaXplKCkgY29uc3Q7CisKK3B1YmxpYzogLy8gZW51bWVyYXRpb24KKyAgdHlwZWRlZiBzdGQ6Om1hcDxGYWNlSWQsIHNoYXJlZF9wdHI8RmFjZT4+IEZhY2VNYXA7CisKKyAgdHlwZWRlZiBib29zdDo6c2VsZWN0X3NlY29uZF9jb25zdF9yYW5nZTxGYWNlTWFwPiBGb3J3YXJkUmFuZ2U7CisKKyAgLyoqIFxicmllZiBGb3J3YXJkSXRlcmF0b3IgZm9yIHNoYXJlZF9wdHI8RmFjZT4KKyAgICovCisgIHR5cGVkZWYgYm9vc3Q6OnJhbmdlX2l0ZXJhdG9yPEZvcndhcmRSYW5nZT46OnR5cGUgY29uc3RfaXRlcmF0b3I7CisKKyAgY29uc3RfaXRlcmF0b3IKKyAgYmVnaW4oKSBjb25zdDsKKworICBjb25zdF9pdGVyYXRvcgorICBlbmQoKSBjb25zdDsKKworcHVibGljOiAvLyBzaWduYWxzCisgIC8qKiBcYnJpZWYgZmlyZXMgYWZ0ZXIgYSBGYWNlIGlzIGFkZGVkCisgICAqLworICBzaWduYWw6OlNpZ25hbDxGYWNlVGFibGUsIHNoYXJlZF9wdHI8RmFjZT4+IG9uQWRkOworCisgIC8qKiBcYnJpZWYgZmlyZXMgYmVmb3JlIGEgRmFjZSBpcyByZW1vdmVkCisgICAqCisgICAqICBGYWNlSWQgaXMgdmFsaWQgd2hlbiB0aGlzIGV2ZW50IGlzIGZpcmVkCisgICAqLworICBzaWduYWw6OlNpZ25hbDxGYWNlVGFibGUsIHNoYXJlZF9wdHI8RmFjZT4+IG9uUmVtb3ZlOworCitwcml2YXRlOgorICB2b2lkCisgIGFkZEltcGwoc2hhcmVkX3B0cjxGYWNlPiBmYWNlLCBGYWNlSWQgZmFjZUlkKTsKKworICAvLyByZW1vdmUgaXMgcHJpdmF0ZSBiZWNhdXNlIGl0J3MgYSBzdWJzY3JpYmVyIG9mIGZhY2Uub25GYWlsIGV2ZW50LgorICAvLyBmYWNlLT5jbG9zZSgpIGNsb3NlcyBhIGZhY2UgYW5kIHRyaWdnZXJzIC5yZW1vdmUoZmFjZSkKKyAgdm9pZAorICByZW1vdmUoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKTsKKworICBGb3J3YXJkUmFuZ2UKKyAgZ2V0Rm9yd2FyZFJhbmdlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIEZvcndhcmRlciYgbV9mb3J3YXJkZXI7CisgIEZhY2VJZCBtX2xhc3RGYWNlSWQ7CisgIEZhY2VNYXAgbV9mYWNlczsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GV19GQUNFX1RBQkxFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mdy9mb3J3YXJkZXItY291bnRlcnMuaHBwIGIvTkZEL2RhZW1vbi9mdy9mb3J3YXJkZXItY291bnRlcnMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2I1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2ZvcndhcmRlci1jb3VudGVycy5ocHAKQEAgLTAsMCArMSw1MSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZXX0ZPUldBUkRFUl9DT1VOVEVSU19IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GV19GT1JXQVJERVJfQ09VTlRFUlNfSFBQCisKKyNpbmNsdWRlICJmYWNlL2ZhY2UtY291bnRlcnMuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqIFxicmllZiBjb250YWlucyBjb3VudGVycyBvbiBmb3J3YXJkZXIKKyAqLworY2xhc3MgRm9yd2FyZGVyQ291bnRlcnMgOiBwdWJsaWMgTmV0d29ya0xheWVyQ291bnRlcnMKK3sKK3B1YmxpYzoKKyAgLyoqIFxicmllZiBjb3B5IGN1cnJlbnQgb2JzZXZlcmF0aW9ucyB0byBhIHN0cnVjdAorICAgKiAgXHBhcmFtIHJlY2lwaWVudCBhbiBvYmplY3Qgd2l0aCBzZXQgbWV0aG9kcyBmb3IgY291bnRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFI+CisgIHZvaWQKKyAgY29weVRvKFImIHJlY2lwaWVudCkgY29uc3QKKyAgeworICAgIHRoaXMtPk5ldHdvcmtMYXllckNvdW50ZXJzOjpjb3B5VG8ocmVjaXBpZW50KTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZXX0ZPUldBUkRFUl9DT1VOVEVSU19IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvZm9yd2FyZGVyLmNwcCBiL05GRC9kYWVtb24vZncvZm9yd2FyZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QxZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mdy9mb3J3YXJkZXIuY3BwCkBAIC0wLDAgKzEsNDQ1IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisjaW5jbHVkZSAiY29yZS9yYW5kb20uaHBwIgorI2luY2x1ZGUgImF2YWlsYWJsZS1zdHJhdGVnaWVzLmhwcCIKKyNpbmNsdWRlIDxib29zdC9yYW5kb20vdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiRm9yd2FyZGVyIik7CisKK3VzaW5nIGZ3OjpTdHJhdGVneTsKKworY29uc3QgTmFtZSBGb3J3YXJkZXI6OkxPQ0FMSE9TVF9OQU1FKCJuZG46L2xvY2FsaG9zdCIpOworCitGb3J3YXJkZXI6OkZvcndhcmRlcigpCisgIDogbV9mYWNlVGFibGUoKnRoaXMpCisgICwgbV9maWIobV9uYW1lVHJlZSkKKyAgLCBtX3BpdChtX25hbWVUcmVlKQorICAsIG1fbWVhc3VyZW1lbnRzKG1fbmFtZVRyZWUpCisgICwgbV9zdHJhdGVneUNob2ljZShtX25hbWVUcmVlLCBmdzo6bWFrZURlZmF1bHRTdHJhdGVneSgqdGhpcykpCit7CisgIGZ3OjppbnN0YWxsU3RyYXRlZ2llcygqdGhpcyk7Cit9CisKK0ZvcndhcmRlcjo6fkZvcndhcmRlcigpCit7CisKK30KKwordm9pZAorRm9yd2FyZGVyOjpvbkluY29taW5nSW50ZXJlc3QoRmFjZSYgaW5GYWNlLCBjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIC8vIHJlY2VpdmUgSW50ZXJlc3QKKyAgTkZEX0xPR19ERUJVRygib25JbmNvbWluZ0ludGVyZXN0IGZhY2U9IiA8PCBpbkZhY2UuZ2V0SWQoKSA8PAorICAgICAgICAgICAgICAgICIgaW50ZXJlc3Q9IiA8PCBpbnRlcmVzdC5nZXROYW1lKCkpOworICBjb25zdF9jYXN0PEludGVyZXN0Jj4oaW50ZXJlc3QpLnNldEluY29taW5nRmFjZUlkKGluRmFjZS5nZXRJZCgpKTsKKyAgKyttX2NvdW50ZXJzLmdldE5JbkludGVyZXN0cygpOworCisgIC8vIC9sb2NhbGhvc3Qgc2NvcGUgY29udHJvbAorICBib29sIGlzVmlvbGF0aW5nTG9jYWxob3N0ID0gIWluRmFjZS5pc0xvY2FsKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMSE9TVF9OQU1FLmlzUHJlZml4T2YoaW50ZXJlc3QuZ2V0TmFtZSgpKTsKKyAgaWYgKGlzVmlvbGF0aW5nTG9jYWxob3N0KSB7CisgICAgTkZEX0xPR19ERUJVRygib25JbmNvbWluZ0ludGVyZXN0IGZhY2U9IiA8PCBpbkZhY2UuZ2V0SWQoKSA8PAorICAgICAgICAgICAgICAgICAgIiBpbnRlcmVzdD0iIDw8IGludGVyZXN0LmdldE5hbWUoKSA8PCAiIHZpb2xhdGVzIC9sb2NhbGhvc3QiKTsKKyAgICAvLyAoZHJvcCkKKyAgICByZXR1cm47CisgIH0KKworICAvLyBQSVQgaW5zZXJ0CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkgPSBtX3BpdC5pbnNlcnQoaW50ZXJlc3QpLmZpcnN0OworCisgIC8vIGRldGVjdCBkdXBsaWNhdGUgTm9uY2UKKyAgaW50IGRudyA9IHBpdEVudHJ5LT5maW5kTm9uY2UoaW50ZXJlc3QuZ2V0Tm9uY2UoKSwgaW5GYWNlKTsKKyAgYm9vbCBoYXNEdXBsaWNhdGVOb25jZSA9IChkbncgIT0gcGl0OjpEVVBMSUNBVEVfTk9OQ0VfTk9ORSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVhZE5vbmNlTGlzdC5oYXMoaW50ZXJlc3QuZ2V0TmFtZSgpLCBpbnRlcmVzdC5nZXROb25jZSgpKTsKKyAgaWYgKGhhc0R1cGxpY2F0ZU5vbmNlKSB7CisgICAgLy8gZ290byBJbnRlcmVzdCBsb29wIHBpcGVsaW5lCisgICAgdGhpcy0+b25JbnRlcmVzdExvb3AoaW5GYWNlLCBpbnRlcmVzdCwgcGl0RW50cnkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGNhbmNlbCB1bnNhdGlzZnkgJiBzdHJhZ2dsZXIgdGltZXIKKyAgdGhpcy0+Y2FuY2VsVW5zYXRpc2Z5QW5kU3RyYWdnbGVyVGltZXIocGl0RW50cnkpOworCisgIC8vIGlzIHBlbmRpbmc/CisgIGNvbnN0IHBpdDo6SW5SZWNvcmRDb2xsZWN0aW9uJiBpblJlY29yZHMgPSBwaXRFbnRyeS0+Z2V0SW5SZWNvcmRzKCk7CisgIGJvb2wgaXNQZW5kaW5nID0gaW5SZWNvcmRzLmJlZ2luKCkgIT0gaW5SZWNvcmRzLmVuZCgpOworICBpZiAoIWlzUGVuZGluZykgeworICAgIC8vIENTIGxvb2t1cAorICAgIGNvbnN0IERhdGEqIGNzTWF0Y2ggPSBtX2NzLmZpbmQoaW50ZXJlc3QpOworICAgIGlmIChjc01hdGNoICE9IDApIHsKKyAgICAgIGNvbnN0X2Nhc3Q8RGF0YSo+KGNzTWF0Y2gpLT5zZXRJbmNvbWluZ0ZhY2VJZChGQUNFSURfQ09OVEVOVF9TVE9SRSk7CisgICAgICAvLyBYWFggc2hvdWxkIHdlIGxvb2t1cCBQSVQgZm9yIG90aGVyIEludGVyZXN0cyB0aGF0IGFsc28gbWF0Y2ggY3NNYXRjaD8KKworICAgICAgLy8gc2V0IFBJVCBzdHJhZ2dsZXIgdGltZXIKKyAgICAgIHRoaXMtPnNldFN0cmFnZ2xlclRpbWVyKHBpdEVudHJ5LCB0cnVlLCBjc01hdGNoLT5nZXRGcmVzaG5lc3NQZXJpb2QoKSk7CisKKyAgICAgIC8vIGdvdG8gb3V0Z29pbmcgRGF0YSBwaXBlbGluZQorICAgICAgdGhpcy0+b25PdXRnb2luZ0RhdGEoKmNzTWF0Y2gsIGluRmFjZSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gaW5zZXJ0IEluUmVjb3JkCisgIHBpdEVudHJ5LT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGluRmFjZS5zaGFyZWRfZnJvbV90aGlzKCksIGludGVyZXN0KTsKKworICAvLyBzZXQgUElUIHVuc2F0aXNmeSB0aW1lcgorICB0aGlzLT5zZXRVbnNhdGlzZnlUaW1lcihwaXRFbnRyeSk7CisKKyAgLy8gRklCIGxvb2t1cAorICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5ID0gbV9maWIuZmluZExvbmdlc3RQcmVmaXhNYXRjaCgqcGl0RW50cnkpOworCisgIC8vIGRpc3BhdGNoIHRvIHN0cmF0ZWd5CisgIHRoaXMtPmRpc3BhdGNoVG9TdHJhdGVneShwaXRFbnRyeSwgYmluZCgmU3RyYXRlZ3k6OmFmdGVyUmVjZWl2ZUludGVyZXN0LCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWYoaW5GYWNlKSwgY3JlZihpbnRlcmVzdCksIGZpYkVudHJ5LCBwaXRFbnRyeSkpOworfQorCit2b2lkCitGb3J3YXJkZXI6Om9uSW50ZXJlc3RMb29wKEZhY2UmIGluRmFjZSwgY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KQoreworICBORkRfTE9HX0RFQlVHKCJvbkludGVyZXN0TG9vcCBmYWNlPSIgPDwgaW5GYWNlLmdldElkKCkgPDwKKyAgICAgICAgICAgICAgICAiIGludGVyZXN0PSIgPDwgaW50ZXJlc3QuZ2V0TmFtZSgpKTsKKworICAvLyAoZHJvcCkKK30KKworLyoqIFxicmllZiBjb21wYXJlIHR3byBJblJlY29yZHMgZm9yIHBpY2tpbmcgb3V0Z29pbmcgSW50ZXJlc3QKKyAqICBccmV0dXJuIHRydWUgaWYgYiBpcyBwcmVmZXJyZWQgb3ZlciBhCisgKgorICogIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHBhc3NlZCB0byBzdGQ6Om1heF9lbGVtZW50IG92ZXIgSW5SZWNvcmRDb2xsZWN0aW9uLgorICogIFRoZSBvdXRnb2luZyBJbnRlcmVzdCBwaWNrZWQgaXMgdGhlIGxhc3QgaW5jb21pbmcgSW50ZXJlc3QKKyAqICB0aGF0IGRvZXMgbm90IGNvbWUgZnJvbSBvdXRGYWNlLgorICogIElmIGFsbCBJblJlY29yZHMgY29tZSBmcm9tIG91dEZhY2UsIGl0J3MgZmluZSB0byBwaWNrIHRoYXQuIFRoaXMgaGFwcGVucyB3aGVuCisgKiAgdGhlcmUncyBvbmx5IG9uZSBJblJlY29yZCB0aGF0IGNvbWVzIGZyb20gb3V0RmFjZS4gVGhlIGxlZ2l0IHVzZSBpcyBmb3IKKyAqICB2ZWhpY3VsYXIgbmV0d29yazsgb3RoZXJ3aXNlLCBzdHJhdGVneSBzaG91bGRuJ3Qgc2VuZCB0byB0aGUgc29sZSBpbkZhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorY29tcGFyZV9waWNrSW50ZXJlc3QoY29uc3QgcGl0OjpJblJlY29yZCYgYSwgY29uc3QgcGl0OjpJblJlY29yZCYgYiwgY29uc3QgRmFjZSogb3V0RmFjZSkKK3sKKyAgYm9vbCBpc091dEZhY2VBID0gYS5nZXRGYWNlKCkuZ2V0KCkgPT0gb3V0RmFjZTsKKyAgYm9vbCBpc091dEZhY2VCID0gYi5nZXRGYWNlKCkuZ2V0KCkgPT0gb3V0RmFjZTsKKworICBpZiAoIWlzT3V0RmFjZUEgJiYgaXNPdXRGYWNlQikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaXNPdXRGYWNlQSAmJiAhaXNPdXRGYWNlQikgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGEuZ2V0TGFzdFJlbmV3ZWQoKSA+IGIuZ2V0TGFzdFJlbmV3ZWQoKTsKK30KKwordm9pZAorRm9yd2FyZGVyOjpvbk91dGdvaW5nSW50ZXJlc3Qoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwgRmFjZSYgb3V0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FudE5ld05vbmNlKQoreworICBpZiAob3V0RmFjZS5nZXRJZCgpID09IElOVkFMSURfRkFDRUlEKSB7CisgICAgTkZEX0xPR19XQVJOKCJvbk91dGdvaW5nSW50ZXJlc3QgZmFjZT1pbnZhbGlkIGludGVyZXN0PSIgPDwgcGl0RW50cnktPmdldE5hbWUoKSk7CisgICAgcmV0dXJuOworICB9CisgIE5GRF9MT0dfREVCVUcoIm9uT3V0Z29pbmdJbnRlcmVzdCBmYWNlPSIgPDwgb3V0RmFjZS5nZXRJZCgpIDw8CisgICAgICAgICAgICAgICAgIiBpbnRlcmVzdD0iIDw8IHBpdEVudHJ5LT5nZXROYW1lKCkpOworCisgIC8vIHNjb3BlIGNvbnRyb2wKKyAgaWYgKHBpdEVudHJ5LT52aW9sYXRlc1Njb3BlKG91dEZhY2UpKSB7CisgICAgTkZEX0xPR19ERUJVRygib25PdXRnb2luZ0ludGVyZXN0IGZhY2U9IiA8PCBvdXRGYWNlLmdldElkKCkgPDwKKyAgICAgICAgICAgICAgICAgICIgaW50ZXJlc3Q9IiA8PCBwaXRFbnRyeS0+Z2V0TmFtZSgpIDw8ICIgdmlvbGF0ZXMgc2NvcGUiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBwaWNrIEludGVyZXN0CisgIGNvbnN0IHBpdDo6SW5SZWNvcmRDb2xsZWN0aW9uJiBpblJlY29yZHMgPSBwaXRFbnRyeS0+Z2V0SW5SZWNvcmRzKCk7CisgIHBpdDo6SW5SZWNvcmRDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBwaWNrZWRJblJlY29yZCA9IHN0ZDo6bWF4X2VsZW1lbnQoCisgICAgaW5SZWNvcmRzLmJlZ2luKCksIGluUmVjb3Jkcy5lbmQoKSwgYmluZCgmY29tcGFyZV9waWNrSW50ZXJlc3QsIF8xLCBfMiwgJm91dEZhY2UpKTsKKyAgQk9PU1RfQVNTRVJUKHBpY2tlZEluUmVjb3JkICE9IGluUmVjb3Jkcy5lbmQoKSk7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gY29uc3RfcG9pbnRlcl9jYXN0PEludGVyZXN0PigKKyAgICBwaWNrZWRJblJlY29yZC0+Z2V0SW50ZXJlc3QoKS5zaGFyZWRfZnJvbV90aGlzKCkpOworCisgIGlmICh3YW50TmV3Tm9uY2UpIHsKKyAgICBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigqaW50ZXJlc3QpOworICAgIHN0YXRpYyBib29zdDo6cmFuZG9tOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248dWludDMyX3Q+IGRpc3Q7CisgICAgaW50ZXJlc3QtPnNldE5vbmNlKGRpc3QoZ2V0R2xvYmFsUm5nKCkpKTsKKyAgfQorCisgIC8vIGluc2VydCBPdXRSZWNvcmQKKyAgcGl0RW50cnktPmluc2VydE9yVXBkYXRlT3V0UmVjb3JkKG91dEZhY2Uuc2hhcmVkX2Zyb21fdGhpcygpLCAqaW50ZXJlc3QpOworCisgIC8vIHNlbmQgSW50ZXJlc3QKKyAgb3V0RmFjZS5zZW5kSW50ZXJlc3QoKmludGVyZXN0KTsKKyAgKyttX2NvdW50ZXJzLmdldE5PdXRJbnRlcmVzdHMoKTsKK30KKwordm9pZAorRm9yd2FyZGVyOjpvbkludGVyZXN0UmVqZWN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpCit7CisgIGlmIChwaXRFbnRyeS0+aGFzVW5leHBpcmVkT3V0UmVjb3JkcygpKSB7CisgICAgTkZEX0xPR19FUlJPUigib25JbnRlcmVzdFJlamVjdCBpbnRlcmVzdD0iIDw8IHBpdEVudHJ5LT5nZXROYW1lKCkgPDwKKyAgICAgICAgICAgICAgICAgICIgY2Fubm90IHJlamVjdCBmb3J3YXJkZWQgSW50ZXJlc3QiKTsKKyAgICByZXR1cm47CisgIH0KKyAgTkZEX0xPR19ERUJVRygib25JbnRlcmVzdFJlamVjdCBpbnRlcmVzdD0iIDw8IHBpdEVudHJ5LT5nZXROYW1lKCkpOworCisgIC8vIGNhbmNlbCB1bnNhdGlzZnkgJiBzdHJhZ2dsZXIgdGltZXIKKyAgdGhpcy0+Y2FuY2VsVW5zYXRpc2Z5QW5kU3RyYWdnbGVyVGltZXIocGl0RW50cnkpOworCisgIC8vIHNldCBQSVQgc3RyYWdnbGVyIHRpbWVyCisgIHRoaXMtPnNldFN0cmFnZ2xlclRpbWVyKHBpdEVudHJ5LCBmYWxzZSk7Cit9CisKK3ZvaWQKK0ZvcndhcmRlcjo6b25JbnRlcmVzdFVuc2F0aXNmaWVkKHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpCit7CisgIE5GRF9MT0dfREVCVUcoIm9uSW50ZXJlc3RVbnNhdGlzZmllZCBpbnRlcmVzdD0iIDw8IHBpdEVudHJ5LT5nZXROYW1lKCkpOworCisgIC8vIGludm9rZSBQSVQgdW5zYXRpc2ZpZWQgY2FsbGJhY2sKKyAgdGhpcy0+ZGlzcGF0Y2hUb1N0cmF0ZWd5KHBpdEVudHJ5LCBiaW5kKCZTdHJhdGVneTo6YmVmb3JlRXhwaXJlUGVuZGluZ0ludGVyZXN0LCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdEVudHJ5KSk7CisKKyAgLy8gZ290byBJbnRlcmVzdCBGaW5hbGl6ZSBwaXBlbGluZQorICB0aGlzLT5vbkludGVyZXN0RmluYWxpemUocGl0RW50cnksIGZhbHNlKTsKK30KKwordm9pZAorRm9yd2FyZGVyOjpvbkludGVyZXN0RmluYWxpemUoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwgYm9vbCBpc1NhdGlzZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWU6Om1pbGxpc2Vjb25kcyYgZGF0YUZyZXNobmVzc1BlcmlvZCkKK3sKKyAgTkZEX0xPR19ERUJVRygib25JbnRlcmVzdEZpbmFsaXplIGludGVyZXN0PSIgPDwgcGl0RW50cnktPmdldE5hbWUoKSA8PAorICAgICAgICAgICAgICAgIChpc1NhdGlzZmllZCA/ICIgc2F0aXNmaWVkIiA6ICIgdW5zYXRpc2ZpZWQiKSk7CisKKyAgLy8gRGVhZCBOb25jZSBMaXN0IGluc2VydCBpZiBuZWNlc3NhcnkKKyAgdGhpcy0+aW5zZXJ0RGVhZE5vbmNlTGlzdCgqcGl0RW50cnksIGlzU2F0aXNmaWVkLCBkYXRhRnJlc2huZXNzUGVyaW9kLCAwKTsKKworICAvLyBQSVQgZGVsZXRlCisgIHRoaXMtPmNhbmNlbFVuc2F0aXNmeUFuZFN0cmFnZ2xlclRpbWVyKHBpdEVudHJ5KTsKKyAgbV9waXQuZXJhc2UocGl0RW50cnkpOworfQorCit2b2lkCitGb3J3YXJkZXI6Om9uSW5jb21pbmdEYXRhKEZhY2UmIGluRmFjZSwgY29uc3QgRGF0YSYgZGF0YSkKK3sKKyAgLy8gcmVjZWl2ZSBEYXRhCisgIE5GRF9MT0dfREVCVUcoIm9uSW5jb21pbmdEYXRhIGZhY2U9IiA8PCBpbkZhY2UuZ2V0SWQoKSA8PCAiIGRhdGE9IiA8PCBkYXRhLmdldE5hbWUoKSk7CisgIGNvbnN0X2Nhc3Q8RGF0YSY+KGRhdGEpLnNldEluY29taW5nRmFjZUlkKGluRmFjZS5nZXRJZCgpKTsKKyAgKyttX2NvdW50ZXJzLmdldE5JbkRhdGFzKCk7CisKKyAgLy8gL2xvY2FsaG9zdCBzY29wZSBjb250cm9sCisgIGJvb2wgaXNWaW9sYXRpbmdMb2NhbGhvc3QgPSAhaW5GYWNlLmlzTG9jYWwoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxIT1NUX05BTUUuaXNQcmVmaXhPZihkYXRhLmdldE5hbWUoKSk7CisgIGlmIChpc1Zpb2xhdGluZ0xvY2FsaG9zdCkgeworICAgIE5GRF9MT0dfREVCVUcoIm9uSW5jb21pbmdEYXRhIGZhY2U9IiA8PCBpbkZhY2UuZ2V0SWQoKSA8PAorICAgICAgICAgICAgICAgICAgIiBkYXRhPSIgPDwgZGF0YS5nZXROYW1lKCkgPDwgIiB2aW9sYXRlcyAvbG9jYWxob3N0Iik7CisgICAgLy8gKGRyb3ApCisgICAgcmV0dXJuOworICB9CisKKyAgLy8gUElUIG1hdGNoCisgIHBpdDo6RGF0YU1hdGNoUmVzdWx0IHBpdE1hdGNoZXMgPSBtX3BpdC5maW5kQWxsRGF0YU1hdGNoZXMoZGF0YSk7CisgIGlmIChwaXRNYXRjaGVzLmJlZ2luKCkgPT0gcGl0TWF0Y2hlcy5lbmQoKSkgeworICAgIC8vIGdvdG8gRGF0YSB1bnNvbGljaXRlZCBwaXBlbGluZQorICAgIHRoaXMtPm9uRGF0YVVuc29saWNpdGVkKGluRmFjZSwgZGF0YSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ1MgaW5zZXJ0CisgIG1fY3MuaW5zZXJ0KGRhdGEpOworCisgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8RmFjZT4gPiBwZW5kaW5nRG93bnN0cmVhbXM7CisgIC8vIGZvcmVhY2ggUGl0RW50cnkKKyAgZm9yIChjb25zdCBzaGFyZWRfcHRyPHBpdDo6RW50cnk+JiBwaXRFbnRyeSA6IHBpdE1hdGNoZXMpIHsKKyAgICBORkRfTE9HX0RFQlVHKCJvbkluY29taW5nRGF0YSBtYXRjaGluZz0iIDw8IHBpdEVudHJ5LT5nZXROYW1lKCkpOworCisgICAgLy8gY2FuY2VsIHVuc2F0aXNmeSAmIHN0cmFnZ2xlciB0aW1lcgorICAgIHRoaXMtPmNhbmNlbFVuc2F0aXNmeUFuZFN0cmFnZ2xlclRpbWVyKHBpdEVudHJ5KTsKKworICAgIC8vIHJlbWVtYmVyIHBlbmRpbmcgZG93bnN0cmVhbXMKKyAgICBjb25zdCBwaXQ6OkluUmVjb3JkQ29sbGVjdGlvbiYgaW5SZWNvcmRzID0gcGl0RW50cnktPmdldEluUmVjb3JkcygpOworICAgIGZvciAocGl0OjpJblJlY29yZENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW5SZWNvcmRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaW5SZWNvcmRzLmVuZCgpOyArK2l0KSB7CisgICAgICBpZiAoaXQtPmdldEV4cGlyeSgpID4gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSkgeworICAgICAgICBwZW5kaW5nRG93bnN0cmVhbXMuaW5zZXJ0KGl0LT5nZXRGYWNlKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIGludm9rZSBQSVQgc2F0aXNmeSBjYWxsYmFjaworICAgIHRoaXMtPmRpc3BhdGNoVG9TdHJhdGVneShwaXRFbnRyeSwgYmluZCgmU3RyYXRlZ3k6OmJlZm9yZVNhdGlzZnlJbnRlcmVzdCwgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdEVudHJ5LCBjcmVmKGluRmFjZSksIGNyZWYoZGF0YSkpKTsKKworICAgIC8vIERlYWQgTm9uY2UgTGlzdCBpbnNlcnQgaWYgbmVjZXNzYXJ5IChmb3IgT3V0UmVjb3JkIG9mIGluRmFjZSkKKyAgICB0aGlzLT5pbnNlcnREZWFkTm9uY2VMaXN0KCpwaXRFbnRyeSwgdHJ1ZSwgZGF0YS5nZXRGcmVzaG5lc3NQZXJpb2QoKSwgJmluRmFjZSk7CisKKyAgICAvLyBtYXJrIFBJVCBzYXRpc2ZpZWQKKyAgICBwaXRFbnRyeS0+ZGVsZXRlSW5SZWNvcmRzKCk7CisgICAgcGl0RW50cnktPmRlbGV0ZU91dFJlY29yZChpbkZhY2UpOworCisgICAgLy8gc2V0IFBJVCBzdHJhZ2dsZXIgdGltZXIKKyAgICB0aGlzLT5zZXRTdHJhZ2dsZXJUaW1lcihwaXRFbnRyeSwgdHJ1ZSwgZGF0YS5nZXRGcmVzaG5lc3NQZXJpb2QoKSk7CisgIH0KKworICAvLyBmb3JlYWNoIHBlbmRpbmcgZG93bnN0cmVhbQorICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8RmFjZT4gPjo6aXRlcmF0b3IgaXQgPSBwZW5kaW5nRG93bnN0cmVhbXMuYmVnaW4oKTsKKyAgICAgIGl0ICE9IHBlbmRpbmdEb3duc3RyZWFtcy5lbmQoKTsgKytpdCkgeworICAgIHNoYXJlZF9wdHI8RmFjZT4gcGVuZGluZ0Rvd25zdHJlYW0gPSAqaXQ7CisgICAgaWYgKHBlbmRpbmdEb3duc3RyZWFtLmdldCgpID09ICZpbkZhY2UpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBnb3RvIG91dGdvaW5nIERhdGEgcGlwZWxpbmUKKyAgICB0aGlzLT5vbk91dGdvaW5nRGF0YShkYXRhLCAqcGVuZGluZ0Rvd25zdHJlYW0pOworICB9Cit9CisKK3ZvaWQKK0ZvcndhcmRlcjo6b25EYXRhVW5zb2xpY2l0ZWQoRmFjZSYgaW5GYWNlLCBjb25zdCBEYXRhJiBkYXRhKQoreworICAvLyBhY2NlcHQgdG8gY2FjaGU/CisgIGJvb2wgYWNjZXB0VG9DYWNoZSA9IGluRmFjZS5pc0xvY2FsKCk7CisgIGlmIChhY2NlcHRUb0NhY2hlKSB7CisgICAgLy8gQ1MgaW5zZXJ0CisgICAgbV9jcy5pbnNlcnQoZGF0YSwgdHJ1ZSk7CisgIH0KKworICBORkRfTE9HX0RFQlVHKCJvbkRhdGFVbnNvbGljaXRlZCBmYWNlPSIgPDwgaW5GYWNlLmdldElkKCkgPDwKKyAgICAgICAgICAgICAgICAiIGRhdGE9IiA8PCBkYXRhLmdldE5hbWUoKSA8PAorICAgICAgICAgICAgICAgIChhY2NlcHRUb0NhY2hlID8gIiBjYWNoZWQiIDogIiBub3QgY2FjaGVkIikpOworfQorCit2b2lkCitGb3J3YXJkZXI6Om9uT3V0Z29pbmdEYXRhKGNvbnN0IERhdGEmIGRhdGEsIEZhY2UmIG91dEZhY2UpCit7CisgIGlmIChvdXRGYWNlLmdldElkKCkgPT0gSU5WQUxJRF9GQUNFSUQpIHsKKyAgICBORkRfTE9HX1dBUk4oIm9uT3V0Z29pbmdEYXRhIGZhY2U9aW52YWxpZCBkYXRhPSIgPDwgZGF0YS5nZXROYW1lKCkpOworICAgIHJldHVybjsKKyAgfQorICBORkRfTE9HX0RFQlVHKCJvbk91dGdvaW5nRGF0YSBmYWNlPSIgPDwgb3V0RmFjZS5nZXRJZCgpIDw8ICIgZGF0YT0iIDw8IGRhdGEuZ2V0TmFtZSgpKTsKKworICAvLyAvbG9jYWxob3N0IHNjb3BlIGNvbnRyb2wKKyAgYm9vbCBpc1Zpb2xhdGluZ0xvY2FsaG9zdCA9ICFvdXRGYWNlLmlzTG9jYWwoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxIT1NUX05BTUUuaXNQcmVmaXhPZihkYXRhLmdldE5hbWUoKSk7CisgIGlmIChpc1Zpb2xhdGluZ0xvY2FsaG9zdCkgeworICAgIE5GRF9MT0dfREVCVUcoIm9uT3V0Z29pbmdEYXRhIGZhY2U9IiA8PCBvdXRGYWNlLmdldElkKCkgPDwKKyAgICAgICAgICAgICAgICAgICIgZGF0YT0iIDw8IGRhdGEuZ2V0TmFtZSgpIDw8ICIgdmlvbGF0ZXMgL2xvY2FsaG9zdCIpOworICAgIC8vIChkcm9wKQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRPRE8gdHJhZmZpYyBtYW5hZ2VyCisKKyAgLy8gc2VuZCBEYXRhCisgIG91dEZhY2Uuc2VuZERhdGEoZGF0YSk7CisgICsrbV9jb3VudGVycy5nZXROT3V0RGF0YXMoKTsKK30KKworc3RhdGljIGlubGluZSBib29sCitjb21wYXJlX0luUmVjb3JkX2V4cGlyeShjb25zdCBwaXQ6OkluUmVjb3JkJiBhLCBjb25zdCBwaXQ6OkluUmVjb3JkJiBiKQoreworICByZXR1cm4gYS5nZXRFeHBpcnkoKSA8IGIuZ2V0RXhwaXJ5KCk7Cit9CisKK3ZvaWQKK0ZvcndhcmRlcjo6c2V0VW5zYXRpc2Z5VGltZXIoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkKK3sKKyAgY29uc3QgcGl0OjpJblJlY29yZENvbGxlY3Rpb24mIGluUmVjb3JkcyA9IHBpdEVudHJ5LT5nZXRJblJlY29yZHMoKTsKKyAgcGl0OjpJblJlY29yZENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGxhc3RFeHBpcmluZyA9CisgICAgc3RkOjptYXhfZWxlbWVudChpblJlY29yZHMuYmVnaW4oKSwgaW5SZWNvcmRzLmVuZCgpLAorICAgICZjb21wYXJlX0luUmVjb3JkX2V4cGlyeSk7CisKKyAgdGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQgbGFzdEV4cGlyeSA9IGxhc3RFeHBpcmluZy0+Z2V0RXhwaXJ5KCk7CisgIHRpbWU6Om5hbm9zZWNvbmRzIGxhc3RFeHBpcnlGcm9tTm93ID0gbGFzdEV4cGlyeSAgLSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICBpZiAobGFzdEV4cGlyeUZyb21Ob3cgPD0gdGltZTo6c2Vjb25kcygwKSkgeworICAgIC8vIFRPRE8gYWxsIEluUmVjb3JkcyBhcmUgYWxyZWFkeSBleHBpcmVkOyB3aWxsIHRoaXMgaGFwcGVuPworICB9CisKKyAgc2NoZWR1bGVyOjpjYW5jZWwocGl0RW50cnktPm1fdW5zYXRpc2Z5VGltZXIpOworICBwaXRFbnRyeS0+bV91bnNhdGlzZnlUaW1lciA9IHNjaGVkdWxlcjo6c2NoZWR1bGUobGFzdEV4cGlyeUZyb21Ob3csCisgICAgYmluZCgmRm9yd2FyZGVyOjpvbkludGVyZXN0VW5zYXRpc2ZpZWQsIHRoaXMsIHBpdEVudHJ5KSk7Cit9CisKK3ZvaWQKK0ZvcndhcmRlcjo6c2V0U3RyYWdnbGVyVGltZXIoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwgYm9vbCBpc1NhdGlzZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZTo6bWlsbGlzZWNvbmRzJiBkYXRhRnJlc2huZXNzUGVyaW9kKQoreworICB0aW1lOjpuYW5vc2Vjb25kcyBzdHJhZ2dsZXJUaW1lID0gdGltZTo6bWlsbGlzZWNvbmRzKDEwMCk7CisKKyAgc2NoZWR1bGVyOjpjYW5jZWwocGl0RW50cnktPm1fc3RyYWdnbGVyVGltZXIpOworICBwaXRFbnRyeS0+bV9zdHJhZ2dsZXJUaW1lciA9IHNjaGVkdWxlcjo6c2NoZWR1bGUoc3RyYWdnbGVyVGltZSwKKyAgICBiaW5kKCZGb3J3YXJkZXI6Om9uSW50ZXJlc3RGaW5hbGl6ZSwgdGhpcywgcGl0RW50cnksIGlzU2F0aXNmaWVkLCBkYXRhRnJlc2huZXNzUGVyaW9kKSk7Cit9CisKK3ZvaWQKK0ZvcndhcmRlcjo6Y2FuY2VsVW5zYXRpc2Z5QW5kU3RyYWdnbGVyVGltZXIoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkKK3sKKyAgc2NoZWR1bGVyOjpjYW5jZWwocGl0RW50cnktPm1fdW5zYXRpc2Z5VGltZXIpOworICBzY2hlZHVsZXI6OmNhbmNlbChwaXRFbnRyeS0+bV9zdHJhZ2dsZXJUaW1lcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW5zZXJ0Tm9uY2VUb0RubChEZWFkTm9uY2VMaXN0JiBkbmwsIGNvbnN0IHBpdDo6RW50cnkmIHBpdEVudHJ5LAorICAgICAgICAgICAgICAgICBjb25zdCBwaXQ6Ok91dFJlY29yZCYgb3V0UmVjb3JkKQoreworICBkbmwuYWRkKHBpdEVudHJ5LmdldE5hbWUoKSwgb3V0UmVjb3JkLmdldExhc3ROb25jZSgpKTsKK30KKwordm9pZAorRm9yd2FyZGVyOjppbnNlcnREZWFkTm9uY2VMaXN0KHBpdDo6RW50cnkmIHBpdEVudHJ5LCBib29sIGlzU2F0aXNmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWU6Om1pbGxpc2Vjb25kcyYgZGF0YUZyZXNobmVzc1BlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlKiB1cHN0cmVhbSkKK3sKKyAgLy8gbmVlZCBEZWFkIE5vbmNlIExpc3QgaW5zZXJ0PworICBib29sIG5lZWREbmwgPSBmYWxzZTsKKyAgaWYgKGlzU2F0aXNmaWVkKSB7CisgICAgYm9vbCBoYXNGcmVzaG5lc3NQZXJpb2QgPSBkYXRhRnJlc2huZXNzUGVyaW9kID49IHRpbWU6Om1pbGxpc2Vjb25kczo6emVybygpOworICAgIC8vIERhdGEgbmV2ZXIgYmVjb21lcyBzdGFsZSBpZiBpdCBkb2Vzbid0IGhhdmUgRnJlc2huZXNzUGVyaW9kIGZpZWxkCisgICAgbmVlZERubCA9IHN0YXRpY19jYXN0PGJvb2w+KHBpdEVudHJ5LmdldEludGVyZXN0KCkuZ2V0TXVzdEJlRnJlc2goKSkgJiYKKyAgICAgICAgICAgICAgKGhhc0ZyZXNobmVzc1BlcmlvZCAmJiBkYXRhRnJlc2huZXNzUGVyaW9kIDwgbV9kZWFkTm9uY2VMaXN0LmdldExpZmV0aW1lKCkpOworICB9CisgIGVsc2UgeworICAgIG5lZWREbmwgPSB0cnVlOworICB9CisKKyAgaWYgKCFuZWVkRG5sKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRGVhZCBOb25jZSBMaXN0IGluc2VydAorICBpZiAodXBzdHJlYW0gPT0gMCkgeworICAgIC8vIGluc2VydCBhbGwgb3V0Z29pbmcgTm9uY2VzCisgICAgY29uc3QgcGl0OjpPdXRSZWNvcmRDb2xsZWN0aW9uJiBvdXRSZWNvcmRzID0gcGl0RW50cnkuZ2V0T3V0UmVjb3JkcygpOworICAgIHN0ZDo6Zm9yX2VhY2gob3V0UmVjb3Jkcy5iZWdpbigpLCBvdXRSZWNvcmRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgYmluZCgmaW5zZXJ0Tm9uY2VUb0RubCwgcmVmKG1fZGVhZE5vbmNlTGlzdCksIGNyZWYocGl0RW50cnkpLCBfMSkpOworICB9CisgIGVsc2UgeworICAgIC8vIGluc2VydCBvdXRnb2luZyBOb25jZSBvZiBhIHNwZWNpZmljIGZhY2UKKyAgICBwaXQ6Ok91dFJlY29yZENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIG91dFJlY29yZCA9IHBpdEVudHJ5LmdldE91dFJlY29yZCgqdXBzdHJlYW0pOworICAgIGlmIChvdXRSZWNvcmQgIT0gcGl0RW50cnkuZ2V0T3V0UmVjb3JkcygpLmVuZCgpKSB7CisgICAgICBtX2RlYWROb25jZUxpc3QuYWRkKHBpdEVudHJ5LmdldE5hbWUoKSwgb3V0UmVjb3JkLT5nZXRMYXN0Tm9uY2UoKSk7CisgICAgfQorICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mdy9mb3J3YXJkZXIuaHBwIGIvTkZEL2RhZW1vbi9mdy9mb3J3YXJkZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTNmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L2ZvcndhcmRlci5ocHAKQEAgLTAsMCArMSwzMDEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GV19GT1JXQVJERVJfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRldfRk9SV0FSREVSX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisjaW5jbHVkZSAiZm9yd2FyZGVyLWNvdW50ZXJzLmhwcCIKKyNpbmNsdWRlICJmYWNlLXRhYmxlLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9maWIuaHBwIgorI2luY2x1ZGUgInRhYmxlL3BpdC5ocHAiCisjaW5jbHVkZSAidGFibGUvY3MuaHBwIgorI2luY2x1ZGUgInRhYmxlL21lYXN1cmVtZW50cy5ocHAiCisjaW5jbHVkZSAidGFibGUvc3RyYXRlZ3ktY2hvaWNlLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9kZWFkLW5vbmNlLWxpc3QuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworbmFtZXNwYWNlIGZ3IHsKK2NsYXNzIFN0cmF0ZWd5OworfSAvLyBuYW1lc3BhY2UgZncKKworLyoqIFxicmllZiBtYWluIGNsYXNzIG9mIE5GRAorICoKKyAqICBGb3J3YXJkZXIgb3ducyBhbGwgZmFjZXMgYW5kIHRhYmxlcywgYW5kIGltcGxlbWVudHMgZm9yd2FyZGluZyBwaXBlbGluZXMuCisgKi8KK2NsYXNzIEZvcndhcmRlcgoreworcHVibGljOgorICBGb3J3YXJkZXIoKTsKKworICBWSVJUVUFMX1dJVEhfVEVTVFMKKyAgfkZvcndhcmRlcigpOworCisgIGNvbnN0IEZvcndhcmRlckNvdW50ZXJzJgorICBnZXRDb3VudGVycygpIGNvbnN0OworCitwdWJsaWM6IC8vIGZhY2VzCisgIEZhY2VUYWJsZSYKKyAgZ2V0RmFjZVRhYmxlKCk7CisKKyAgLyoqIFxicmllZiBnZXQgZXhpc3RpbmcgRmFjZQorICAgKgorICAgKiAgc2hvcnRjdXQgdG8gLmdldEZhY2VUYWJsZSgpLmdldChmYWNlKQorICAgKi8KKyAgc2hhcmVkX3B0cjxGYWNlPgorICBnZXRGYWNlKEZhY2VJZCBpZCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBhZGQgbmV3IEZhY2UKKyAgICoKKyAgICogIHNob3J0Y3V0IHRvIC5nZXRGYWNlVGFibGUoKS5hZGQoZmFjZSkKKyAgICovCisgIHZvaWQKKyAgYWRkRmFjZShzaGFyZWRfcHRyPEZhY2U+IGZhY2UpOworCitwdWJsaWM6IC8vIGZvcndhcmRpbmcgZW50cnlwb2ludHMgYW5kIHRhYmxlcworICB2b2lkCisgIG9uSW50ZXJlc3QoRmFjZSYgZmFjZSwgY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KTsKKworICB2b2lkCisgIG9uRGF0YShGYWNlJiBmYWNlLCBjb25zdCBEYXRhJiBkYXRhKTsKKworICBOYW1lVHJlZSYKKyAgZ2V0TmFtZVRyZWUoKTsKKworICBGaWImCisgIGdldEZpYigpOworCisgIFBpdCYKKyAgZ2V0UGl0KCk7CisKKyAgQ3MmCisgIGdldENzKCk7CisKKyAgTWVhc3VyZW1lbnRzJgorICBnZXRNZWFzdXJlbWVudHMoKTsKKworICBTdHJhdGVneUNob2ljZSYKKyAgZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKworICBEZWFkTm9uY2VMaXN0JgorICBnZXREZWFkTm9uY2VMaXN0KCk7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURTogLy8gcGlwZWxpbmVzCisgIC8qKiBcYnJpZWYgaW5jb21pbmcgSW50ZXJlc3QgcGlwZWxpbmUKKyAgICovCisgIFZJUlRVQUxfV0lUSF9URVNUUyB2b2lkCisgIG9uSW5jb21pbmdJbnRlcmVzdChGYWNlJiBpbkZhY2UsIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCk7CisKKyAgLyoqIFxicmllZiBJbnRlcmVzdCBsb29wIHBpcGVsaW5lCisgICAqLworICBWSVJUVUFMX1dJVEhfVEVTVFMgdm9pZAorICBvbkludGVyZXN0TG9vcChGYWNlJiBpbkZhY2UsIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSk7CisKKyAgLyoqIFxicmllZiBvdXRnb2luZyBJbnRlcmVzdCBwaXBlbGluZQorICAgKi8KKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgb25PdXRnb2luZ0ludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksIEZhY2UmIG91dEZhY2UsCisgICAgICAgICAgICAgICAgICAgICBib29sIHdhbnROZXdOb25jZSA9IGZhbHNlKTsKKworICAvKiogXGJyaWVmIEludGVyZXN0IHJlamVjdCBwaXBlbGluZQorICAgKi8KKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgb25JbnRlcmVzdFJlamVjdChzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KTsKKworICAvKiogXGJyaWVmIEludGVyZXN0IHVuc2F0aXNmaWVkIHBpcGVsaW5lCisgICAqLworICBWSVJUVUFMX1dJVEhfVEVTVFMgdm9pZAorICBvbkludGVyZXN0VW5zYXRpc2ZpZWQoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSk7CisKKyAgLyoqIFxicmllZiBJbnRlcmVzdCBmaW5hbGl6ZSBwaXBlbGluZQorICAgKiAgXHBhcmFtIGlzU2F0aXNmaWVkIHdoZXRoZXIgdGhlIEludGVyZXN0IGhhcyBiZWVuIHNhdGlzZmllZAorICAgKiAgXHBhcmFtIGRhdGFGcmVzaG5lc3NQZXJpb2QgRnJlc2huZXNzUGVyaW9kIG9mIHNhdGlzZnlpbmcgRGF0YQorICAgKi8KKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgb25JbnRlcmVzdEZpbmFsaXplKHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksIGJvb2wgaXNTYXRpc2ZpZWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lOjptaWxsaXNlY29uZHMmIGRhdGFGcmVzaG5lc3NQZXJpb2QgPSB0aW1lOjptaWxsaXNlY29uZHMoLTEpKTsKKworICAvKiogXGJyaWVmIGluY29taW5nIERhdGEgcGlwZWxpbmUKKyAgICovCisgIFZJUlRVQUxfV0lUSF9URVNUUyB2b2lkCisgIG9uSW5jb21pbmdEYXRhKEZhY2UmIGluRmFjZSwgY29uc3QgRGF0YSYgZGF0YSk7CisKKyAgLyoqIFxicmllZiBEYXRhIHVuc29saWNpdGVkIHBpcGVsaW5lCisgICAqLworICBWSVJUVUFMX1dJVEhfVEVTVFMgdm9pZAorICBvbkRhdGFVbnNvbGljaXRlZChGYWNlJiBpbkZhY2UsIGNvbnN0IERhdGEmIGRhdGEpOworCisgIC8qKiBcYnJpZWYgb3V0Z29pbmcgRGF0YSBwaXBlbGluZQorICAgKi8KKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgb25PdXRnb2luZ0RhdGEoY29uc3QgRGF0YSYgZGF0YSwgRmFjZSYgb3V0RmFjZSk7CisKK1BST1RFQ1RFRF9XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgc2V0VW5zYXRpc2Z5VGltZXIoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSk7CisKKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgc2V0U3RyYWdnbGVyVGltZXIoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwgYm9vbCBpc1NhdGlzZmllZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZTo6bWlsbGlzZWNvbmRzJiBkYXRhRnJlc2huZXNzUGVyaW9kID0gdGltZTo6bWlsbGlzZWNvbmRzKC0xKSk7CisKKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgY2FuY2VsVW5zYXRpc2Z5QW5kU3RyYWdnbGVyVGltZXIoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSk7CisKKyAgLyoqIFxicmllZiBpbnNlcnQgTm9uY2UgdG8gRGVhZCBOb25jZSBMaXN0IGlmIG5lY2Vzc2FyeQorICAgKiAgXHBhcmFtIHVwc3RyZWFtIGlmIG51bGwsIGluc2VydCBOb25jZXMgZnJvbSBhbGwgT3V0UmVjb3JkczsKKyAgICogICAgICAgICAgICAgICAgICBpZiBub3QgbnVsbCwgaW5zZXJ0IE5vbmNlIG9ubHkgb24gdGhlIE91dFJlY29yZCBvZiB0aGlzIGZhY2UKKyAgICovCisgIFZJUlRVQUxfV0lUSF9URVNUUyB2b2lkCisgIGluc2VydERlYWROb25jZUxpc3QocGl0OjpFbnRyeSYgcGl0RW50cnksIGJvb2wgaXNTYXRpc2ZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZTo6bWlsbGlzZWNvbmRzJiBkYXRhRnJlc2huZXNzUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgIEZhY2UqIHVwc3RyZWFtKTsKKworICAvLy8gY2FsbCB0cmlnZ2VyIChtZXRob2QpIG9uIHRoZSBlZmZlY3RpdmUgc3RyYXRlZ3kgb2YgcGl0RW50cnkKKyNpZmRlZiBXSVRIX1RFU1RTCisgIHZpcnR1YWwgdm9pZAorICBkaXNwYXRjaFRvU3RyYXRlZ3koc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwgZnVuY3Rpb248dm9pZChmdzo6U3RyYXRlZ3kqKT4gdHJpZ2dlcik7CisjZWxzZQorICB0ZW1wbGF0ZTxjbGFzcyBGdW5jdGlvbj4KKyAgdm9pZAorICBkaXNwYXRjaFRvU3RyYXRlZ3koc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwgRnVuY3Rpb24gdHJpZ2dlcik7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgRm9yd2FyZGVyQ291bnRlcnMgbV9jb3VudGVyczsKKworICBGYWNlVGFibGUgbV9mYWNlVGFibGU7CisKKyAgLy8gdGFibGVzCisgIE5hbWVUcmVlICAgICAgIG1fbmFtZVRyZWU7CisgIEZpYiAgICAgICAgICAgIG1fZmliOworICBQaXQgICAgICAgICAgICBtX3BpdDsKKyAgQ3MgICAgICAgICAgICAgbV9jczsKKyAgTWVhc3VyZW1lbnRzICAgbV9tZWFzdXJlbWVudHM7CisgIFN0cmF0ZWd5Q2hvaWNlIG1fc3RyYXRlZ3lDaG9pY2U7CisgIERlYWROb25jZUxpc3QgIG1fZGVhZE5vbmNlTGlzdDsKKworICBzdGF0aWMgY29uc3QgTmFtZSBMT0NBTEhPU1RfTkFNRTsKKworICAvLyBhbGxvdyBTdHJhdGVneSAoYmFzZSBjbGFzcykgdG8gZW50ZXIgcGlwZWxpbmVzCisgIGZyaWVuZCBjbGFzcyBmdzo6U3RyYXRlZ3k7Cit9OworCitpbmxpbmUgY29uc3QgRm9yd2FyZGVyQ291bnRlcnMmCitGb3J3YXJkZXI6OmdldENvdW50ZXJzKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fY291bnRlcnM7Cit9CisKK2lubGluZSBGYWNlVGFibGUmCitGb3J3YXJkZXI6OmdldEZhY2VUYWJsZSgpCit7CisgIHJldHVybiBtX2ZhY2VUYWJsZTsKK30KKworaW5saW5lIHNoYXJlZF9wdHI8RmFjZT4KK0ZvcndhcmRlcjo6Z2V0RmFjZShGYWNlSWQgaWQpIGNvbnN0Cit7CisgIHJldHVybiBtX2ZhY2VUYWJsZS5nZXQoaWQpOworfQorCitpbmxpbmUgdm9pZAorRm9yd2FyZGVyOjphZGRGYWNlKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSkKK3sKKyAgbV9mYWNlVGFibGUuYWRkKGZhY2UpOworfQorCitpbmxpbmUgdm9pZAorRm9yd2FyZGVyOjpvbkludGVyZXN0KEZhY2UmIGZhY2UsIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKK3sKKyAgdGhpcy0+b25JbmNvbWluZ0ludGVyZXN0KGZhY2UsIGludGVyZXN0KTsKK30KKworaW5saW5lIHZvaWQKK0ZvcndhcmRlcjo6b25EYXRhKEZhY2UmIGZhY2UsIGNvbnN0IERhdGEmIGRhdGEpCit7CisgIHRoaXMtPm9uSW5jb21pbmdEYXRhKGZhY2UsIGRhdGEpOworfQorCitpbmxpbmUgTmFtZVRyZWUmCitGb3J3YXJkZXI6OmdldE5hbWVUcmVlKCkKK3sKKyAgcmV0dXJuIG1fbmFtZVRyZWU7Cit9CisKK2lubGluZSBGaWImCitGb3J3YXJkZXI6OmdldEZpYigpCit7CisgIHJldHVybiBtX2ZpYjsKK30KKworaW5saW5lIFBpdCYKK0ZvcndhcmRlcjo6Z2V0UGl0KCkKK3sKKyAgcmV0dXJuIG1fcGl0OworfQorCitpbmxpbmUgQ3MmCitGb3J3YXJkZXI6OmdldENzKCkKK3sKKyAgcmV0dXJuIG1fY3M7Cit9CisKK2lubGluZSBNZWFzdXJlbWVudHMmCitGb3J3YXJkZXI6OmdldE1lYXN1cmVtZW50cygpCit7CisgIHJldHVybiBtX21lYXN1cmVtZW50czsKK30KKworaW5saW5lIFN0cmF0ZWd5Q2hvaWNlJgorRm9yd2FyZGVyOjpnZXRTdHJhdGVneUNob2ljZSgpCit7CisgIHJldHVybiBtX3N0cmF0ZWd5Q2hvaWNlOworfQorCitpbmxpbmUgRGVhZE5vbmNlTGlzdCYKK0ZvcndhcmRlcjo6Z2V0RGVhZE5vbmNlTGlzdCgpCit7CisgIHJldHVybiBtX2RlYWROb25jZUxpc3Q7Cit9CisKKyNpZmRlZiBXSVRIX1RFU1RTCitpbmxpbmUgdm9pZAorRm9yd2FyZGVyOjpkaXNwYXRjaFRvU3RyYXRlZ3koc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwgZnVuY3Rpb248dm9pZChmdzo6U3RyYXRlZ3kqKT4gdHJpZ2dlcikKKyNlbHNlCit0ZW1wbGF0ZTxjbGFzcyBGdW5jdGlvbj4KK2lubGluZSB2b2lkCitGb3J3YXJkZXI6OmRpc3BhdGNoVG9TdHJhdGVneShzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5LCBGdW5jdGlvbiB0cmlnZ2VyKQorI2VuZGlmCit7CisgIGZ3OjpTdHJhdGVneSYgc3RyYXRlZ3kgPSBtX3N0cmF0ZWd5Q2hvaWNlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgqcGl0RW50cnkpOworICB0cmlnZ2VyKCZzdHJhdGVneSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GV19GT1JXQVJERVJfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L25jYy1zdHJhdGVneS5jcHAgYi9ORkQvZGFlbW9uL2Z3L25jYy1zdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhYWFiOQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vZncvbmNjLXN0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDMxNCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm5jYy1zdHJhdGVneS5ocHAiCisjaW5jbHVkZSAiY29yZS9yYW5kb20uaHBwIgorI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS91bmlmb3JtX2ludF9kaXN0cmlidXRpb24uaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmdyB7CisKK2NvbnN0IE5hbWUgTmNjU3RyYXRlZ3k6OlNUUkFURUdZX05BTUUoIm5kbjovbG9jYWxob3N0L25mZC9zdHJhdGVneS9uY2MvJUZEJTAxIik7CisKK05jY1N0cmF0ZWd5OjpOY2NTdHJhdGVneShGb3J3YXJkZXImIGZvcndhcmRlciwgY29uc3QgTmFtZSYgbmFtZSkKKyAgOiBTdHJhdGVneShmb3J3YXJkZXIsIG5hbWUpCit7Cit9CisKK05jY1N0cmF0ZWd5Ojp+TmNjU3RyYXRlZ3koKQoreworfQorCitjb25zdCB0aW1lOjptaWNyb3NlY29uZHMgTmNjU3RyYXRlZ3k6OkRFRkVSX0ZJUlNUX1dJVEhPVVRfQkVTVF9GQUNFID0gdGltZTo6bWljcm9zZWNvbmRzKDQwMDApOworY29uc3QgdGltZTo6bWljcm9zZWNvbmRzIE5jY1N0cmF0ZWd5OjpERUZFUl9SQU5HRV9XSVRIT1VUX0JFU1RfRkFDRSA9IHRpbWU6Om1pY3Jvc2Vjb25kcyg3NTAwMCk7Citjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBOY2NTdHJhdGVneTo6TUVBU1VSRU1FTlRTX0xJRkVUSU1FID0gdGltZTo6c2Vjb25kcygxNik7CisKK3ZvaWQKK05jY1N0cmF0ZWd5OjphZnRlclJlY2VpdmVJbnRlcmVzdChjb25zdCBGYWNlJiBpbkZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkKK3sKKyAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHMgPSBmaWJFbnRyeS0+Z2V0TmV4dEhvcHMoKTsKKyAgaWYgKG5leHRob3BzLnNpemUoKSA9PSAwKSB7CisgICAgdGhpcy0+cmVqZWN0UGVuZGluZ0ludGVyZXN0KHBpdEVudHJ5KTsKKyAgICByZXR1cm47CisgIH0KKworICBzaGFyZWRfcHRyPFBpdEVudHJ5SW5mbz4gcGl0RW50cnlJbmZvID0KKyAgICBwaXRFbnRyeS0+Z2V0T3JDcmVhdGVTdHJhdGVneUluZm88UGl0RW50cnlJbmZvPigpOworICBib29sIGlzTmV3UGl0RW50cnkgPSAhcGl0RW50cnktPmhhc1VuZXhwaXJlZE91dFJlY29yZHMoKTsKKyAgaWYgKCFpc05ld1BpdEVudHJ5KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc2hhcmVkX3B0cjxNZWFzdXJlbWVudHNFbnRyeUluZm8+IG1lYXN1cmVtZW50c0VudHJ5SW5mbyA9CisgICAgdGhpcy0+Z2V0TWVhc3VyZW1lbnRzRW50cnlJbmZvKHBpdEVudHJ5KTsKKworICB0aW1lOjptaWNyb3NlY29uZHMgZGVmZXJGaXJzdCA9IERFRkVSX0ZJUlNUX1dJVEhPVVRfQkVTVF9GQUNFOworICB0aW1lOjptaWNyb3NlY29uZHMgZGVmZXJSYW5nZSA9IERFRkVSX1JBTkdFX1dJVEhPVVRfQkVTVF9GQUNFOworICBzaXplX3QgblVwc3RyZWFtcyA9IG5leHRob3BzLnNpemUoKTsKKworICBzaGFyZWRfcHRyPEZhY2U+IGJlc3RGYWNlID0gbWVhc3VyZW1lbnRzRW50cnlJbmZvLT5nZXRCZXN0RmFjZSgpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oYmVzdEZhY2UpICYmIGZpYkVudHJ5LT5oYXNOZXh0SG9wKGJlc3RGYWNlKSAmJgorICAgICAgcGl0RW50cnktPmNhbkZvcndhcmRUbygqYmVzdEZhY2UpKSB7CisgICAgLy8gVE9ETyBTaG91bGQgd2UgdXNlIGByYW5kbG93ID0gMTAwICsgbnJhbmQ0OChoLT5zZWVkKSAlIDQwOTZVO2AgPworICAgIGRlZmVyRmlyc3QgPSBtZWFzdXJlbWVudHNFbnRyeUluZm8tPnByZWRpY3Rpb247CisgICAgZGVmZXJSYW5nZSA9IHRpbWU6Om1pY3Jvc2Vjb25kcygoZGVmZXJGaXJzdC5jb3VudCgpICsgMSkgLyAyKTsKKyAgICAtLW5VcHN0cmVhbXM7CisgICAgdGhpcy0+c2VuZEludGVyZXN0KHBpdEVudHJ5LCBiZXN0RmFjZSk7CisgICAgcGl0RW50cnlJbmZvLT5iZXN0RmFjZVRpbWVvdXQgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKAorICAgICAgbWVhc3VyZW1lbnRzRW50cnlJbmZvLT5wcmVkaWN0aW9uLAorICAgICAgYmluZCgmTmNjU3RyYXRlZ3k6OnRpbWVvdXRPbkJlc3RGYWNlLCB0aGlzLCB3ZWFrX3B0cjxwaXQ6OkVudHJ5PihwaXRFbnRyeSkpKTsKKyAgfQorICBlbHNlIHsKKyAgICAvLyB1c2UgZmlyc3QgbmV4dGhvcAorICAgIHRoaXMtPnNlbmRJbnRlcmVzdChwaXRFbnRyeSwgbmV4dGhvcHMuYmVnaW4oKS0+Z2V0RmFjZSgpKTsKKyAgICAvLyBUT0RPIGF2b2lkIHNlbmRpbmcgdG8gaW5GYWNlCisgIH0KKworICBzaGFyZWRfcHRyPEZhY2U+IHByZXZpb3VzRmFjZSA9IG1lYXN1cmVtZW50c0VudHJ5SW5mby0+cHJldmlvdXNGYWNlLmxvY2soKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHByZXZpb3VzRmFjZSkgJiYgZmliRW50cnktPmhhc05leHRIb3AocHJldmlvdXNGYWNlKSAmJgorICAgICAgcGl0RW50cnktPmNhbkZvcndhcmRUbygqcHJldmlvdXNGYWNlKSkgeworICAgIC0tblVwc3RyZWFtczsKKyAgfQorCisgIGlmIChuVXBzdHJlYW1zID4gMCkgeworICAgIHBpdEVudHJ5SW5mby0+bWF4SW50ZXJ2YWwgPSBzdGQ6Om1heCh0aW1lOjptaWNyb3NlY29uZHMoMSksCisgICAgICB0aW1lOjptaWNyb3NlY29uZHMoKDIgKiBkZWZlclJhbmdlLmNvdW50KCkgKyBuVXBzdHJlYW1zIC0gMSkgLyBuVXBzdHJlYW1zKSk7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gTm9ybWFsbHksIG1heEludGVydmFsIGlzIHVudXNlZCBpZiB0aGVyZSBhcmVuJ3QgYW55IGZhY2UgYmV5b25kIGJlc3QgYW5kIHByZXZpb3VzQmVzdC4KKyAgICAvLyBIb3dldmVyLCBpbiBjYXNlIEZJQiBlbnRyeSBnYWlucyBhIG5ldyBuZXh0aG9wIGJlZm9yZSBkb1Byb3BhZ2F0ZSBleGVjdXRlcyAoYnVnIDE4NTMpLAorICAgIC8vIHRoaXMgbWF4SW50ZXJ2YWwgd291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiB0aGUgbmV4dCBkb1Byb3BhZ2F0ZSB3b3VsZCBoYXBwZW4uCisgICAgcGl0RW50cnlJbmZvLT5tYXhJbnRlcnZhbCA9IGRlZmVyRmlyc3Q7CisgIH0KKyAgcGl0RW50cnlJbmZvLT5wcm9wYWdhdGVUaW1lciA9IHNjaGVkdWxlcjo6c2NoZWR1bGUoZGVmZXJGaXJzdCwKKyAgICBiaW5kKCZOY2NTdHJhdGVneTo6ZG9Qcm9wYWdhdGUsIHRoaXMsCisgICAgICAgICB3ZWFrX3B0cjxwaXQ6OkVudHJ5PihwaXRFbnRyeSksIHdlYWtfcHRyPGZpYjo6RW50cnk+KGZpYkVudHJ5KSkpOworfQorCit2b2lkCitOY2NTdHJhdGVneTo6ZG9Qcm9wYWdhdGUod2Vha19wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnlXZWFrLCB3ZWFrX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeVdlYWspCit7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkgPSBwaXRFbnRyeVdlYWsubG9jaygpOworICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHBpdEVudHJ5KSkgeworICAgIHJldHVybjsKKyAgfQorICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5ID0gZmliRW50cnlXZWFrLmxvY2soKTsKKyAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihmaWJFbnRyeSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzaGFyZWRfcHRyPFBpdEVudHJ5SW5mbz4gcGl0RW50cnlJbmZvID0gcGl0RW50cnktPmdldFN0cmF0ZWd5SW5mbzxQaXRFbnRyeUluZm8+KCk7CisgIC8vIHBpdEVudHJ5SW5mbyBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IGhlcmUsIGJlY2F1c2UgZG9Qcm9wYWdhdGUgaXMgdHJpZ2dlcmVkCisgIC8vIGZyb20gYSB0aW1lciBzZXQgYnkgTmNjU3RyYXRlZ3kuCisgIEJPT1NUX0FTU0VSVChzdGF0aWNfY2FzdDxib29sPihwaXRFbnRyeUluZm8pKTsKKworICBzaGFyZWRfcHRyPE1lYXN1cmVtZW50c0VudHJ5SW5mbz4gbWVhc3VyZW1lbnRzRW50cnlJbmZvID0KKyAgICB0aGlzLT5nZXRNZWFzdXJlbWVudHNFbnRyeUluZm8ocGl0RW50cnkpOworCisgIHNoYXJlZF9wdHI8RmFjZT4gcHJldmlvdXNGYWNlID0gbWVhc3VyZW1lbnRzRW50cnlJbmZvLT5wcmV2aW91c0ZhY2UubG9jaygpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocHJldmlvdXNGYWNlKSAmJiBmaWJFbnRyeS0+aGFzTmV4dEhvcChwcmV2aW91c0ZhY2UpICYmCisgICAgICBwaXRFbnRyeS0+Y2FuRm9yd2FyZFRvKCpwcmV2aW91c0ZhY2UpKSB7CisgICAgdGhpcy0+c2VuZEludGVyZXN0KHBpdEVudHJ5LCBwcmV2aW91c0ZhY2UpOworICB9CisKKyAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHMgPSBmaWJFbnRyeS0+Z2V0TmV4dEhvcHMoKTsKKyAgYm9vbCBpc0ZvcndhcmRlZCA9IGZhbHNlOworICBmb3IgKGZpYjo6TmV4dEhvcExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmV4dGhvcHMuYmVnaW4oKTsgaXQgIT0gbmV4dGhvcHMuZW5kKCk7ICsraXQpIHsKKyAgICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UgPSBpdC0+Z2V0RmFjZSgpOworICAgIGlmIChwaXRFbnRyeS0+Y2FuRm9yd2FyZFRvKCpmYWNlKSkgeworICAgICAgaXNGb3J3YXJkZWQgPSB0cnVlOworICAgICAgdGhpcy0+c2VuZEludGVyZXN0KHBpdEVudHJ5LCBmYWNlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChpc0ZvcndhcmRlZCkgeworICAgIGJvb3N0OjpyYW5kb206OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjx0aW1lOjpuYW5vc2Vjb25kczo6cmVwPiBkaXN0KDAsCisgICAgICBwaXRFbnRyeUluZm8tPm1heEludGVydmFsLmNvdW50KCkgLSAxKTsKKyAgICB0aW1lOjpuYW5vc2Vjb25kcyBkZWZlck5leHQgPSB0aW1lOjpuYW5vc2Vjb25kcyhkaXN0KGdldEdsb2JhbFJuZygpKSk7CisgICAgcGl0RW50cnlJbmZvLT5wcm9wYWdhdGVUaW1lciA9IHNjaGVkdWxlcjo6c2NoZWR1bGUoZGVmZXJOZXh0LAorICAgIGJpbmQoJk5jY1N0cmF0ZWd5Ojpkb1Byb3BhZ2F0ZSwgdGhpcywKKyAgICAgICAgIHdlYWtfcHRyPHBpdDo6RW50cnk+KHBpdEVudHJ5KSwgd2Vha19wdHI8ZmliOjpFbnRyeT4oZmliRW50cnkpKSk7CisgIH0KK30KKwordm9pZAorTmNjU3RyYXRlZ3k6OnRpbWVvdXRPbkJlc3RGYWNlKHdlYWtfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5V2VhaykKK3sKKyAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSA9IHBpdEVudHJ5V2Vhay5sb2NrKCk7CisgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4ocGl0RW50cnkpKSB7CisgICAgcmV0dXJuOworICB9CisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4gbWVhc3VyZW1lbnRzRW50cnkgPSB0aGlzLT5nZXRNZWFzdXJlbWVudHMoKS5nZXQoKnBpdEVudHJ5KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IFVQREFURV9NRUFTVVJFTUVOVFNfTl9MRVZFTFM7ICsraSkgeworICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4obWVhc3VyZW1lbnRzRW50cnkpKSB7CisgICAgICAvLyBnb2luZyBvdXQgb2YgdGhpcyBzdHJhdGVneSdzIG5hbWVzcGFjZQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aGlzLT5nZXRNZWFzdXJlbWVudHMoKS5leHRlbmRMaWZldGltZSgqbWVhc3VyZW1lbnRzRW50cnksIE1FQVNVUkVNRU5UU19MSUZFVElNRSk7CisKKyAgICBzaGFyZWRfcHRyPE1lYXN1cmVtZW50c0VudHJ5SW5mbz4gbWVhc3VyZW1lbnRzRW50cnlJbmZvID0KKyAgICAgIHRoaXMtPmdldE1lYXN1cmVtZW50c0VudHJ5SW5mbyhtZWFzdXJlbWVudHNFbnRyeSk7CisgICAgbWVhc3VyZW1lbnRzRW50cnlJbmZvLT5hZGp1c3RQcmVkaWN0VXAoKTsKKworICAgIG1lYXN1cmVtZW50c0VudHJ5ID0gdGhpcy0+Z2V0TWVhc3VyZW1lbnRzKCkuZ2V0UGFyZW50KCptZWFzdXJlbWVudHNFbnRyeSk7CisgIH0KK30KKwordm9pZAorTmNjU3RyYXRlZ3k6OmJlZm9yZVNhdGlzZnlJbnRlcmVzdChzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlJiBpbkZhY2UsIGNvbnN0IERhdGEmIGRhdGEpCit7CisgIGlmIChwaXRFbnRyeS0+Z2V0SW5SZWNvcmRzKCkuZW1wdHkoKSkgeworICAgIC8vIFBJVCBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHNhdGlzZmllZCAoYW5kIGlzIG5vdyB3YWl0aW5nIGZvciBzdHJhZ2dsZXIgdGltZXIgdG8gZXhwaXJlKQorICAgIC8vIE5DQyBkb2VzIG5vdCBjb2xsZWN0IG1lYXN1cmVtZW50cyBmb3Igbm9uLWJlc3QgZmFjZQorICAgIHJldHVybjsKKyAgfQorCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4gbWVhc3VyZW1lbnRzRW50cnkgPSB0aGlzLT5nZXRNZWFzdXJlbWVudHMoKS5nZXQoKnBpdEVudHJ5KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IFVQREFURV9NRUFTVVJFTUVOVFNfTl9MRVZFTFM7ICsraSkgeworICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4obWVhc3VyZW1lbnRzRW50cnkpKSB7CisgICAgICAvLyBnb2luZyBvdXQgb2YgdGhpcyBzdHJhdGVneSdzIG5hbWVzcGFjZQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aGlzLT5nZXRNZWFzdXJlbWVudHMoKS5leHRlbmRMaWZldGltZSgqbWVhc3VyZW1lbnRzRW50cnksIE1FQVNVUkVNRU5UU19MSUZFVElNRSk7CisKKyAgICBzaGFyZWRfcHRyPE1lYXN1cmVtZW50c0VudHJ5SW5mbz4gbWVhc3VyZW1lbnRzRW50cnlJbmZvID0KKyAgICAgIHRoaXMtPmdldE1lYXN1cmVtZW50c0VudHJ5SW5mbyhtZWFzdXJlbWVudHNFbnRyeSk7CisgICAgbWVhc3VyZW1lbnRzRW50cnlJbmZvLT51cGRhdGVCZXN0RmFjZShpbkZhY2UpOworCisgICAgbWVhc3VyZW1lbnRzRW50cnkgPSB0aGlzLT5nZXRNZWFzdXJlbWVudHMoKS5nZXRQYXJlbnQoKm1lYXN1cmVtZW50c0VudHJ5KTsKKyAgfQorCisgIHNoYXJlZF9wdHI8UGl0RW50cnlJbmZvPiBwaXRFbnRyeUluZm8gPSBwaXRFbnRyeS0+Z2V0U3RyYXRlZ3lJbmZvPFBpdEVudHJ5SW5mbz4oKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHBpdEVudHJ5SW5mbykpIHsKKyAgICBzY2hlZHVsZXI6OmNhbmNlbChwaXRFbnRyeUluZm8tPnByb3BhZ2F0ZVRpbWVyKTsKKyAgfQorfQorCitzaGFyZWRfcHRyPE5jY1N0cmF0ZWd5OjpNZWFzdXJlbWVudHNFbnRyeUluZm8+CitOY2NTdHJhdGVneTo6Z2V0TWVhc3VyZW1lbnRzRW50cnlJbmZvKHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gZW50cnkpCit7CisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4gbWVhc3VyZW1lbnRzRW50cnkgPSB0aGlzLT5nZXRNZWFzdXJlbWVudHMoKS5nZXQoKmVudHJ5KTsKKyAgcmV0dXJuIHRoaXMtPmdldE1lYXN1cmVtZW50c0VudHJ5SW5mbyhtZWFzdXJlbWVudHNFbnRyeSk7Cit9CisKK3NoYXJlZF9wdHI8TmNjU3RyYXRlZ3k6Ok1lYXN1cmVtZW50c0VudHJ5SW5mbz4KK05jY1N0cmF0ZWd5OjpnZXRNZWFzdXJlbWVudHNFbnRyeUluZm8oc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiBlbnRyeSkKK3sKKyAgc2hhcmVkX3B0cjxNZWFzdXJlbWVudHNFbnRyeUluZm8+IGluZm8gPSBlbnRyeS0+Z2V0U3RyYXRlZ3lJbmZvPE1lYXN1cmVtZW50c0VudHJ5SW5mbz4oKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGluZm8pKSB7CisgICAgcmV0dXJuIGluZm87CisgIH0KKworICBpbmZvID0gbWFrZV9zaGFyZWQ8TWVhc3VyZW1lbnRzRW50cnlJbmZvPigpOworICBlbnRyeS0+c2V0U3RyYXRlZ3lJbmZvKGluZm8pOworCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4gcGFyZW50RW50cnkgPSB0aGlzLT5nZXRNZWFzdXJlbWVudHMoKS5nZXRQYXJlbnQoKmVudHJ5KTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHBhcmVudEVudHJ5KSkgeworICAgIHNoYXJlZF9wdHI8TWVhc3VyZW1lbnRzRW50cnlJbmZvPiBwYXJlbnRJbmZvID0gdGhpcy0+Z2V0TWVhc3VyZW1lbnRzRW50cnlJbmZvKHBhcmVudEVudHJ5KTsKKyAgICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyZW50SW5mbykpOworICAgIGluZm8tPmluaGVyaXRGcm9tKCpwYXJlbnRJbmZvKTsKKyAgfQorCisgIHJldHVybiBpbmZvOworfQorCisKK2NvbnN0IHRpbWU6Om1pY3Jvc2Vjb25kcyBOY2NTdHJhdGVneTo6TWVhc3VyZW1lbnRzRW50cnlJbmZvOjpJTklUSUFMX1BSRURJQ1RJT04gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6Om1pY3Jvc2Vjb25kcyg4MTkyKTsKK2NvbnN0IHRpbWU6Om1pY3Jvc2Vjb25kcyBOY2NTdHJhdGVneTo6TWVhc3VyZW1lbnRzRW50cnlJbmZvOjpNSU5fUFJFRElDVElPTiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTo6bWljcm9zZWNvbmRzKDEyNyk7Citjb25zdCB0aW1lOjptaWNyb3NlY29uZHMgTmNjU3RyYXRlZ3k6Ok1lYXN1cmVtZW50c0VudHJ5SW5mbzo6TUFYX1BSRURJQ1RJT04gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6Om1pY3Jvc2Vjb25kcygxNjAwMDApOworCitOY2NTdHJhdGVneTo6TWVhc3VyZW1lbnRzRW50cnlJbmZvOjpNZWFzdXJlbWVudHNFbnRyeUluZm8oKQorICA6IHByZWRpY3Rpb24oSU5JVElBTF9QUkVESUNUSU9OKQoreworfQorCit2b2lkCitOY2NTdHJhdGVneTo6TWVhc3VyZW1lbnRzRW50cnlJbmZvOjppbmhlcml0RnJvbShjb25zdCBNZWFzdXJlbWVudHNFbnRyeUluZm8mIG90aGVyKQoreworICB0aGlzLT5vcGVyYXRvcj0ob3RoZXIpOworfQorCitzaGFyZWRfcHRyPEZhY2U+CitOY2NTdHJhdGVneTo6TWVhc3VyZW1lbnRzRW50cnlJbmZvOjpnZXRCZXN0RmFjZSh2b2lkKSB7CisgIHNoYXJlZF9wdHI8RmFjZT4gYmVzdCA9IHRoaXMtPmJlc3RGYWNlLmxvY2soKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGJlc3QpKSB7CisgICAgcmV0dXJuIGJlc3Q7CisgIH0KKyAgdGhpcy0+YmVzdEZhY2UgPSBiZXN0ID0gdGhpcy0+cHJldmlvdXNGYWNlLmxvY2soKTsKKyAgcmV0dXJuIGJlc3Q7Cit9CisKK3ZvaWQKK05jY1N0cmF0ZWd5OjpNZWFzdXJlbWVudHNFbnRyeUluZm86OnVwZGF0ZUJlc3RGYWNlKGNvbnN0IEZhY2UmIGZhY2UpIHsKKyAgaWYgKHRoaXMtPmJlc3RGYWNlLmV4cGlyZWQoKSkgeworICAgIHRoaXMtPmJlc3RGYWNlID0gY29uc3RfY2FzdDxGYWNlJj4oZmFjZSkuc2hhcmVkX2Zyb21fdGhpcygpOworICAgIHJldHVybjsKKyAgfQorICBzaGFyZWRfcHRyPEZhY2U+IGJlc3RGYWNlID0gdGhpcy0+YmVzdEZhY2UubG9jaygpOworICBpZiAoYmVzdEZhY2UuZ2V0KCkgPT0gJmZhY2UpIHsKKyAgICB0aGlzLT5hZGp1c3RQcmVkaWN0RG93bigpOworICB9CisgIGVsc2UgeworICAgIHRoaXMtPnByZXZpb3VzRmFjZSA9IHRoaXMtPmJlc3RGYWNlOworICAgIHRoaXMtPmJlc3RGYWNlID0gY29uc3RfY2FzdDxGYWNlJj4oZmFjZSkuc2hhcmVkX2Zyb21fdGhpcygpOworICB9Cit9CisKK3ZvaWQKK05jY1N0cmF0ZWd5OjpNZWFzdXJlbWVudHNFbnRyeUluZm86OmFkanVzdFByZWRpY3REb3duKCkgeworICBwcmVkaWN0aW9uID0gc3RkOjptYXgoTUlOX1BSRURJQ1RJT04sCisgICAgdGltZTo6bWljcm9zZWNvbmRzKHByZWRpY3Rpb24uY291bnQoKSAtIChwcmVkaWN0aW9uLmNvdW50KCkgPj4gQURKVVNUX1BSRURJQ1RfRE9XTl9TSElGVCkpKTsKK30KKwordm9pZAorTmNjU3RyYXRlZ3k6Ok1lYXN1cmVtZW50c0VudHJ5SW5mbzo6YWRqdXN0UHJlZGljdFVwKCkgeworICBwcmVkaWN0aW9uID0gc3RkOjptaW4oTUFYX1BSRURJQ1RJT04sCisgICAgdGltZTo6bWljcm9zZWNvbmRzKHByZWRpY3Rpb24uY291bnQoKSArIChwcmVkaWN0aW9uLmNvdW50KCkgPj4gQURKVVNUX1BSRURJQ1RfVVBfU0hJRlQpKSk7Cit9CisKK3ZvaWQKK05jY1N0cmF0ZWd5OjpNZWFzdXJlbWVudHNFbnRyeUluZm86OmFnZUJlc3RGYWNlKCkgeworICB0aGlzLT5wcmV2aW91c0ZhY2UgPSB0aGlzLT5iZXN0RmFjZTsKKyAgdGhpcy0+YmVzdEZhY2UucmVzZXQoKTsKK30KKworTmNjU3RyYXRlZ3k6OlBpdEVudHJ5SW5mbzo6flBpdEVudHJ5SW5mbygpCit7CisgIHNjaGVkdWxlcjo6Y2FuY2VsKHRoaXMtPmJlc3RGYWNlVGltZW91dCk7CisgIHNjaGVkdWxlcjo6Y2FuY2VsKHRoaXMtPnByb3BhZ2F0ZVRpbWVyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9mdy9uY2Mtc3RyYXRlZ3kuaHBwIGIvTkZEL2RhZW1vbi9mdy9uY2Mtc3RyYXRlZ3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTQ2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L25jYy1zdHJhdGVneS5ocHAKQEAgLTAsMCArMSwxNDggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GV19OQ0NfU1RSQVRFR1lfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fRldfTkNDX1NUUkFURUdZX0hQUAorCisjaW5jbHVkZSAic3RyYXRlZ3kuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmdyB7CisKKy8qKiBcYnJpZWYgYSBmb3J3YXJkaW5nIHN0cmF0ZWd5IHNpbWlsYXIgdG8gQ0NOeCAwLjcuMgorICovCitjbGFzcyBOY2NTdHJhdGVneSA6IHB1YmxpYyBTdHJhdGVneQoreworcHVibGljOgorICBOY2NTdHJhdGVneShGb3J3YXJkZXImIGZvcndhcmRlciwgY29uc3QgTmFtZSYgbmFtZSA9IFNUUkFURUdZX05BTUUpOworCisgIHZpcnR1YWwKKyAgfk5jY1N0cmF0ZWd5KCk7CisKKyAgdmlydHVhbCB2b2lkCisgIGFmdGVyUmVjZWl2ZUludGVyZXN0KGNvbnN0IEZhY2UmIGluRmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KSBERUNMX09WRVJSSURFOworCisgIHZpcnR1YWwgdm9pZAorICBiZWZvcmVTYXRpc2Z5SW50ZXJlc3Qoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2UmIGluRmFjZSwgY29uc3QgRGF0YSYgZGF0YSkgREVDTF9PVkVSUklERTsKKworcHJvdGVjdGVkOgorICAvLy8gU3RyYXRlZ3lJbmZvIG9uIG1lYXN1cmVtZW50czo6RW50cnkKKyAgY2xhc3MgTWVhc3VyZW1lbnRzRW50cnlJbmZvIDogcHVibGljIFN0cmF0ZWd5SW5mbworICB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGludAorICAgIGdldFR5cGVJZCgpCisgICAgeworICAgICAgcmV0dXJuIDEwMDA7CisgICAgfQorCisgICAgTWVhc3VyZW1lbnRzRW50cnlJbmZvKCk7CisKKyAgICB2b2lkCisgICAgaW5oZXJpdEZyb20oY29uc3QgTWVhc3VyZW1lbnRzRW50cnlJbmZvJiBvdGhlcik7CisKKyAgICBzaGFyZWRfcHRyPEZhY2U+CisgICAgZ2V0QmVzdEZhY2UoKTsKKworICAgIHZvaWQKKyAgICB1cGRhdGVCZXN0RmFjZShjb25zdCBGYWNlJiBmYWNlKTsKKworICAgIHZvaWQKKyAgICBhZGp1c3RQcmVkaWN0VXAoKTsKKworICBwcml2YXRlOgorICAgIHZvaWQKKyAgICBhZGp1c3RQcmVkaWN0RG93bigpOworCisgICAgdm9pZAorICAgIGFnZUJlc3RGYWNlKCk7CisKKyAgcHVibGljOgorICAgIHdlYWtfcHRyPEZhY2U+IGJlc3RGYWNlOworICAgIHdlYWtfcHRyPEZhY2U+IHByZXZpb3VzRmFjZTsKKyAgICB0aW1lOjptaWNyb3NlY29uZHMgcHJlZGljdGlvbjsKKworICAgIHN0YXRpYyBjb25zdCB0aW1lOjptaWNyb3NlY29uZHMgSU5JVElBTF9QUkVESUNUSU9OOworICAgIHN0YXRpYyBjb25zdCB0aW1lOjptaWNyb3NlY29uZHMgTUlOX1BSRURJQ1RJT047CisgICAgc3RhdGljIGNvbnN0IGludCBBREpVU1RfUFJFRElDVF9ET1dOX1NISUZUID0gNzsKKyAgICBzdGF0aWMgY29uc3QgdGltZTo6bWljcm9zZWNvbmRzIE1BWF9QUkVESUNUSU9OOworICAgIHN0YXRpYyBjb25zdCBpbnQgQURKVVNUX1BSRURJQ1RfVVBfU0hJRlQgPSAzOworICB9OworCisgIC8vLyBTdHJhdGVneUluZm8gb24gcGl0OjpFbnRyeQorICBjbGFzcyBQaXRFbnRyeUluZm8gOiBwdWJsaWMgU3RyYXRlZ3lJbmZvCisgIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50CisgICAgZ2V0VHlwZUlkKCkKKyAgICB7CisgICAgICByZXR1cm4gMTAwMTsKKyAgICB9CisKKyAgICB2aXJ0dWFsCisgICAgflBpdEVudHJ5SW5mbygpOworCisgIHB1YmxpYzoKKyAgICAvLy8gdGltZXIgdGhhdCBleHBpcmVzIHdoZW4gYmVzdCBmYWNlIGRvZXMgbm90IHJlc3BvbmQgd2l0aGluIHByZWRpY3RlZCB0aW1lCisgICAgRXZlbnRJZCBiZXN0RmFjZVRpbWVvdXQ7CisgICAgLy8vIHRpbWVyIGZvciBwcm9wYWdhdGluZyB0byBhbm90aGVyIGZhY2UKKyAgICBFdmVudElkIHByb3BhZ2F0ZVRpbWVyOworICAgIC8vLyBtYXhpbXVtIGludGVydmFsIGJldHdlZW4gZm9yd2FyZGluZyB0byB0d28gbmV4dGhvcHMgZXhjZXB0IGJlc3QgYW5kIHByZXZpb3VzCisgICAgdGltZTo6bWljcm9zZWNvbmRzIG1heEludGVydmFsOworICB9OworCitwcm90ZWN0ZWQ6CisgIHNoYXJlZF9wdHI8TWVhc3VyZW1lbnRzRW50cnlJbmZvPgorICBnZXRNZWFzdXJlbWVudHNFbnRyeUluZm8oc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiBlbnRyeSk7CisKKyAgc2hhcmVkX3B0cjxNZWFzdXJlbWVudHNFbnRyeUluZm8+CisgIGdldE1lYXN1cmVtZW50c0VudHJ5SW5mbyhzaGFyZWRfcHRyPHBpdDo6RW50cnk+IGVudHJ5KTsKKworICAvLy8gcHJvcGFnYXRlIHRvIGFub3RoZXIgdXBzdHJlYW0KKyAgdm9pZAorICBkb1Byb3BhZ2F0ZSh3ZWFrX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeVdlYWssIHdlYWtfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5V2Vhayk7CisKKyAgLy8vIGJlc3QgZmFjZSBkaWQgbm90IHJlcGx5IHdpdGhpbiBwcmVkaWN0aW9uCisgIHZvaWQKKyAgdGltZW91dE9uQmVzdEZhY2Uod2Vha19wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnlXZWFrKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgTmFtZSBTVFJBVEVHWV9OQU1FOworCitwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCB0aW1lOjptaWNyb3NlY29uZHMgREVGRVJfRklSU1RfV0lUSE9VVF9CRVNUX0ZBQ0U7CisgIHN0YXRpYyBjb25zdCB0aW1lOjptaWNyb3NlY29uZHMgREVGRVJfUkFOR0VfV0lUSE9VVF9CRVNUX0ZBQ0U7CisgIHN0YXRpYyBjb25zdCBpbnQgVVBEQVRFX01FQVNVUkVNRU5UU19OX0xFVkVMUyA9IDI7CisgIHN0YXRpYyBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBNRUFTVVJFTUVOVFNfTElGRVRJTUU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBmdworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZXX05DQ19TVFJBVEVHWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvcnR0LWVzdGltYXRvci5jcHAgYi9ORkQvZGFlbW9uL2Z3L3J0dC1lc3RpbWF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjJhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L3J0dC1lc3RpbWF0b3IuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJydHQtZXN0aW1hdG9yLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK1J0dEVzdGltYXRvcjo6UnR0RXN0aW1hdG9yKHVpbnQxNl90IG1heE11bHRpcGxpZXIsIER1cmF0aW9uIG1pblJ0bywgZG91YmxlIGdhaW4pCisgIDogbV9tYXhNdWx0aXBsaWVyKG1heE11bHRpcGxpZXIpCisgICwgbV9taW5SdG8obWluUnRvLmNvdW50KCkpCisgICwgbV9ydHQoUnR0RXN0aW1hdG9yOjpnZXRJbml0aWFsUnR0KCkuY291bnQoKSkKKyAgLCBtX2dhaW4oZ2FpbikKKyAgLCBtX3ZhcmlhbmNlKDApCisgICwgbV9tdWx0aXBsaWVyKDEpCisgICwgbV9uU2FtcGxlcygwKQoreworfQorCit2b2lkCitSdHRFc3RpbWF0b3I6OmFkZE1lYXN1cmVtZW50KER1cmF0aW9uIG1lYXN1cmUpCit7CisgIGRvdWJsZSBtID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtZWFzdXJlLmNvdW50KCkpOworICBpZiAobV9uU2FtcGxlcyA+IDApIHsKKyAgICBkb3VibGUgZXJyID0gbSAtIG1fcnR0OworICAgIGRvdWJsZSBnRXJyID0gZXJyICogbV9nYWluOworICAgIG1fcnR0ICs9IGdFcnI7CisgICAgZG91YmxlIGRpZmZlcmVuY2UgPSBzdGQ6OmFicyhlcnIpIC0gbV92YXJpYW5jZTsKKyAgICBtX3ZhcmlhbmNlICs9IGRpZmZlcmVuY2UgKiBtX2dhaW47CisgIH0gZWxzZSB7CisgICAgbV9ydHQgPSBtOworICAgIG1fdmFyaWFuY2UgPSBtOworICB9CisgICsrbV9uU2FtcGxlczsKKyAgbV9tdWx0aXBsaWVyID0gMTsKK30KKwordm9pZAorUnR0RXN0aW1hdG9yOjppbmNyZW1lbnRNdWx0aXBsaWVyKCkKK3sKKyAgbV9tdWx0aXBsaWVyID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG1fbXVsdGlwbGllciArIDEpLCBtX21heE11bHRpcGxpZXIpOworfQorCit2b2lkCitSdHRFc3RpbWF0b3I6OmRvdWJsZU11bHRpcGxpZXIoKQoreworICBtX211bHRpcGxpZXIgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50MTZfdD4obV9tdWx0aXBsaWVyICogMiksIG1fbWF4TXVsdGlwbGllcik7Cit9CisKK1J0dEVzdGltYXRvcjo6RHVyYXRpb24KK1J0dEVzdGltYXRvcjo6Y29tcHV0ZVJ0bygpIGNvbnN0Cit7CisgIGRvdWJsZSBydG8gPSBzdGQ6Om1heChtX21pblJ0bywgbV9ydHQgKyA0ICogbV92YXJpYW5jZSk7CisgIHJ0byAqPSBtX211bHRpcGxpZXI7CisgIHJldHVybiBEdXJhdGlvbihzdGF0aWNfY2FzdDxEdXJhdGlvbjo6cmVwPihydG8pKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L3J0dC1lc3RpbWF0b3IuaHBwIGIvTkZEL2RhZW1vbi9mdy9ydHQtZXN0aW1hdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODMwYzVhCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9mdy9ydHQtZXN0aW1hdG9yLmhwcApAQCAtMCwwICsxLDgzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9EQUVNT05fRldfUlRUX0VTVElNQVRPUl9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9GV19SVFRfRVNUSU1BVE9SX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKKy8qKgorICogXGJyaWVmIGltcGxlbWVudHMgdGhlIE1lYW4tRGV2aWF0aW9uIFJUVCBlc3RpbWF0b3IKKyAqCisgKiByZWZlcmVuY2U6IG5zMzo6UnR0TWVhbkRldmlhdGlvbgorICoKKyAqIFRoaXMgUnR0RXN0aW1hdG9yIGFsZ29yaXRobSBpcyBkZXNpZ25lZCBmb3IgVENQLCB3aGljaCBpcyBhIGNvbnRpbnVvdXMgc3RyZWFtLgorICogTkROIEludGVyZXN0LURhdGEgdHJhZmZpYyBpcyBub3QgYWx3YXlzIGEgY29udGludW91cyBzdHJlYW0sCisgKiBzbyBORE4gbWF5IG5lZWQgYSBkaWZmZXJlbnQgUnR0RXN0aW1hdG9yLgorICogVGhlIGRlc2lnbiBvZiBhIG1vcmUgc3VpdGFibGUgUnR0RXN0aW1hdG9yIGlzIGEgcmVzZWFyY2ggcXVlc3Rpb24uCisgKi8KK2NsYXNzIFJ0dEVzdGltYXRvcgoreworcHVibGljOgorICB0eXBlZGVmIHRpbWU6Om1pY3Jvc2Vjb25kcyBEdXJhdGlvbjsKKworICBzdGF0aWMgRHVyYXRpb24KKyAgZ2V0SW5pdGlhbFJ0dCh2b2lkKQorICB7CisgICAgcmV0dXJuIHRpbWU6OnNlY29uZHMoMSk7CisgIH0KKworICBSdHRFc3RpbWF0b3IodWludDE2X3QgbWF4TXVsdGlwbGllciA9IDE2LAorICAgICAgICAgICAgICAgRHVyYXRpb24gbWluUnRvID0gdGltZTo6bWlsbGlzZWNvbmRzKDEpLAorICAgICAgICAgICAgICAgZG91YmxlIGdhaW4gPSAwLjEpOworCisgIHZvaWQKKyAgYWRkTWVhc3VyZW1lbnQoRHVyYXRpb24gbWVhc3VyZSk7CisKKyAgdm9pZAorICBpbmNyZW1lbnRNdWx0aXBsaWVyKCk7CisKKyAgdm9pZAorICBkb3VibGVNdWx0aXBsaWVyKCk7CisKKyAgRHVyYXRpb24KKyAgY29tcHV0ZVJ0bygpIGNvbnN0OworCitwcml2YXRlOgorICB1aW50MTZfdCBtX21heE11bHRpcGxpZXI7CisgIGRvdWJsZSBtX21pblJ0bzsKKworICBkb3VibGUgbV9ydHQ7CisgIGRvdWJsZSBtX2dhaW47CisgIGRvdWJsZSBtX3ZhcmlhbmNlOworICB1aW50MTZfdCBtX211bHRpcGxpZXI7CisgIHVpbnQzMl90IG1fblNhbXBsZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fRldfUlRUX0VTVElNQVRPUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vZncvc3RyYXRlZ3ktaW5mby5ocHAgYi9ORkQvZGFlbW9uL2Z3L3N0cmF0ZWd5LWluZm8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDFmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L3N0cmF0ZWd5LWluZm8uaHBwCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9GV19TVFJBVEVHWV9JTkZPX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZXX1NUUkFURUdZX0lORk9fSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmdyB7CisKKy8qKiBcYnJpZWYgY29udGFpbnMgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIGZvcndhcmRpbmcgc3RyYXRlZ3kgcGxhY2VzIG9uIHRhYmxlIGVudHJpZXMKKyAqLworY2xhc3MgU3RyYXRlZ3lJbmZvCit7CitwdWJsaWM6CisgIC8qKiBcZm4gc3RhdGljIGNvbnN0ZXhwciBpbnQgZ2V0VHlwZUlkKCkKKyAgICogIFxyZXR1cm4gYW4gaW50ZWdlciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBTdHJhdGVneUluZm8gdHlwZQorICAgKiAgXHNhIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1N0cmF0ZWd5SW5mb1R5cGUKKyAgICovCisgIC8vIHN0YXRpYyBjb25zdGV4cHIgaW50CisgIC8vIGdldFR5cGVJZCgpCisgIC8vIHsKKyAgLy8gICByZXR1cm4gPHR5cGUtaWRlbnRpZmllcj47CisgIC8vIH0KKworICB2aXJ0dWFsCisgIH5TdHJhdGVneUluZm8oKTsKK307CisKKworaW5saW5lCitTdHJhdGVneUluZm86On5TdHJhdGVneUluZm8oKQoreworfQorCit9IC8vIG5hbWVzcGFjZSBmdworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX0ZXX1NUUkFURUdZX0lORk9fSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L3N0cmF0ZWd5LmNwcCBiL05GRC9kYWVtb24vZncvc3RyYXRlZ3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTE2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L3N0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDgyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAic3RyYXRlZ3kuaHBwIgorI2luY2x1ZGUgImZvcndhcmRlci5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmdyB7CisKK05GRF9MT0dfSU5JVCgiU3RyYXRlZ3kiKTsKKworU3RyYXRlZ3k6OlN0cmF0ZWd5KEZvcndhcmRlciYgZm9yd2FyZGVyLCBjb25zdCBOYW1lJiBuYW1lKQorICA6IGFmdGVyQWRkRmFjZShmb3J3YXJkZXIuZ2V0RmFjZVRhYmxlKCkub25BZGQpCisgICwgYmVmb3JlUmVtb3ZlRmFjZShmb3J3YXJkZXIuZ2V0RmFjZVRhYmxlKCkub25SZW1vdmUpCisgICwgbV9uYW1lKG5hbWUpCisgICwgbV9mb3J3YXJkZXIoZm9yd2FyZGVyKQorICAsIG1fbWVhc3VyZW1lbnRzKG1fZm9yd2FyZGVyLmdldE1lYXN1cmVtZW50cygpLAorICAgICAgICAgICAgICAgICAgIG1fZm9yd2FyZGVyLmdldFN0cmF0ZWd5Q2hvaWNlKCksIHRoaXMpCit7Cit9CisKK1N0cmF0ZWd5Ojp+U3RyYXRlZ3koKQoreworfQorCit2b2lkCitTdHJhdGVneTo6YmVmb3JlU2F0aXNmeUludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2UmIGluRmFjZSwgY29uc3QgRGF0YSYgZGF0YSkKK3sKKyAgTkZEX0xPR19ERUJVRygiYmVmb3JlU2F0aXNmeUludGVyZXN0IHBpdEVudHJ5PSIgPDwgcGl0RW50cnktPmdldE5hbWUoKSA8PAorICAgICIgaW5GYWNlPSIgPDwgaW5GYWNlLmdldElkKCkgPDwgIiBkYXRhPSIgPDwgZGF0YS5nZXROYW1lKCkpOworfQorCit2b2lkCitTdHJhdGVneTo6YmVmb3JlRXhwaXJlUGVuZGluZ0ludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpCit7CisgIE5GRF9MT0dfREVCVUcoImJlZm9yZUV4cGlyZVBlbmRpbmdJbnRlcmVzdCBwaXRFbnRyeT0iIDw8IHBpdEVudHJ5LT5nZXROYW1lKCkpOworfQorCisvL3ZvaWQKKy8vU3RyYXRlZ3k6OmFmdGVyQWRkRmliRW50cnkoc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSkKKy8veworLy8gIE5GRF9MT0dfREVCVUcoImFmdGVyQWRkRmliRW50cnkgZmliRW50cnk9IiA8PCBmaWJFbnRyeS0+Z2V0UHJlZml4KCkpOworLy99CisvLworLy92b2lkCisvL1N0cmF0ZWd5OjphZnRlclVwZGF0ZUZpYkVudHJ5KHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnkpCisvL3sKKy8vICBORkRfTE9HX0RFQlVHKCJhZnRlclVwZGF0ZUZpYkVudHJ5IGZpYkVudHJ5PSIgPDwgZmliRW50cnktPmdldFByZWZpeCgpKTsKKy8vfQorLy8KKy8vdm9pZAorLy9TdHJhdGVneTo6YmVmb3JlUmVtb3ZlRmliRW50cnkoc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSkKKy8veworLy8gIE5GRF9MT0dfREVCVUcoImJlZm9yZVJlbW92ZUZpYkVudHJ5IGZpYkVudHJ5PSIgPDwgZmliRW50cnktPmdldFByZWZpeCgpKTsKKy8vfQorCit9IC8vIG5hbWVzcGFjZSBmdworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL2Z3L3N0cmF0ZWd5LmhwcCBiL05GRC9kYWVtb24vZncvc3RyYXRlZ3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2NjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL2Z3L3N0cmF0ZWd5LmhwcApAQCAtMCwwICsxLDE5NCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX0ZXX1NUUkFURUdZX0hQUAorI2RlZmluZSBORkRfREFFTU9OX0ZXX1NUUkFURUdZX0hQUAorCisjaW5jbHVkZSAiZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9tZWFzdXJlbWVudHMtYWNjZXNzb3IuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmdyB7CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyBhIGZvcndhcmRpbmcgc3RyYXRlZ3kKKyAqLworY2xhc3MgU3RyYXRlZ3kgOiBwdWJsaWMgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U3RyYXRlZ3k+LCBub25jb3B5YWJsZQoreworcHVibGljOgorICAvKiogXGJyaWVmIGNvbnN0cnVjdCBhIHN0cmF0ZWd5IGluc3RhbmNlCisgICAqICBccGFyYW0gZm9yd2FyZGVyIGEgcmVmZXJlbmNlIHRvIHRoZSBGb3J3YXJkZXIsIHVzZWQgdG8gZW5hYmxlIGFjdGlvbnMgYW5kIGFjY2Vzc29ycy4KKyAgICogICAgICAgICBTdHJhdGVneSBzdWJjbGFzc2VzIHNob3VsZCBwYXNzIHRoaXMgcmVmZXJlbmNlLAorICAgKiAgICAgICAgIGFuZCBzaG91bGQgbm90IGtlZXAgYSByZWZlcmVuY2UgdGhlbXNlbHZlcy4KKyAgICogIFxwYXJhbSBuYW1lIHRoZSBzdHJhdGVneSBOYW1lLgorICAgKiAgICAgICAgIEl0J3MgcmVjb21tZW5kZWQgdG8gaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIGFzIHRoZSBsYXN0IGNvbXBvbmVudC4KKyAgICovCisgIFN0cmF0ZWd5KEZvcndhcmRlciYgZm9yd2FyZGVyLCBjb25zdCBOYW1lJiBuYW1lKTsKKworICB2aXJ0dWFsCisgIH5TdHJhdGVneSgpOworCisgIC8vLyBhIE5hbWUgdGhhdCByZXByZXNlbnQgdGhlIFN0cmF0ZWd5IHByb2dyYW0KKyAgY29uc3QgTmFtZSYKKyAgZ2V0TmFtZSgpIGNvbnN0OworCitwdWJsaWM6IC8vIHRyaWdnZXJzCisgIC8qKiBcYnJpZWYgdHJpZ2dlciBhZnRlciBJbnRlcmVzdCBpcyByZWNlaXZlZAorICAgKgorICAgKiAgVGhlIEludGVyZXN0OgorICAgKiAgLSBkb2VzIG5vdCB2aW9sYXRlIFNjb3BlCisgICAqICAtIGlzIG5vdCBsb29wZWQKKyAgICogIC0gY2Fubm90IGJlIHNhdGlzZmllZCBieSBDb250ZW50U3RvcmUKKyAgICogIC0gaXMgdW5kZXIgYSBuYW1lc3BhY2UgbWFuYWdlZCBieSB0aGlzIHN0cmF0ZWd5CisgICAqCisgICAqICBUaGUgc3RyYXRlZ3kgc2hvdWxkIGRlY2lkZSB3aGV0aGVyIGFuZCB3aGVyZSB0byBmb3J3YXJkIHRoaXMgSW50ZXJlc3QuCisgICAqICAtIElmIHRoZSBzdHJhdGVneSBkZWNpZGVzIHRvIGZvcndhcmQgdGhpcyBJbnRlcmVzdCwKKyAgICogICAgaW52b2tlIHRoaXMtPnNlbmRJbnRlcmVzdCBvbmUgb3IgbW9yZSB0aW1lcywgZWl0aGVyIG5vdyBvciBzaG9ydGx5IGFmdGVyCisgICAqICAtIElmIHN0cmF0ZWd5IGNvbmNsdWRlcyB0aGF0IHRoaXMgSW50ZXJlc3QgY2Fubm90IGJlIGZvcndhcmRlZCwKKyAgICogICAgaW52b2tlIHRoaXMtPnJlamVjdFBlbmRpbmdJbnRlcmVzdCBzbyB0aGF0IFBJVCBlbnRyeSB3aWxsIGJlIGRlbGV0ZWQgc2hvcnRseQorICAgKgorICAgKiAgXG5vdGUgVGhlIHN0cmF0ZWd5IGlzIHBlcm1pdHRlZCB0byBzdG9yZSBhIHdlYWsgcmVmZXJlbmNlIHRvIGZpYkVudHJ5LgorICAgKiAgICAgICAgRG8gbm90IHN0b3JlIGEgc2hhcmVkIHJlZmVyZW5jZSwgYmVjYXVzZSBQSVQgZW50cnkgbWF5IGJlIGRlbGV0ZWQgYXQgYW55IG1vbWVudC4KKyAgICogICAgICAgIGZpYkVudHJ5IGlzIHBhc3NlZCBieSB2YWx1ZSB0byBhbGxvdyBvYnRhaW5pbmcgYSB3ZWFrIHJlZmVyZW5jZSBmcm9tIGl0LgorICAgKiAgXG5vdGUgVGhlIHN0cmF0ZWd5IGlzIHBlcm1pdHRlZCB0byBzdG9yZSBhIHNoYXJlZCByZWZlcmVuY2UgdG8gcGl0RW50cnkuCisgICAqICAgICAgICBwaXRFbnRyeSBpcyBwYXNzZWQgYnkgdmFsdWUgdG8gcmVmbGVjdCB0aGlzIGZhY3QuCisgICAqLworICB2aXJ0dWFsIHZvaWQKKyAgYWZ0ZXJSZWNlaXZlSW50ZXJlc3QoY29uc3QgRmFjZSYgaW5GYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpID0gMDsKKworICAvKiogXGJyaWVmIHRyaWdnZXIgYmVmb3JlIFBJVCBlbnRyeSBpcyBzYXRpc2ZpZWQKKyAgICoKKyAgICogIFRoaXMgdHJpZ2dlciBpcyBpbnZva2VkIHdoZW4gYW4gaW5jb21pbmcgRGF0YSBzYXRpc2ZpZXMgdGhlIFBJVCBlbnRyeS4KKyAgICogIEl0IGNhbiBiZSBpbnZva2VkIGV2ZW4gaWYgdGhlIFBJVCBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHNhdGlzZmllZC4KKyAgICoKKyAgICogIEluIHRoaXMgYmFzZSBjbGFzcyB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisgICAqCisgICAqICBcbm90ZSBUaGUgc3RyYXRlZ3kgaXMgcGVybWl0dGVkIHRvIHN0b3JlIGEgc2hhcmVkIHJlZmVyZW5jZSB0byBwaXRFbnRyeS4KKyAgICogICAgICAgIHBpdEVudHJ5IGlzIHBhc3NlZCBieSB2YWx1ZSB0byByZWZsZWN0IHRoaXMgZmFjdC4KKyAgICovCisgIHZpcnR1YWwgdm9pZAorICBiZWZvcmVTYXRpc2Z5SW50ZXJlc3Qoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2UmIGluRmFjZSwgY29uc3QgRGF0YSYgZGF0YSk7CisKKyAgLyoqIFxicmllZiB0cmlnZ2VyIGJlZm9yZSBQSVQgZW50cnkgZXhwaXJlcworICAgKgorICAgKiAgUElUIGVudHJ5IGV4cGlyZXMgd2hlbiBJbnRlcmVzdExpZmV0aW1lIGhhcyBlbGFwc2VkIGZvciBhbGwgSW5SZWNvcmRzLAorICAgKiAgYW5kIGl0IGlzIG5vdCBzYXRpc2ZpZWQgYnkgYW4gaW5jb21pbmcgRGF0YS4KKyAgICoKKyAgICogIFRoaXMgdHJpZ2dlciBpcyBub3QgaW52b2tlZCBmb3IgUElUIGVudHJ5IGFscmVhZHkgc2F0aXNmaWVkLgorICAgKgorICAgKiAgSW4gdGhpcyBiYXNlIGNsYXNzIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICoKKyAgICogIFxub3RlIFRoZSBzdHJhdGVneSBpcyBwZXJtaXR0ZWQgdG8gc3RvcmUgYSBzaGFyZWQgcmVmZXJlbmNlIHRvIHBpdEVudHJ5LgorICAgKiAgICAgICAgcGl0RW50cnkgaXMgcGFzc2VkIGJ5IHZhbHVlIHRvIHJlZmxlY3QgdGhpcyBmYWN0LgorICAgKi8KKyAgdmlydHVhbCB2b2lkCisgIGJlZm9yZUV4cGlyZVBlbmRpbmdJbnRlcmVzdChzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KTsKKworcHJvdGVjdGVkOiAvLyBhY3Rpb25zCisgIC8vLyBzZW5kIEludGVyZXN0IHRvIG91dEZhY2UKKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgc2VuZEludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksCisgICAgICAgICAgICAgICBzaGFyZWRfcHRyPEZhY2U+IG91dEZhY2UsCisgICAgICAgICAgICAgICBib29sIHdhbnROZXdOb25jZSA9IGZhbHNlKTsKKworICAvKiogXGJyaWVmIGRlY2lkZSB0aGF0IGEgcGVuZGluZyBJbnRlcmVzdCBjYW5ub3QgYmUgZm9yd2FyZGVkCisgICAqCisgICAqICBUaGlzIHNoYWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIHBlbmRpbmcgSW50ZXJlc3QgaGFzIGJlZW4KKyAgICogIGZvcndhcmRlZCBlYXJsaWVyLCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSByZXNlbnQgbm93LgorICAgKi8KKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgcmVqZWN0UGVuZGluZ0ludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpOworCitwcm90ZWN0ZWQ6IC8vIGFjY2Vzc29ycworICBNZWFzdXJlbWVudHNBY2Nlc3NvciYKKyAgZ2V0TWVhc3VyZW1lbnRzKCk7CisKKyAgc2hhcmVkX3B0cjxGYWNlPgorICBnZXRGYWNlKEZhY2VJZCBpZCk7CisKKyAgY29uc3QgRmFjZVRhYmxlJgorICBnZXRGYWNlVGFibGUoKTsKKworcHJvdGVjdGVkOiAvLyBhY2Nlc3NvcnMKKyAgc2lnbmFsOjpTaWduYWw8RmFjZVRhYmxlLCBzaGFyZWRfcHRyPEZhY2U+PiYgYWZ0ZXJBZGRGYWNlOworICBzaWduYWw6OlNpZ25hbDxGYWNlVGFibGUsIHNoYXJlZF9wdHI8RmFjZT4+JiBiZWZvcmVSZW1vdmVGYWNlOworCitwcml2YXRlOgorICBOYW1lIG1fbmFtZTsKKworICAvKiogXGJyaWVmIHJlZmVyZW5jZSB0byB0aGUgZm9yd2FyZGVyCisgICAqCisgICAqICBUcmlnZ2VycyBjYW4gYWNjZXNzIGZvcndhcmRlciBpbmRpcmVjdGx5IHZpYSBhY3Rpb25zLgorICAgKi8KKyAgRm9yd2FyZGVyJiBtX2ZvcndhcmRlcjsKKworICBNZWFzdXJlbWVudHNBY2Nlc3NvciBtX21lYXN1cmVtZW50czsKK307CisKK2lubGluZSBjb25zdCBOYW1lJgorU3RyYXRlZ3k6OmdldE5hbWUoKSBjb25zdAoreworICByZXR1cm4gbV9uYW1lOworfQorCitpbmxpbmUgdm9pZAorU3RyYXRlZ3k6OnNlbmRJbnRlcmVzdChzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPEZhY2U+IG91dEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FudE5ld05vbmNlKQoreworICBtX2ZvcndhcmRlci5vbk91dGdvaW5nSW50ZXJlc3QocGl0RW50cnksICpvdXRGYWNlLCB3YW50TmV3Tm9uY2UpOworfQorCitpbmxpbmUgdm9pZAorU3RyYXRlZ3k6OnJlamVjdFBlbmRpbmdJbnRlcmVzdChzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KQoreworICBtX2ZvcndhcmRlci5vbkludGVyZXN0UmVqZWN0KHBpdEVudHJ5KTsKK30KKworaW5saW5lIE1lYXN1cmVtZW50c0FjY2Vzc29yJgorU3RyYXRlZ3k6OmdldE1lYXN1cmVtZW50cygpCit7CisgIHJldHVybiBtX21lYXN1cmVtZW50czsKK30KKworaW5saW5lIHNoYXJlZF9wdHI8RmFjZT4KK1N0cmF0ZWd5OjpnZXRGYWNlKEZhY2VJZCBpZCkKK3sKKyAgcmV0dXJuIG1fZm9yd2FyZGVyLmdldEZhY2UoaWQpOworfQorCitpbmxpbmUgY29uc3QgRmFjZVRhYmxlJgorU3RyYXRlZ3k6OmdldEZhY2VUYWJsZSgpCit7CisgIHJldHVybiBtX2ZvcndhcmRlci5nZXRGYWNlVGFibGUoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZncKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9GV19TVFJBVEVHWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWFpbi5jcHAgYi9ORkQvZGFlbW9uL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzU2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21haW4uY3BwCkBAIC0wLDAgKzEsNDA4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisKKyNpbmNsdWRlICJ2ZXJzaW9uLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisjaW5jbHVkZSAiY29yZS9nbG9iYWwtaW8uaHBwIgorI2luY2x1ZGUgImNvcmUvcHJpdmlsZWdlLWhlbHBlci5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJmYWNlL251bGwtZmFjZS5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJtZ210L2ZpYi1tYW5hZ2VyLmhwcCIKKyNpbmNsdWRlICJtZ210L2ZhY2UtbWFuYWdlci5ocHAiCisjaW5jbHVkZSAibWdtdC9zdHJhdGVneS1jaG9pY2UtbWFuYWdlci5ocHAiCisjaW5jbHVkZSAibWdtdC9zdGF0dXMtc2VydmVyLmhwcCIKKyNpbmNsdWRlICJjb3JlL2NvbmZpZy1maWxlLmhwcCIKKyNpbmNsdWRlICJtZ210L2dlbmVyYWwtY29uZmlnLXNlY3Rpb24uaHBwIgorI2luY2x1ZGUgIm1nbXQvdGFibGVzLWNvbmZpZy1zZWN0aW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiTkZEIik7CisKK3N0cnVjdCBQcm9ncmFtT3B0aW9ucworeworICBib29sIHNob3dVc2FnZTsKKyAgYm9vbCBzaG93VmVyc2lvbjsKKyAgYm9vbCBzaG93TW9kdWxlczsKKyAgc3RkOjpzdHJpbmcgY29uZmlnOworfTsKKworY2xhc3MgTmZkIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgTmZkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb25maWdGaWxlKQorICAgIDogbV9jb25maWdGaWxlKGNvbmZpZ0ZpbGUpCisgICAgLCBtX29yaWdpbmFsU3RyZWFtQnVmKDApCisgIHsKKyAgfQorCisgIH5OZmQoKQorICB7CisgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KG1fb3JpZ2luYWxTdHJlYW1CdWYpKSB7CisgICAgICBzdGQ6OmNsb2cucmRidWYobV9vcmlnaW5hbFN0cmVhbUJ1Zik7CisgICAgfQorICB9CisKKyAgdm9pZAorICBpbml0aWFsaXplKCkKKyAgeworICAgIGluaXRpYWxpemVMb2dnaW5nKCk7CisKKyAgICBtX2ZvcndhcmRlciA9IG1ha2Vfc2hhcmVkPEZvcndhcmRlcj4oKTsKKworICAgIGluaXRpYWxpemVNYW5hZ2VtZW50KCk7CisKKyAgICBtX2ZvcndhcmRlci0+Z2V0RmFjZVRhYmxlKCkuYWRkUmVzZXJ2ZWQobWFrZV9zaGFyZWQ8TnVsbEZhY2U+KCksIEZBQ0VJRF9OVUxMKTsKKyAgICBtX2ZvcndhcmRlci0+Z2V0RmFjZVRhYmxlKCkuYWRkUmVzZXJ2ZWQoCisgICAgICBtYWtlX3NoYXJlZDxOdWxsRmFjZT4oRmFjZVVyaSgiY29udGVudHN0b3JlOi8vIikpLCBGQUNFSURfQ09OVEVOVF9TVE9SRSk7CisKKyAgICBQcml2aWxlZ2VIZWxwZXI6OmRyb3AoKTsKKyAgfQorCisKKyAgdm9pZAorICBpbml0aWFsaXplTG9nZ2luZygpCisgIHsKKyAgICBDb25maWdGaWxlIGNvbmZpZygmQ29uZmlnRmlsZTo6aWdub3JlVW5rbm93blNlY3Rpb24pOworICAgIExvZ2dlckZhY3Rvcnk6OmdldEluc3RhbmNlKCkuc2V0Q29uZmlnRmlsZShjb25maWcpOworCisgICAgY29uZmlnLnBhcnNlKG1fY29uZmlnRmlsZSwgdHJ1ZSk7CisgICAgY29uZmlnLnBhcnNlKG1fY29uZmlnRmlsZSwgZmFsc2UpOworICB9CisKKyAgY2xhc3MgSWdub3JlUmliQW5kTG9nU2VjdGlvbnMKKyAgeworICBwdWJsaWM6CisgICAgdm9pZAorICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnU2VjdGlvbiYgc2VjdGlvbiwKKyAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4pCisKKyAgICB7CisgICAgICAvLyBJZ25vcmUgImxvZyIgYW5kIHNlY3Rpb25zIGJlZ2lubmluZyB3aXRoICJyaWJfIiAoaW50ZW5kZWQgZm9yIHJpYiBtYW5hZ2VyKSwKKyAgICAgIC8vIGJ1dCByYWlzZSBhbiBlcnJvciBpZiB3ZSdyZSBtaXNzaW5nIGEgaGFuZGxlciBmb3IgYW4gTkZEIHNlY3Rpb24uCisKKyAgICAgIGlmIChzZWN0aW9uTmFtZS5maW5kKCJyaWIiKSA9PSAwIHx8IHNlY3Rpb25OYW1lID09ICJsb2ciKQorICAgICAgICB7CisgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBtaXNzaW5nIE5GRCBzZWN0aW9uCisgICAgICAgICAgQ29uZmlnRmlsZTo6dGhyb3dFcnJvck9uVW5rbm93blNlY3Rpb24oZmlsZW5hbWUsIHNlY3Rpb25OYW1lLCBzZWN0aW9uLCBpc0RyeVJ1bik7CisgICAgICAgIH0KKyAgICB9CisgIH07CisKKyAgdm9pZAorICBpbml0aWFsaXplTWFuYWdlbWVudCgpCisgIHsKKyAgICBtX2ludGVybmFsRmFjZSA9IG1ha2Vfc2hhcmVkPEludGVybmFsRmFjZT4oKTsKKworICAgIG1fZmliTWFuYWdlciA9IG1ha2Vfc2hhcmVkPEZpYk1hbmFnZXI+KHJlZihtX2ZvcndhcmRlci0+Z2V0RmliKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZvcndhcmRlcjo6Z2V0RmFjZSwgbV9mb3J3YXJkZXIuZ2V0KCksIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ludGVybmFsRmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnJlZihtX2tleUNoYWluKSk7CisKKyAgICBtX2ZhY2VNYW5hZ2VyID0gbWFrZV9zaGFyZWQ8RmFjZU1hbmFnZXI+KHJlZihtX2ZvcndhcmRlci0+Z2V0RmFjZVRhYmxlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbnRlcm5hbEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnJlZihtX2tleUNoYWluKSk7CisKKyAgICBtX3N0cmF0ZWd5Q2hvaWNlTWFuYWdlciA9CisgICAgICBtYWtlX3NoYXJlZDxTdHJhdGVneUNob2ljZU1hbmFnZXI+KHJlZihtX2ZvcndhcmRlci0+Z2V0U3RyYXRlZ3lDaG9pY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW50ZXJuYWxGYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnJlZihtX2tleUNoYWluKSk7CisKKyAgICBtX3N0YXR1c1NlcnZlciA9IG1ha2Vfc2hhcmVkPFN0YXR1c1NlcnZlcj4obV9pbnRlcm5hbEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZigqbV9mb3J3YXJkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnJlZihtX2tleUNoYWluKSk7CisKKyAgICBDb25maWdGaWxlIGNvbmZpZygoSWdub3JlUmliQW5kTG9nU2VjdGlvbnMoKSkpOworICAgIGdlbmVyYWw6OnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICAgIFRhYmxlc0NvbmZpZ1NlY3Rpb24gdGFibGVzQ29uZmlnKG1fZm9yd2FyZGVyLT5nZXRDcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9yd2FyZGVyLT5nZXRQaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvcndhcmRlci0+Z2V0RmliKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb3J3YXJkZXItPmdldFN0cmF0ZWd5Q2hvaWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb3J3YXJkZXItPmdldE1lYXN1cmVtZW50cygpKTsKKyAgICB0YWJsZXNDb25maWcuc2V0Q29uZmlnRmlsZShjb25maWcpOworCisgICAgbV9pbnRlcm5hbEZhY2UtPmdldFZhbGlkYXRvcigpLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICAgIG1fZm9yd2FyZGVyLT5nZXRGYWNlVGFibGUoKS5hZGRSZXNlcnZlZChtX2ludGVybmFsRmFjZSwgRkFDRUlEX0lOVEVSTkFMX0ZBQ0UpOworCisgICAgbV9mYWNlTWFuYWdlci0+c2V0Q29uZmlnRmlsZShjb25maWcpOworCisgICAgLy8gcGFyc2UgY29uZmlnIGZpbGUKKyAgICBjb25maWcucGFyc2UobV9jb25maWdGaWxlLCB0cnVlKTsKKyAgICBjb25maWcucGFyc2UobV9jb25maWdGaWxlLCBmYWxzZSk7CisKKyAgICB0YWJsZXNDb25maWcuZW5zdXJlVGFibGVzQXJlQ29uZmlndXJlZCgpOworCisgICAgLy8gYWRkIEZJQiBlbnRyeSBmb3IgTkZEIE1hbmFnZW1lbnQgUHJvdG9jb2wKKyAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gbV9mb3J3YXJkZXItPmdldEZpYigpLmluc2VydCgiL2xvY2FsaG9zdC9uZmQiKS5maXJzdDsKKyAgICBlbnRyeS0+YWRkTmV4dEhvcChtX2ludGVybmFsRmFjZSwgMCk7CisgIH0KKworICBzdGF0aWMgdm9pZAorICBwcmludFVzYWdlKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9ncmFtTmFtZSkKKyAgeworICAgIG9zIDw8ICJVc2FnZTogXG4iCisgICAgICAgPDwgIiAgIiA8PCBwcm9ncmFtTmFtZSA8PCAiIFtvcHRpb25zXVxuIgorICAgICAgIDw8ICJcbiIKKyAgICAgICA8PCAiUnVuIE5GRCBmb3J3YXJkaW5nIGRhZW1vblxuIgorICAgICAgIDw8ICJcbiIKKyAgICAgICA8PCAiT3B0aW9uczpcbiIKKyAgICAgICA8PCAiICBbLS1oZWxwXSAgICAtIHByaW50IHRoaXMgaGVscCBtZXNzYWdlXG4iCisgICAgICAgPDwgIiAgWy0tdmVyc2lvbl0gLSBwcmludCB2ZXJzaW9uIGFuZCBleGl0XG4iCisgICAgICAgPDwgIiAgWy0tbW9kdWxlc10gLSBsaXN0IGF2YWlsYWJsZSBsb2dnaW5nIG1vZHVsZXNcbiIKKyAgICAgICA8PCAiICBbLS1jb25maWcgL3BhdGgvdG8vbmZkLmNvbmZdIC0gcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgIgorICAgICAgIDw8ICIoZGVmYXVsdDogIiA8PCBERUZBVUxUX0NPTkZJR19GSUxFIDw8ICIpXG4iCisgICAgICA7CisgIH0KKworICBzdGF0aWMgdm9pZAorICBwcmludE1vZHVsZXMoc3RkOjpvc3RyZWFtJiBvcykKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyAgICBvcyA8PCAiQXZhaWxhYmxlIGxvZ2dpbmcgbW9kdWxlczogXG4iOworCisgICAgbGlzdDxzdHJpbmc+IG1vZHVsZXMoTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5nZXRNb2R1bGVzKCkpOworICAgIGZvciAobGlzdDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpID0gbW9kdWxlcy5iZWdpbigpOyBpICE9IG1vZHVsZXMuZW5kKCk7ICsraSkKKyAgICAgIHsKKyAgICAgICAgb3MgPDwgKmkgPDwgIlxuIjsKKyAgICAgIH0KKyAgfQorCisgIHN0YXRpYyBib29sCisgIHBhcnNlQ29tbWFuZExpbmUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2LCBQcm9ncmFtT3B0aW9ucyYgb3B0aW9ucykKKyAgeworICAgIG9wdGlvbnMuc2hvd1VzYWdlID0gZmFsc2U7CisgICAgb3B0aW9ucy5zaG93VmVyc2lvbiA9IGZhbHNlOworICAgIG9wdGlvbnMuc2hvd01vZHVsZXMgPSBmYWxzZTsKKyAgICBvcHRpb25zLmNvbmZpZyA9IERFRkFVTFRfQ09ORklHX0ZJTEU7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaW50IG9wdGlvbkluZGV4ID0gMDsKKyAgICAgIHN0YXRpYyA6Om9wdGlvbiBsb25nT3B0aW9uc1tdID0geworICAgICAgICB7ICJoZWxwIiAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIDAgfSwKKyAgICAgICAgeyAibW9kdWxlcyIsIG5vX2FyZ3VtZW50ICAgICAgLCAwLCAwIH0sCisgICAgICAgIHsgImNvbmZpZyIgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMCB9LAorICAgICAgICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQgICAgICAsIDAsIDAgfSwKKyAgICAgICAgeyAwICAgICAgICAsIDAgICAgICAgICAgICAgICAgLCAwLCAwIH0KKyAgICAgIH07CisgICAgICBpbnQgYyA9IGdldG9wdF9sb25nX29ubHkoYXJnYywgYXJndiwgIiIsIGxvbmdPcHRpb25zLCAmb3B0aW9uSW5kZXgpOworICAgICAgaWYgKGMgPT0gLTEpCisgICAgICAgIGJyZWFrOworCisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgc3dpdGNoIChvcHRpb25JbmRleCkgeworICAgICAgICBjYXNlIDA6IC8vIGhlbHAKKyAgICAgICAgICBvcHRpb25zLnNob3dVc2FnZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLy8gbW9kdWxlcworICAgICAgICAgIG9wdGlvbnMuc2hvd01vZHVsZXMgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8vIGNvbmZpZworICAgICAgICAgIG9wdGlvbnMuY29uZmlnID0gOjpvcHRhcmc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLy8gdmVyc2lvbgorICAgICAgICAgIG9wdGlvbnMuc2hvd1ZlcnNpb24gPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkCisgIHRlcm1pbmF0ZShjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgICAgIGludCBzaWduYWxObywKKyAgICAgICAgICAgIGJvb3N0Ojphc2lvOjpzaWduYWxfc2V0JiBzaWduYWxTZXQpCisgIHsKKyAgICBpZiAoZXJyb3IpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoc2lnbmFsTm8gPT0gU0lHSU5UIHx8CisgICAgICAgIHNpZ25hbE5vID09IFNJR1RFUk0pCisgICAgICB7CisgICAgICAgIGdldEdsb2JhbElvU2VydmljZSgpLnN0b3AoKTsKKyAgICAgICAgTkZEX0xPR19JTkZPKCJDYXVnaHQgc2lnbmFsICciIDw8IHN0cnNpZ25hbChzaWduYWxObykgPDwgIicsIGV4aXRpbmcuLi4iKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNpZ25hbFNldC5hc3luY193YWl0KGJpbmQoJk5mZDo6dGVybWluYXRlLCB0aGlzLCBfMSwgXzIsIHJlZihzaWduYWxTZXQpKSk7CisgICAgICB9CisgIH0KKworICB2b2lkCisgIHJlbG9hZChjb25zdCBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlJiBlcnJvciwKKyAgICAgICAgIGludCBzaWduYWxObywKKyAgICAgICAgIGJvb3N0Ojphc2lvOjpzaWduYWxfc2V0JiBzaWduYWxTZXQpCisgIHsKKyAgICBpZiAoZXJyb3IpCisgICAgICByZXR1cm47CisKKyAgICBORkRfTE9HX0lORk8oIkNhdWdodCBzaWduYWwgJyIgPDwgc3Ryc2lnbmFsKHNpZ25hbE5vKSk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBSZWxvYWQgY29uZmlnIGZpbGUgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vIExvZ2dpbmcKKyAgICBpbml0aWFsaXplTG9nZ2luZygpOworICAgIC8vLyBcdG9kbyBSZW9wZW4gbG9nIGZpbGUKKworICAgIC8vIE90aGVyIHN0dWZmCisgICAgQ29uZmlnRmlsZSBjb25maWcoKElnbm9yZVJpYkFuZExvZ1NlY3Rpb25zKCkpKTsKKworICAgIGdlbmVyYWw6OnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICAgIFRhYmxlc0NvbmZpZ1NlY3Rpb24gdGFibGVzQ29uZmlnKG1fZm9yd2FyZGVyLT5nZXRDcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9yd2FyZGVyLT5nZXRQaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvcndhcmRlci0+Z2V0RmliKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb3J3YXJkZXItPmdldFN0cmF0ZWd5Q2hvaWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb3J3YXJkZXItPmdldE1lYXN1cmVtZW50cygpKTsKKworICAgIHRhYmxlc0NvbmZpZy5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgICBtX2ludGVybmFsRmFjZS0+Z2V0VmFsaWRhdG9yKCkuc2V0Q29uZmlnRmlsZShjb25maWcpOworICAgIG1fZmFjZU1hbmFnZXItPnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICAgIGNvbmZpZy5wYXJzZShtX2NvbmZpZ0ZpbGUsIGZhbHNlKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgc2lnbmFsU2V0LmFzeW5jX3dhaXQoYmluZCgmTmZkOjpyZWxvYWQsIHRoaXMsIF8xLCBfMiwgcmVmKHNpZ25hbFNldCkpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBtX2NvbmZpZ0ZpbGU7CisKKyAgc2hhcmVkX3B0cjxGb3J3YXJkZXI+IG1fZm9yd2FyZGVyOworCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiAgICAgICAgICBtX2ludGVybmFsRmFjZTsKKyAgc2hhcmVkX3B0cjxGaWJNYW5hZ2VyPiAgICAgICAgICAgIG1fZmliTWFuYWdlcjsKKyAgc2hhcmVkX3B0cjxGYWNlTWFuYWdlcj4gICAgICAgICAgIG1fZmFjZU1hbmFnZXI7CisgIHNoYXJlZF9wdHI8U3RyYXRlZ3lDaG9pY2VNYW5hZ2VyPiBtX3N0cmF0ZWd5Q2hvaWNlTWFuYWdlcjsKKyAgc2hhcmVkX3B0cjxTdGF0dXNTZXJ2ZXI+ICAgICAgICAgIG1fc3RhdHVzU2VydmVyOworCisgIHNoYXJlZF9wdHI8c3RkOjpvZnN0cmVhbT4gICAgICAgICBtX2xvZ0ZpbGU7CisgIHN0ZDo6YmFzaWNfc3RyZWFtYnVmPGNoYXI+KiAgICAgICBtX29yaWdpbmFsU3RyZWFtQnVmOworICBuZG46OktleUNoYWluICAgICAgICAgICAgICAgICAgICAgbV9rZXlDaGFpbjsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICB1c2luZyBuYW1lc3BhY2UgbmZkOworCisgIFByb2dyYW1PcHRpb25zIG9wdGlvbnM7CisgIGJvb2wgaXNDb21tYW5kTGluZVZhbGlkID0gTmZkOjpwYXJzZUNvbW1hbmRMaW5lKGFyZ2MsIGFyZ3YsIG9wdGlvbnMpOworICBpZiAoIWlzQ29tbWFuZExpbmVWYWxpZCkgeworICAgIE5mZDo6cHJpbnRVc2FnZShzdGQ6OmNlcnIsIGFyZ3ZbMF0pOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKG9wdGlvbnMuc2hvd1VzYWdlKSB7CisgICAgTmZkOjpwcmludFVzYWdlKHN0ZDo6Y291dCwgYXJndlswXSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAob3B0aW9ucy5zaG93VmVyc2lvbikgeworICAgIHN0ZDo6Y291dCA8PCBORkRfVkVSU0lPTl9CVUlMRF9TVFJJTkcgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG9wdGlvbnMuc2hvd01vZHVsZXMpIHsKKyAgICBOZmQ6OnByaW50TW9kdWxlcyhzdGQ6OmNvdXQpOworICAgIHJldHVybiAwOworICB9CisKKyAgTmZkIG5mZEluc3RhbmNlKG9wdGlvbnMuY29uZmlnKTsKKworICB0cnkgeworICAgIG5mZEluc3RhbmNlLmluaXRpYWxpemUoKTsKKyAgfQorICBjYXRjaCAoYm9vc3Q6OmZpbGVzeXN0ZW06OmZpbGVzeXN0ZW1fZXJyb3ImIGUpIHsKKyAgICBpZiAoZS5jb2RlKCkgPT0gYm9vc3Q6OnN5c3RlbTo6ZXJyYzo6cGVybWlzc2lvbl9kZW5pZWQpIHsKKyAgICAgIE5GRF9MT0dfRkFUQUwoIlBlcm1pc3Npb25zIGRlbmllZCBmb3IgIiA8PCBlLnBhdGgxKCkgPDwgIi4gIiA8PAorICAgICAgICAgICAgICAgICAgICBhcmd2WzBdIDw8ICIgc2hvdWxkIGJlIHJ1biBhcyBzdXBlcnVzZXIiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBORkRfTE9HX0ZBVEFMKGUud2hhdCgpKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgTkZEX0xPR19GQVRBTChlLndoYXQoKSk7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IFByaXZpbGVnZUhlbHBlcjo6RXJyb3ImIGUpIHsKKyAgICAvLyBQcml2aWxlZ2VIZWxwZXI6OkVycm9ycyBkbyBub3QgaW5oZXJpdCBmcm9tIHN0ZDo6ZXhjZXB0aW9uCisgICAgLy8gYW5kIHJlcHJlc2VudCBzZXRldWlkL2dpZCBmYWlsdXJlcworCisgICAgTkZEX0xPR19GQVRBTChlLndoYXQoKSk7CisgICAgcmV0dXJuIDM7CisgIH0KKworICBib29zdDo6YXNpbzo6c2lnbmFsX3NldCB0ZXJtaW5hdGlvblNpZ25hbFNldChnZXRHbG9iYWxJb1NlcnZpY2UoKSk7CisgIHRlcm1pbmF0aW9uU2lnbmFsU2V0LmFkZChTSUdJTlQpOworICB0ZXJtaW5hdGlvblNpZ25hbFNldC5hZGQoU0lHVEVSTSk7CisgIHRlcm1pbmF0aW9uU2lnbmFsU2V0LmFzeW5jX3dhaXQoYmluZCgmTmZkOjp0ZXJtaW5hdGUsICZuZmRJbnN0YW5jZSwgXzEsIF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmKHRlcm1pbmF0aW9uU2lnbmFsU2V0KSkpOworCisgIGJvb3N0Ojphc2lvOjpzaWduYWxfc2V0IHJlbG9hZFNpZ25hbFNldChnZXRHbG9iYWxJb1NlcnZpY2UoKSk7CisgIHJlbG9hZFNpZ25hbFNldC5hZGQoU0lHSFVQKTsKKyAgcmVsb2FkU2lnbmFsU2V0LmFzeW5jX3dhaXQoYmluZCgmTmZkOjpyZWxvYWQsICZuZmRJbnN0YW5jZSwgXzEsIF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZihyZWxvYWRTaWduYWxTZXQpKSk7CisKKyAgdHJ5IHsKKyAgICBnZXRHbG9iYWxJb1NlcnZpY2UoKS5ydW4oKTsKKyAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICBORkRfTE9HX0ZBVEFMKGUud2hhdCgpKTsKKyAgICByZXR1cm4gNDsKKyAgfQorICBjYXRjaCAoY29uc3QgUHJpdmlsZWdlSGVscGVyOjpFcnJvciYgZSkgeworICAgIE5GRF9MT0dfRkFUQUwoZS53aGF0KCkpOworICAgIHJldHVybiA1OworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL21nbXQvYXBwLWZhY2UuaHBwIGIvTkZEL2RhZW1vbi9tZ210L2FwcC1mYWNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ0MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L2FwcC1mYWNlLmhwcApAQCAtMCwwICsxLDUzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fTUdNVF9BUFBfRkFDRV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9NR01UX0FQUF9GQUNFX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkva2V5LWNoYWluLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK3R5cGVkZWYgZnVuY3Rpb248dm9pZChjb25zdCBOYW1lJiwgY29uc3QgSW50ZXJlc3QmKT4gT25JbnRlcmVzdDsKKworY2xhc3MgQXBwRmFjZQoreworcHVibGljOgorICB2aXJ0dWFsIHZvaWQKKyAgc2V0SW50ZXJlc3RGaWx0ZXIoY29uc3QgTmFtZSYgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICBPbkludGVyZXN0IG9uSW50ZXJlc3QpID0gMDsKKworICB2aXJ0dWFsIHZvaWQKKyAgcHV0KGNvbnN0IERhdGEmIGRhdGEpID0gMDsKKworICB2aXJ0dWFsCisgIH5BcHBGYWNlKCkgeyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fTUdNVF9BUFBfRkFDRV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9jaGFubmVsLXN0YXR1cy1wdWJsaXNoZXIuY3BwIGIvTkZEL2RhZW1vbi9tZ210L2NoYW5uZWwtc3RhdHVzLXB1Ymxpc2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiZTJmYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9jaGFubmVsLXN0YXR1cy1wdWJsaXNoZXIuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJjaGFubmVsLXN0YXR1cy1wdWJsaXNoZXIuaHBwIgorCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImZhY2UvcHJvdG9jb2wtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAiZmFjZS9jaGFubmVsLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY2hhbm5lbC1zdGF0dXMuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJDaGFubmVsU3RhdHVzUHVibGlzaGVyIik7CisKKworQ2hhbm5lbFN0YXR1c1B1Ymxpc2hlcjo6Q2hhbm5lbFN0YXR1c1B1Ymxpc2hlcihjb25zdCBGYWN0b3J5TWFwJiBmYWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpLZXlDaGFpbiYga2V5Q2hhaW4pCisgIDogU2VnbWVudFB1Ymxpc2hlcihmYWNlLCBwcmVmaXgsIGtleUNoYWluKQorICAsIG1fZmFjdG9yaWVzKGZhY3RvcmllcykKK3sKKworfQorCisKK0NoYW5uZWxTdGF0dXNQdWJsaXNoZXI6On5DaGFubmVsU3RhdHVzUHVibGlzaGVyKCkKK3sKKworfQorCitzaXplX3QKK0NoYW5uZWxTdGF0dXNQdWJsaXNoZXI6OmdlbmVyYXRlKG5kbjo6RW5jb2RpbmdCdWZmZXImIG91dEJ1ZmZlcikKK3sKKyAgc2l6ZV90IHRvdGFsTGVuZ3RoID0gMDsKKyAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxQcm90b2NvbEZhY3Rvcnk+ID4gc2VlbkZhY3RvcmllczsKKworICBmb3IgKEZhY3RvcnlNYXA6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2ZhY3Rvcmllcy5iZWdpbigpOworICAgICAgIGkgIT0gbV9mYWN0b3JpZXMuZW5kKCk7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzaGFyZWRfcHRyPFByb3RvY29sRmFjdG9yeT4mIGZhY3RvcnkgPSBpLT5zZWNvbmQ7CisKKyAgICAgIGlmIChzZWVuRmFjdG9yaWVzLmZpbmQoZmFjdG9yeSkgIT0gc2VlbkZhY3Rvcmllcy5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBzZWVuRmFjdG9yaWVzLmluc2VydChmYWN0b3J5KTsKKworICAgICAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPiBjaGFubmVscyA9IGZhY3RvcnktPmdldENoYW5uZWxzKCk7CisKKyAgICAgIGZvciAoc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPjo6Y29uc3RfaXRlcmF0b3IgaiA9IGNoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgICAgIGogIT0gY2hhbm5lbHMuZW5kKCk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIG5kbjo6bmZkOjpDaGFubmVsU3RhdHVzIGVudHJ5OworICAgICAgICAgIGVudHJ5LnNldExvY2FsVXJpKCgqaiktPmdldFVyaSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgdG90YWxMZW5ndGggKz0gZW50cnkud2lyZUVuY29kZShvdXRCdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiB0b3RhbExlbmd0aDsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL21nbXQvY2hhbm5lbC1zdGF0dXMtcHVibGlzaGVyLmhwcCBiL05GRC9kYWVtb24vbWdtdC9jaGFubmVsLXN0YXR1cy1wdWJsaXNoZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjYwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvY2hhbm5lbC1zdGF0dXMtcHVibGlzaGVyLmhwcApAQCAtMCwwICsxLDYwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fTUdNVF9DSEFOTkVMX1NUQVRVU19QVUJMSVNIRVJfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fTUdNVF9DSEFOTkVMX1NUQVRVU19QVUJMSVNIRVJfSFBQCisKKyNpbmNsdWRlICJjb3JlL3NlZ21lbnQtcHVibGlzaGVyLmhwcCIKKyNpbmNsdWRlICJtZ210L2FwcC1mYWNlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK2NsYXNzIFByb3RvY29sRmFjdG9yeTsKKworY2xhc3MgQ2hhbm5lbFN0YXR1c1B1Ymxpc2hlciA6IHB1YmxpYyBTZWdtZW50UHVibGlzaGVyPEFwcEZhY2U+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjptYXA8IHN0ZDo6c3RyaW5nLypwcm90b2NvbCovLCBzaGFyZWRfcHRyPFByb3RvY29sRmFjdG9yeT4gPiBGYWN0b3J5TWFwOworCisgIENoYW5uZWxTdGF0dXNQdWJsaXNoZXIoY29uc3QgRmFjdG9yeU1hcCYgZmFjdG9yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZSYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKTsKKworICB2aXJ0dWFsCisgIH5DaGFubmVsU3RhdHVzUHVibGlzaGVyKCk7CisKK3Byb3RlY3RlZDoKKworICB2aXJ0dWFsIHNpemVfdAorICBnZW5lcmF0ZShuZG46OkVuY29kaW5nQnVmZmVyJiBvdXRCdWZmZXIpOworCitwcml2YXRlOgorICBjb25zdCBGYWN0b3J5TWFwJiBtX2ZhY3RvcmllczsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9NR01UX0NIQU5ORUxfU1RBVFVTX1BVQkxJU0hFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9jb21tYW5kLXZhbGlkYXRvci5jcHAgYi9ORkQvZGFlbW9uL21nbXQvY29tbWFuZC12YWxpZGF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NmNmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvY29tbWFuZC12YWxpZGF0b3IuY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAiY29tbWFuZC12YWxpZGF0b3IuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9pby5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9pZGVudGl0eS1jZXJ0aWZpY2F0ZS5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJDb21tYW5kVmFsaWRhdG9yIik7CisKK0NvbW1hbmRWYWxpZGF0b3I6OkNvbW1hbmRWYWxpZGF0b3IoKQoreworCit9CisKK0NvbW1hbmRWYWxpZGF0b3I6On5Db21tYW5kVmFsaWRhdG9yKCkKK3sKKworfQorCit2b2lkCitDb21tYW5kVmFsaWRhdG9yOjpzZXRDb25maWdGaWxlKENvbmZpZ0ZpbGUmIGNvbmZpZ0ZpbGUpCit7CisgIGNvbmZpZ0ZpbGUuYWRkU2VjdGlvbkhhbmRsZXIoImF1dGhvcml6YXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZDb21tYW5kVmFsaWRhdG9yOjpvbkNvbmZpZywgdGhpcywgXzEsIF8yLCBfMykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2FnZ3JlZ2F0ZUVycm9ycyhzdGQ6OnN0cmluZ3N0cmVhbSYgc3MsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpCit7CisgIGlmICghc3Muc3RyKCkuZW1wdHkoKSkKKyAgICB7CisgICAgICBzcyA8PCAiXG4iOworICAgIH0KKyAgc3MgPDwgbXNnOworfQorCit2b2lkCitDb21tYW5kVmFsaWRhdG9yOjpvbkNvbmZpZyhjb25zdCBDb25maWdTZWN0aW9uJiBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RyeVJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpmaWxlc3lzdGVtOworCisgIGNvbnN0IENvbmZpZ1NlY3Rpb24gRU1QVFlfU0VDVElPTjsKKworICBtX3ZhbGlkYXRvci5yZXNldCgpOworCisgIGlmIChzZWN0aW9uLmJlZ2luKCkgPT0gc2VjdGlvbi5lbmQoKSkKKyAgICB7CisgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiTm8gYXV0aG9yaXplIHNlY3Rpb25zIGZvdW5kIik7CisgICAgfQorCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGRyeVJ1bkVycm9yczsKKyAgQ29uZmlnU2VjdGlvbjo6Y29uc3RfaXRlcmF0b3IgYXV0aEl0OworICBmb3IgKGF1dGhJdCA9IHNlY3Rpb24uYmVnaW4oKTsgYXV0aEl0ICE9IHNlY3Rpb24uZW5kKCk7IGF1dGhJdCsrKQorICAgIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNlcnRmaWxlOworICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBjZXJ0ZmlsZSA9IGF1dGhJdC0+c2Vjb25kLmdldDxzdGQ6OnN0cmluZz4oImNlcnRmaWxlIik7CisgICAgICAgIH0KKyAgICAgIGNhdGNoIChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiTm8gY2VydGZpbGUgc3BlY2lmaWVkIjsKKyAgICAgICAgICBpZiAoIWlzRHJ5UnVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcihtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgIGFnZ3JlZ2F0ZUVycm9ycyhkcnlSdW5FcnJvcnMsIG1zZyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgc2hhcmVkX3B0cjxuZG46OklkZW50aXR5Q2VydGlmaWNhdGU+IGlkOworCisgICAgICBpZiAoY2VydGZpbGUgIT0gImFueSIpCisgICAgICAgIHsKKyAgICAgICAgICBwYXRoIGNlcnRmaWxlUGF0aCA9IGFic29sdXRlKGNlcnRmaWxlLCBwYXRoKGZpbGVuYW1lKS5wYXJlbnRfcGF0aCgpKTsKKyAgICAgICAgICBORkRfTE9HX0RFQlVHKCJnZW5lcmF0ZWQgY2VydGZpbGUgcGF0aDogIiA8PCBjZXJ0ZmlsZVBhdGgubmF0aXZlKCkpOworCisgICAgICAgICAgc3RkOjppZnN0cmVhbSBpbjsKKyAgICAgICAgICBpbi5vcGVuKGNlcnRmaWxlUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICBpZiAoIWluLmlzX29wZW4oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIlVuYWJsZSB0byBvcGVuIGNlcnRpZmljYXRlIGZpbGUgIiArIGNlcnRmaWxlUGF0aC5uYXRpdmUoKTsKKyAgICAgICAgICAgICAgaWYgKCFpc0RyeVJ1bikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcihtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWdncmVnYXRlRXJyb3JzKGRyeVJ1bkVycm9ycywgbXNnKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWQgPSBuZG46OmlvOjpsb2FkPG5kbjo6SWRlbnRpdHlDZXJ0aWZpY2F0ZT4oaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhdGNoIChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KGlkKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk1hbGZvcm1lZCBjZXJ0aWZpY2F0ZSBmaWxlICIgKyBjZXJ0ZmlsZVBhdGgubmF0aXZlKCk7CisgICAgICAgICAgICBpZiAoIWlzRHJ5UnVuKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IobXNnKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYWdncmVnYXRlRXJyb3JzKGRyeVJ1bkVycm9ycywgbXNnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgc3RkOjpzdHJpbmcga2V5TmFtZUZvckxvZ2dpbmc7CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oaWQpKQorICAgICAgICBrZXlOYW1lRm9yTG9nZ2luZyA9IGlkLT5nZXRQdWJsaWNLZXlOYW1lKCkudG9VcmkoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGtleU5hbWVGb3JMb2dnaW5nID0gIndpbGRjYXJkIjsKKyAgICAgICAgICBORkRfTE9HX1dBUk4oIldpbGRjYXJkIGlkZW50aXR5IGlzIGludGVuZGVkIGZvciBkZW1vIHB1cnBvc2Ugb25seSBhbmQgIiA8PAorICAgICAgICAgICAgICAgICAgICAgICAiU0hPVUxEIE5PVCBiZSB1c2VkIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQiKTsKKyAgICAgICAgfQorICAgICAgY29uc3QgQ29uZmlnU2VjdGlvbiogcHJpdmlsZWdlcyA9IDA7CisgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgIHByaXZpbGVnZXMgPSAmYXV0aEl0LT5zZWNvbmQuZ2V0X2NoaWxkKCJwcml2aWxlZ2VzIik7CisgICAgICAgIH0KKyAgICAgIGNhdGNoIChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGVycm9yKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk5vIHByaXZpbGVnZXMgc2VjdGlvbiBmb3VuZCBmb3IgY2VydGlmaWNhdGUgZmlsZSAiICsKKyAgICAgICAgICAgIGNlcnRmaWxlICsgIiAoIiArIGtleU5hbWVGb3JMb2dnaW5nICsgIikiOworICAgICAgICAgIGlmICghaXNEcnlSdW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgYWdncmVnYXRlRXJyb3JzKGRyeVJ1bkVycm9ycywgbXNnKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAocHJpdmlsZWdlcy0+YmVnaW4oKSA9PSBwcml2aWxlZ2VzLT5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgIE5GRF9MT0dfV0FSTigiTm8gcHJpdmlsZWdlcyBzcGVjaWZpZWQgZm9yIGNlcnRpZmljYXRlIGZpbGUgIiA8PCBjZXJ0ZmlsZQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IGtleU5hbWVGb3JMb2dnaW5nIDw8ICIpIik7CisgICAgICAgIH0KKworICAgICAgQ29uZmlnU2VjdGlvbjo6Y29uc3RfaXRlcmF0b3IgcHJpdkl0OworICAgICAgZm9yIChwcml2SXQgPSBwcml2aWxlZ2VzLT5iZWdpbigpOyBwcml2SXQgIT0gcHJpdmlsZWdlcy0+ZW5kKCk7IHByaXZJdCsrKQorICAgICAgICB7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByaXZpbGVnZU5hbWUgPSBwcml2SXQtPmZpcnN0OworICAgICAgICAgIGlmIChtX3N1cHBvcnRlZFByaXZpbGVnZXMuZmluZChwcml2aWxlZ2VOYW1lKSAhPSBtX3N1cHBvcnRlZFByaXZpbGVnZXMuZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE5GRF9MT0dfSU5GTygiR2l2aW5nIHByaXZpbGVnZSBcIiIgPDwgcHJpdmlsZWdlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiIHRvIGlkZW50aXR5ICIgPDwga2V5TmFtZUZvckxvZ2dpbmcpOworICAgICAgICAgICAgICBpZiAoIWlzRHJ5UnVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlZ2V4ID0gIl48bG9jYWxob3N0PjxuZmQ+PCIgKyBwcml2aWxlZ2VOYW1lICsgIj4iOworICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGlkKSkKKyAgICAgICAgICAgICAgICAgICAgbV92YWxpZGF0b3IuYWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCAqaWQpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtX3ZhbGlkYXRvci5hZGRJbnRlcmVzdEJ5cGFzc1J1bGUocmVnZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIEludmFsaWQgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiSW52YWxpZCBwcml2aWxlZ2UgXCIiICsgcHJpdmlsZWdlTmFtZSArCisgICAgICAgICAgICAgICAgIlwiIGZvciBjZXJ0aWZpY2F0ZSBmaWxlICIgKyBjZXJ0ZmlsZSArICIgKCIgKyBrZXlOYW1lRm9yTG9nZ2luZyArICIpIjsKKyAgICAgICAgICAgICAgaWYgKCFpc0RyeVJ1bikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcihtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWdncmVnYXRlRXJyb3JzKGRyeVJ1bkVycm9ycywgbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWRyeVJ1bkVycm9ycy5zdHIoKS5lbXB0eSgpKQorICAgIHsKKyAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKGRyeVJ1bkVycm9ycy5zdHIoKSk7CisgICAgfQorfQorCit2b2lkCitDb21tYW5kVmFsaWRhdG9yOjphZGRTdXBwb3J0ZWRQcml2aWxlZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHByaXZpbGVnZSkKK3sKKyAgaWYgKG1fc3VwcG9ydGVkUHJpdmlsZWdlcy5maW5kKHByaXZpbGVnZSkgIT0gbV9zdXBwb3J0ZWRQcml2aWxlZ2VzLmVuZCgpKQorICAgIHsKKyAgICAgIHRocm93IENvbW1hbmRWYWxpZGF0b3I6OkVycm9yKCJEdXBsaWNhdGVkIHByaXZpbGVnZTogIiArIHByaXZpbGVnZSk7CisgICAgfQorICBtX3N1cHBvcnRlZFByaXZpbGVnZXMuaW5zZXJ0KHByaXZpbGVnZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9tZ210L2NvbW1hbmQtdmFsaWRhdG9yLmhwcCBiL05GRC9kYWVtb24vbWdtdC9jb21tYW5kLXZhbGlkYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjYjE4NAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9jb21tYW5kLXZhbGlkYXRvci5ocHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9NR01UX0NPTU1BTkRfVkFMSURBVE9SX0hQUAorI2RlZmluZSBORkRfREFFTU9OX01HTVRfQ09NTUFORF9WQUxJREFUT1JfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgImNvbmZpZy1maWxlLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvY29tbWFuZC1pbnRlcmVzdC12YWxpZGF0b3IuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgQ29tbWFuZFZhbGlkYXRvcgoreworcHVibGljOgorCisgIGNsYXNzIEVycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0KQorICAgICAgOiBzdGQ6OnJ1bnRpbWVfZXJyb3Iod2hhdCkKKyAgICB7CisKKyAgICB9CisgIH07CisKKyAgQ29tbWFuZFZhbGlkYXRvcigpOworCisgIH5Db21tYW5kVmFsaWRhdG9yKCk7CisKKyAgdm9pZAorICBzZXRDb25maWdGaWxlKENvbmZpZ0ZpbGUmIGNvbmZpZ0ZpbGUpOworCisgIC8qKgorICAgKiBccGFyYW0gc2VjdGlvbiAiYXV0aG9yaXphdGlvbnMiIHNlY3Rpb24gdG8gcGFyc2UKKyAgICogXHBhcmFtIGlzRHJ5UnVuIHRydWUgaWYgcGVyZm9ybWluZyBhIGRyeSBydW4gb2YgY29uZmlndXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqIFxwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSBvZiBjb25maWd1cmF0aW9uIGZpbGUKKyAgICogXHRocm93cyBDb25maWdGaWxlOjpFcnJvciBvbiBwYXJzZSBlcnJvcgorICAgKi8KKyAgdm9pZAorICBvbkNvbmZpZyhjb25zdCBDb25maWdTZWN0aW9uJiBzZWN0aW9uLCBib29sIGlzRHJ5UnVuLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCisgIC8qKgorICAgKiBccGFyYW0gcHJpdmlsZWdlIG5hbWUgb2YgcHJpdmlsZWdlIHRvIGFkZAorICAgKiBcdGhyb3dzIENvbW1hbmRWYWxpZGF0b3I6OkVycm9yIG9uIGR1cGxpY2F0ZWQgcHJpdmlsZWdlCisgICAqLworICB2b2lkCisgIGFkZFN1cHBvcnRlZFByaXZpbGVnZShjb25zdCBzdGQ6OnN0cmluZyYgcHJpdmlsZWdlKTsKKworICB2b2lkCisgIGFkZEludGVyZXN0UnVsZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnZXgsCisgICAgICAgICAgICAgICAgICBjb25zdCBuZG46OklkZW50aXR5Q2VydGlmaWNhdGUmIGNlcnRpZmljYXRlKTsKKworICB2b2lkCisgIGFkZEludGVyZXN0UnVsZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnZXgsCisgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBrZXlOYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjpQdWJsaWNLZXkmIHB1YmxpY0tleSk7CisKKyAgdm9pZAorICB2YWxpZGF0ZShjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QsCisgICAgICAgICAgIGNvbnN0IG5kbjo6T25JbnRlcmVzdFZhbGlkYXRlZCYgb25WYWxpZGF0ZWQsCisgICAgICAgICAgIGNvbnN0IG5kbjo6T25JbnRlcmVzdFZhbGlkYXRpb25GYWlsZWQmIG9uVmFsaWRhdGlvbkZhaWxlZCk7CisKK3ByaXZhdGU6CisgIG5kbjo6Q29tbWFuZEludGVyZXN0VmFsaWRhdG9yIG1fdmFsaWRhdG9yOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbV9zdXBwb3J0ZWRQcml2aWxlZ2VzOworfTsKKworaW5saW5lIHZvaWQKK0NvbW1hbmRWYWxpZGF0b3I6OmFkZEludGVyZXN0UnVsZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjpJZGVudGl0eUNlcnRpZmljYXRlJiBjZXJ0aWZpY2F0ZSkKK3sKKyAgbV92YWxpZGF0b3IuYWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCBjZXJ0aWZpY2F0ZSk7Cit9CisKK2lubGluZSB2b2lkCitDb21tYW5kVmFsaWRhdG9yOjphZGRJbnRlcmVzdFJ1bGUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIGtleU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjpQdWJsaWNLZXkmIHB1YmxpY0tleSkKK3sKKyAgbV92YWxpZGF0b3IuYWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCBrZXlOYW1lLCBwdWJsaWNLZXkpOworfQorCitpbmxpbmUgdm9pZAorQ29tbWFuZFZhbGlkYXRvcjo6dmFsaWRhdGUoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjpPbkludGVyZXN0VmFsaWRhdGVkJiBvblZhbGlkYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6T25JbnRlcmVzdFZhbGlkYXRpb25GYWlsZWQmIG9uVmFsaWRhdGlvbkZhaWxlZCkKK3sKKyAgbV92YWxpZGF0b3IudmFsaWRhdGUoaW50ZXJlc3QsIG9uVmFsaWRhdGVkLCBvblZhbGlkYXRpb25GYWlsZWQpOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fTUdNVF9DT01NQU5EX1ZBTElEQVRPUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9mYWNlLW1hbmFnZXIuY3BwIGIvTkZEL2RhZW1vbi9tZ210L2ZhY2UtbWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4ZjFiOQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9mYWNlLW1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMTE5MSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZhY2UtbWFuYWdlci5ocHAiCisKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisjaW5jbHVkZSAiY29yZS9uZXR3b3JrLWludGVyZmFjZS5ocHAiCisjaW5jbHVkZSAiZncvZmFjZS10YWJsZS5ocHAiCisjaW5jbHVkZSAiZmFjZS90Y3AtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAiZmFjZS91ZHAtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAiY29yZS9jb25maWctZmlsZS5ocHAiCisKKyNpZmRlZiBIQVZFX1VOSVhfU09DS0VUUworI2luY2x1ZGUgImZhY2UvdW5peC1zdHJlYW0tZmFjdG9yeS5ocHAiCisjZW5kaWYgLy8gSEFWRV9VTklYX1NPQ0tFVFMKKworI2lmZGVmIEhBVkVfTElCUENBUAorI2luY2x1ZGUgImZhY2UvZXRoZXJuZXQtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAiZmFjZS9ldGhlcm5ldC1mYWNlLmhwcCIKKyNlbmRpZiAvLyBIQVZFX0xJQlBDQVAKKworI2lmZGVmIEhBVkVfV0VCU09DS0VUCisjaW5jbHVkZSAiZmFjZS93ZWJzb2NrZXQtZmFjdG9yeS5ocHAiCisjZW5kaWYgLy8gSEFWRV9XRUJTT0NLRVQKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmFjZS1ldmVudC1ub3RpZmljYXRpb24uaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmFjZS1xdWVyeS1maWx0ZXIuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJGYWNlTWFuYWdlciIpOworCitjb25zdCBOYW1lIEZhY2VNYW5hZ2VyOjpDT01NQU5EX1BSRUZJWCgiL2xvY2FsaG9zdC9uZmQvZmFjZXMiKTsKKworY29uc3Qgc2l6ZV90IEZhY2VNYW5hZ2VyOjpDT01NQU5EX1VOU0lHTkVEX05DT01QUyA9CisgIEZhY2VNYW5hZ2VyOjpDT01NQU5EX1BSRUZJWC5zaXplKCkgKworICAxICsgLy8gdmVyYgorICAxOyAgLy8gdmVyYiBwYXJhbWV0ZXJzCisKK2NvbnN0IHNpemVfdCBGYWNlTWFuYWdlcjo6Q09NTUFORF9TSUdORURfTkNPTVBTID0KKyAgRmFjZU1hbmFnZXI6OkNPTU1BTkRfVU5TSUdORURfTkNPTVBTICsKKyAgNDsgLy8gKHRpbWVzdGFtcCwgbm9uY2UsIHNpZ25lZCBpbmZvIHRsdiwgc2lnbmF0dXJlIHRsdikKKworY29uc3QgRmFjZU1hbmFnZXI6OlNpZ25lZFZlcmJBbmRQcm9jZXNzb3IgRmFjZU1hbmFnZXI6OlNJR05FRF9DT01NQU5EX1ZFUkJTW10gPQorICB7CisgICAgU2lnbmVkVmVyYkFuZFByb2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgiY3JlYXRlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmFjZU1hbmFnZXI6OmNyZWF0ZUZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisKKyAgICBTaWduZWRWZXJiQW5kUHJvY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZTo6Q29tcG9uZW50KCJkZXN0cm95IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmFjZU1hbmFnZXI6OmRlc3Ryb3lGYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorCisgICAgU2lnbmVkVmVyYkFuZFByb2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgiZW5hYmxlLWxvY2FsLWNvbnRyb2wiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZGYWNlTWFuYWdlcjo6ZW5hYmxlTG9jYWxDb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorCisgICAgU2lnbmVkVmVyYkFuZFByb2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgiZGlzYWJsZS1sb2NhbC1jb250cm9sIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmFjZU1hbmFnZXI6OmRpc2FibGVMb2NhbENvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgIH07CisKK2NvbnN0IEZhY2VNYW5hZ2VyOjpVbnNpZ25lZFZlcmJBbmRQcm9jZXNzb3IgRmFjZU1hbmFnZXI6OlVOU0lHTkVEX0NPTU1BTkRfVkVSQlNbXSA9CisgIHsKKyAgICBVbnNpZ25lZFZlcmJBbmRQcm9jZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgibGlzdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmFjZU1hbmFnZXI6Omxpc3RGYWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorCisgICAgVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lOjpDb21wb25lbnQoImV2ZW50cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmFjZU1hbmFnZXI6Omlnbm9yZVVuc2lnbmVkVmVyYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorCisgICAgVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lOjpDb21wb25lbnQoImNoYW5uZWxzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGYWNlTWFuYWdlcjo6bGlzdENoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisKKyAgICBVbnNpZ25lZFZlcmJBbmRQcm9jZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgicXVlcnkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZhY2VNYW5hZ2VyOjpsaXN0UXVlcmllZEZhY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgIH07CisKK2NvbnN0IE5hbWUgRmFjZU1hbmFnZXI6OkZBQ0VTX0xJU1RfREFUQVNFVF9QUkVGSVgoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL2xpc3QiKTsKK2NvbnN0IHNpemVfdCBGYWNlTWFuYWdlcjo6RkFDRVNfTElTVF9EQVRBU0VUX05DT01QUyA9IEZBQ0VTX0xJU1RfREFUQVNFVF9QUkVGSVguc2l6ZSgpOworCitjb25zdCBOYW1lIEZhY2VNYW5hZ2VyOjpGQUNFX0VWRU5UU19QUkVGSVgoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL2V2ZW50cyIpOworCitjb25zdCBOYW1lIEZhY2VNYW5hZ2VyOjpDSEFOTkVMU19MSVNUX0RBVEFTRVRfUFJFRklYKCIvbG9jYWxob3N0L25mZC9mYWNlcy9jaGFubmVscyIpOworY29uc3Qgc2l6ZV90IEZhY2VNYW5hZ2VyOjpDSEFOTkVMU19MSVNUX0RBVEFTRVRfTkNPTVBTID0gQ0hBTk5FTFNfTElTVF9EQVRBU0VUX1BSRUZJWC5zaXplKCk7CisKK2NvbnN0IE5hbWUgRmFjZU1hbmFnZXI6OkZBQ0VTX1FVRVJZX0RBVEFTRVRfUFJFRklYKCIvbG9jYWxob3N0L25mZC9mYWNlcy9xdWVyeSIpOworY29uc3Qgc2l6ZV90IEZhY2VNYW5hZ2VyOjpGQUNFU19RVUVSWV9EQVRBU0VUX05DT01QUyA9IEZBQ0VTX1FVRVJZX0RBVEFTRVRfUFJFRklYLnNpemUoKSArIDE7CisKK0ZhY2VNYW5hZ2VyOjpGYWNlTWFuYWdlcihGYWNlVGFibGUmIGZhY2VUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbikKKyAgOiBNYW5hZ2VyQmFzZShmYWNlLCBGQUNFX01BTkFHRVJfUFJJVklMRUdFLCBrZXlDaGFpbikKKyAgLCBtX2ZhY2VUYWJsZShmYWNlVGFibGUpCisgICwgbV9mYWNlQWRkQ29ubihtX2ZhY2VUYWJsZS5vbkFkZC5jb25uZWN0KGJpbmQoJkZhY2VNYW5hZ2VyOjpvbkFkZEZhY2UsIHRoaXMsIF8xKSkpCisgICwgbV9mYWNlUmVtb3ZlQ29ubihtX2ZhY2VUYWJsZS5vblJlbW92ZS5jb25uZWN0KGJpbmQoJkZhY2VNYW5hZ2VyOjpvblJlbW92ZUZhY2UsIHRoaXMsIF8xKSkpCisgICwgbV9mYWNlU3RhdHVzUHVibGlzaGVyKG1fZmFjZVRhYmxlLCAqbV9mYWNlLCBGQUNFU19MSVNUX0RBVEFTRVRfUFJFRklYLCBrZXlDaGFpbikKKyAgLCBtX2NoYW5uZWxTdGF0dXNQdWJsaXNoZXIobV9mYWN0b3JpZXMsICptX2ZhY2UsIENIQU5ORUxTX0xJU1RfREFUQVNFVF9QUkVGSVgsIGtleUNoYWluKQorICAsIG1fbm90aWZpY2F0aW9uU3RyZWFtKCptX2ZhY2UsIEZBQ0VfRVZFTlRTX1BSRUZJWCwga2V5Q2hhaW4pCisgICwgbV9zaWduZWRWZXJiRGlzcGF0Y2goU0lHTkVEX0NPTU1BTkRfVkVSQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkVEX0NPTU1BTkRfVkVSQlMgKworICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoU0lHTkVEX0NPTU1BTkRfVkVSQlMpIC8gc2l6ZW9mKFNpZ25lZFZlcmJBbmRQcm9jZXNzb3IpKSkKKyAgLCBtX3Vuc2lnbmVkVmVyYkRpc3BhdGNoKFVOU0lHTkVEX0NPTU1BTkRfVkVSQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlNJR05FRF9DT01NQU5EX1ZFUkJTICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoVU5TSUdORURfQ09NTUFORF9WRVJCUykgLyBzaXplb2YoVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yKSkpCisKK3sKKyAgZmFjZS0+c2V0SW50ZXJlc3RGaWx0ZXIoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRmFjZU1hbmFnZXI6Om9uRmFjZVJlcXVlc3QsIHRoaXMsIF8yKSk7Cit9CisKK0ZhY2VNYW5hZ2VyOjp+RmFjZU1hbmFnZXIoKQoreworCit9CisKK3ZvaWQKK0ZhY2VNYW5hZ2VyOjpzZXRDb25maWdGaWxlKENvbmZpZ0ZpbGUmIGNvbmZpZ0ZpbGUpCit7CisgIGNvbmZpZ0ZpbGUuYWRkU2VjdGlvbkhhbmRsZXIoImZhY2Vfc3lzdGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlTWFuYWdlcjo6b25Db25maWcsIHRoaXMsIF8xLCBfMiwgXzMpKTsKK30KKworCit2b2lkCitGYWNlTWFuYWdlcjo6b25Db25maWcoY29uc3QgQ29uZmlnU2VjdGlvbiYgY29uZmlnU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRHJ5UnVuLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgYm9vbCBoYXNTZWVuVW5peCA9IGZhbHNlOworICBib29sIGhhc1NlZW5UY3AgPSBmYWxzZTsKKyAgYm9vbCBoYXNTZWVuVWRwID0gZmFsc2U7CisgIGJvb2wgaGFzU2VlbkV0aGVyID0gZmFsc2U7CisgIGJvb2wgaGFzU2VlbldlYlNvY2tldCA9IGZhbHNlOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPE5ldHdvcmtJbnRlcmZhY2VJbmZvPiBuaWNMaXN0KGxpc3ROZXR3b3JrSW50ZXJmYWNlcygpKTsKKworICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBjb25maWdTZWN0aW9uKQorICAgIHsKKyAgICAgIGlmIChpdGVtLmZpcnN0ID09ICJ1bml4IikKKyAgICAgICAgeworICAgICAgICAgIGlmIChoYXNTZWVuVW5peCkKKyAgICAgICAgICAgIHRocm93IEVycm9yKCJEdXBsaWNhdGUgXCJ1bml4XCIgc2VjdGlvbiIpOworICAgICAgICAgIGhhc1NlZW5Vbml4ID0gdHJ1ZTsKKworICAgICAgICAgIHByb2Nlc3NTZWN0aW9uVW5peChpdGVtLnNlY29uZCwgaXNEcnlSdW4pOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpdGVtLmZpcnN0ID09ICJ0Y3AiKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGhhc1NlZW5UY3ApCisgICAgICAgICAgICB0aHJvdyBFcnJvcigiRHVwbGljYXRlIFwidGNwXCIgc2VjdGlvbiIpOworICAgICAgICAgIGhhc1NlZW5UY3AgPSB0cnVlOworCisgICAgICAgICAgcHJvY2Vzc1NlY3Rpb25UY3AoaXRlbS5zZWNvbmQsIGlzRHJ5UnVuKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaXRlbS5maXJzdCA9PSAidWRwIikKKyAgICAgICAgeworICAgICAgICAgIGlmIChoYXNTZWVuVWRwKQorICAgICAgICAgICAgdGhyb3cgRXJyb3IoIkR1cGxpY2F0ZSBcInVkcFwiIHNlY3Rpb24iKTsKKyAgICAgICAgICBoYXNTZWVuVWRwID0gdHJ1ZTsKKworICAgICAgICAgIHByb2Nlc3NTZWN0aW9uVWRwKGl0ZW0uc2Vjb25kLCBpc0RyeVJ1biwgbmljTGlzdCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGl0ZW0uZmlyc3QgPT0gImV0aGVyIikKKyAgICAgICAgeworICAgICAgICAgIGlmIChoYXNTZWVuRXRoZXIpCisgICAgICAgICAgICB0aHJvdyBFcnJvcigiRHVwbGljYXRlIFwiZXRoZXJcIiBzZWN0aW9uIik7CisgICAgICAgICAgaGFzU2VlbkV0aGVyID0gdHJ1ZTsKKworICAgICAgICAgIHByb2Nlc3NTZWN0aW9uRXRoZXIoaXRlbS5zZWNvbmQsIGlzRHJ5UnVuLCBuaWNMaXN0KTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaXRlbS5maXJzdCA9PSAid2Vic29ja2V0IikKKyAgICAgICAgeworICAgICAgICAgIGlmIChoYXNTZWVuV2ViU29ja2V0KQorICAgICAgICAgICAgdGhyb3cgRXJyb3IoIkR1cGxpY2F0ZSBcIndlYnNvY2tldFwiIHNlY3Rpb24iKTsKKyAgICAgICAgICBoYXNTZWVuV2ViU29ja2V0ID0gdHJ1ZTsKKworICAgICAgICAgIHByb2Nlc3NTZWN0aW9uV2ViU29ja2V0KGl0ZW0uc2Vjb25kLCBpc0RyeVJ1bik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgb3B0aW9uIFwiIiArIGl0ZW0uZmlyc3QgKyAiXCIiKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorRmFjZU1hbmFnZXI6OnByb2Nlc3NTZWN0aW9uVW5peChjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLCBib29sIGlzRHJ5UnVuKQoreworICAvLyA7IHRoZSB1bml4IHNlY3Rpb24gY29udGFpbnMgc2V0dGluZ3Mgb2YgVW5peCBzdHJlYW0gZmFjZXMgYW5kIGNoYW5uZWxzCisgIC8vIHVuaXgKKyAgLy8geworICAvLyAgIHBhdGggL3Zhci9ydW4vbmZkLnNvY2sgOyBVbml4IHN0cmVhbSBsaXN0ZW5lciBwYXRoCisgIC8vIH0KKworI2lmIGRlZmluZWQoSEFWRV9VTklYX1NPQ0tFVFMpCisKKyAgc3RkOjpzdHJpbmcgcGF0aCA9ICIvdmFyL3J1bi9uZmQuc29jayI7CisKKyAgZm9yIChDb25maWdTZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpID0gY29uZmlnU2VjdGlvbi5iZWdpbigpOworICAgICAgIGkgIT0gY29uZmlnU2VjdGlvbi5lbmQoKTsKKyAgICAgICArK2kpCisgICAgeworICAgICAgaWYgKGktPmZpcnN0ID09ICJwYXRoIikKKyAgICAgICAgeworICAgICAgICAgIHBhdGggPSBpLT5zZWNvbmQuZ2V0X3ZhbHVlPHN0ZDo6c3RyaW5nPigpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiVW5yZWNvZ25pemVkIG9wdGlvbiBcIiIgKyBpLT5maXJzdCArICJcIiBpbiBcInVuaXhcIiBzZWN0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFpc0RyeVJ1bikKKyAgICB7CisgICAgICBpZiAobV9mYWN0b3JpZXMuY291bnQoInVuaXgiKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgICAgLy8gc2hhcmVkX3B0cjxVbml4U3RyZWFtRmFjdG9yeT4gZmFjdG9yeQorICAgICAgICAgIC8vICAgPSBzdGF0aWNfcG9pbnRlcl9jYXN0PFVuaXhTdHJlYW1GYWN0b3J5PihtX2ZhY3Rvcmllc1sidW5peCJdKTsKKyAgICAgICAgICAvLyBzaGFyZWRfcHRyPFVuaXhTdHJlYW1DaGFubmVsPiB1bml4Q2hhbm5lbCA9IGZhY3RvcnktPmZpbmRDaGFubmVsKHBhdGgpOworCisgICAgICAgICAgLy8gaWYgKHN0YXRpY19jYXN0PGJvb2w+KHVuaXhDaGFubmVsKSkKKyAgICAgICAgICAvLyAgIHsKKyAgICAgICAgICAvLyAgICAgcmV0dXJuOworICAgICAgICAgIC8vICAgfQorICAgICAgICB9CisKKyAgICAgIHNoYXJlZF9wdHI8VW5peFN0cmVhbUZhY3Rvcnk+IGZhY3RvcnkgPSBtYWtlX3NoYXJlZDxVbml4U3RyZWFtRmFjdG9yeT4oKTsKKyAgICAgIHNoYXJlZF9wdHI8VW5peFN0cmVhbUNoYW5uZWw+IHVuaXhDaGFubmVsID0gZmFjdG9yeS0+Y3JlYXRlQ2hhbm5lbChwYXRoKTsKKworICAgICAgLy8gU2hvdWxkIGFjY2VwdEZhaWxlZCBjYWxsYmFjayBiZSB1c2VkIHNvbWVob3c/CisgICAgICB1bml4Q2hhbm5lbC0+bGlzdGVuKGJpbmQoJkZhY2VUYWJsZTo6YWRkLCAmbV9mYWNlVGFibGUsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVW5peFN0cmVhbUNoYW5uZWw6OkNvbm5lY3RGYWlsZWRDYWxsYmFjaygpKTsKKworICAgICAgbV9mYWN0b3JpZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCJ1bml4IiwgZmFjdG9yeSkpOworICAgIH0KKyNlbHNlCisgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJORkQgd2FzIGNvbXBpbGVkIHdpdGhvdXQgVW5peCBzb2NrZXRzIHN1cHBvcnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwcm9jZXNzIFwidW5peFwiIHNlY3Rpb24iKTsKKyNlbmRpZiAvLyBIQVZFX1VOSVhfU09DS0VUUworCit9CisKK3ZvaWQKK0ZhY2VNYW5hZ2VyOjpwcm9jZXNzU2VjdGlvblRjcChjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLCBib29sIGlzRHJ5UnVuKQoreworICAvLyA7IHRoZSB0Y3Agc2VjdGlvbiBjb250YWlucyBzZXR0aW5ncyBvZiBUQ1AgZmFjZXMgYW5kIGNoYW5uZWxzCisgIC8vIHRjcAorICAvLyB7CisgIC8vICAgbGlzdGVuIHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgVENQIGxpc3RlbmVyLCBkZWZhdWx0ICd5ZXMnCisgIC8vICAgcG9ydCA2MzYzIDsgVENQIGxpc3RlbmVyIHBvcnQgbnVtYmVyCisgIC8vIH0KKworICBzdGQ6OnN0cmluZyBwb3J0ID0gIjYzNjMiOworICBib29sIG5lZWRUb0xpc3RlbiA9IHRydWU7CisgIGJvb2wgZW5hYmxlVjQgPSB0cnVlOworICBib29sIGVuYWJsZVY2ID0gdHJ1ZTsKKworICBmb3IgKENvbmZpZ1NlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGkgPSBjb25maWdTZWN0aW9uLmJlZ2luKCk7CisgICAgICAgaSAhPSBjb25maWdTZWN0aW9uLmVuZCgpOworICAgICAgICsraSkKKyAgICB7CisgICAgICBpZiAoaS0+Zmlyc3QgPT0gInBvcnQiKQorICAgICAgICB7CisgICAgICAgICAgcG9ydCA9IGktPnNlY29uZC5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCk7CisgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHVpbnQxNl90IHBvcnRObyA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8dWludDE2X3Q+KHBvcnQpOworICAgICAgICAgICAgICBORkRfTE9HX1RSQUNFKCJUQ1AgcG9ydCBzZXQgdG8gIiA8PCBwb3J0Tm8pOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhdGNoIChjb25zdCBzdGQ6OmJhZF9jYXN0JiBlcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0+Zmlyc3QgKyAiXCIgaW4gXCJ0Y3BcIiBzZWN0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGktPmZpcnN0ID09ICJsaXN0ZW4iKQorICAgICAgICB7CisgICAgICAgICAgbmVlZFRvTGlzdGVuID0gcGFyc2VZZXNObyhpLCBpLT5maXJzdCwgInRjcCIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAiZW5hYmxlX3Y0IikKKyAgICAgICAgeworICAgICAgICAgIGVuYWJsZVY0ID0gcGFyc2VZZXNObyhpLCBpLT5maXJzdCwgInRjcCIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAiZW5hYmxlX3Y2IikKKyAgICAgICAgeworICAgICAgICAgIGVuYWJsZVY2ID0gcGFyc2VZZXNObyhpLCBpLT5maXJzdCwgInRjcCIpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiVW5yZWNvZ25pemVkIG9wdGlvbiBcIiIgKyBpLT5maXJzdCArICJcIiBpbiBcInRjcFwiIHNlY3Rpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWVuYWJsZVY0ICYmICFlbmFibGVWNikKKyAgICB7CisgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiSVB2NCBhbmQgSVB2NiBjaGFubmVscyBoYXZlIGJlZW4gZGlzYWJsZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZW1vdmUgXCJ0Y3BcIiBzZWN0aW9uIHRvIGRpc2FibGUgVENQIGNoYW5uZWxzIG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZS1lbmFibGUgYXQgbGVhc3Qgb25lIGNoYW5uZWwgdHlwZS4iKTsKKyAgICB9CisKKyAgaWYgKCFpc0RyeVJ1bikKKyAgICB7CisgICAgICBpZiAobV9mYWN0b3JpZXMuY291bnQoInRjcCIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBzaGFyZWRfcHRyPFRjcEZhY3Rvcnk+IGZhY3RvcnkgPSBtYWtlX3NoYXJlZDxUY3BGYWN0b3J5Pihwb3J0KTsKKyAgICAgIG1fZmFjdG9yaWVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigidGNwIiwgZmFjdG9yeSkpOworCisgICAgICBpZiAoZW5hYmxlVjQpCisgICAgICAgIHsKKyAgICAgICAgICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGlwdjRDaGFubmVsID0gZmFjdG9yeS0+Y3JlYXRlQ2hhbm5lbCgiMC4wLjAuMCIsIHBvcnQpOworICAgICAgICAgIGlmIChuZWVkVG9MaXN0ZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIFNob3VsZCBhY2NlcHRGYWlsZWQgY2FsbGJhY2sgYmUgdXNlZCBzb21laG93PworICAgICAgICAgICAgICBpcHY0Q2hhbm5lbC0+bGlzdGVuKGJpbmQoJkZhY2VUYWJsZTo6YWRkLCAmbV9mYWNlVGFibGUsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUY3BDaGFubmVsOjpDb25uZWN0RmFpbGVkQ2FsbGJhY2soKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBtX2ZhY3Rvcmllcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoInRjcDQiLCBmYWN0b3J5KSk7CisgICAgICAgIH0KKworICAgICAgaWYgKGVuYWJsZVY2KQorICAgICAgICB7CisgICAgICAgICAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBpcHY2Q2hhbm5lbCA9IGZhY3RvcnktPmNyZWF0ZUNoYW5uZWwoIjo6IiwgcG9ydCk7CisgICAgICAgICAgaWYgKG5lZWRUb0xpc3RlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gU2hvdWxkIGFjY2VwdEZhaWxlZCBjYWxsYmFjayBiZSB1c2VkIHNvbWVob3c/CisgICAgICAgICAgICAgIGlwdjZDaGFubmVsLT5saXN0ZW4oYmluZCgmRmFjZVRhYmxlOjphZGQsICZtX2ZhY2VUYWJsZSwgXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRjcENoYW5uZWw6OkNvbm5lY3RGYWlsZWRDYWxsYmFjaygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIG1fZmFjdG9yaWVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigidGNwNiIsIGZhY3RvcnkpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorRmFjZU1hbmFnZXI6OnByb2Nlc3NTZWN0aW9uVWRwKGNvbnN0IENvbmZpZ1NlY3Rpb24mIGNvbmZpZ1NlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RyeVJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOZXR3b3JrSW50ZXJmYWNlSW5mbz4mIG5pY0xpc3QpCit7CisgIC8vIDsgdGhlIHVkcCBzZWN0aW9uIGNvbnRhaW5zIHNldHRpbmdzIG9mIFVEUCBmYWNlcyBhbmQgY2hhbm5lbHMKKyAgLy8gdWRwCisgIC8vIHsKKyAgLy8gICBwb3J0IDYzNjMgOyBVRFAgdW5pY2FzdCBwb3J0IG51bWJlcgorICAvLyAgIGlkbGVfdGltZW91dCAzMCA7IGlkbGUgdGltZSAoc2Vjb25kcykgYmVmb3JlIGNsb3NpbmcgYSBVRFAgdW5pY2FzdCBmYWNlCisgIC8vICAga2VlcF9hbGl2ZV9pbnRlcnZhbCAyNTsgaW50ZXJ2YWwgKHNlY29uZHMpIGJldHdlZW4ga2VlcC1hbGl2ZSByZWZyZXNoZXMKKworICAvLyAgIDsgTkZEIGNyZWF0ZXMgb25lIFVEUCBtdWx0aWNhc3QgZmFjZSBwZXIgTklDCisgIC8vICAgbWNhc3QgeWVzIDsgc2V0IHRvICdubycgdG8gZGlzYWJsZSBVRFAgbXVsdGljYXN0LCBkZWZhdWx0ICd5ZXMnCisgIC8vICAgbWNhc3RfcG9ydCA1NjM2MyA7IFVEUCBtdWx0aWNhc3QgcG9ydCBudW1iZXIKKyAgLy8gICBtY2FzdF9ncm91cCAyMjQuMC4yMy4xNzAgOyBVRFAgbXVsdGljYXN0IGdyb3VwIChJUHY0IG9ubHkpCisgIC8vIH0KKworICBzdGQ6OnN0cmluZyBwb3J0ID0gIjYzNjMiOworICBib29sIGVuYWJsZVY0ID0gdHJ1ZTsKKyAgYm9vbCBlbmFibGVWNiA9IHRydWU7CisgIHNpemVfdCB0aW1lb3V0ID0gMzA7CisgIHNpemVfdCBrZWVwQWxpdmVJbnRlcnZhbCA9IDI1OworICBib29sIHVzZU1jYXN0ID0gdHJ1ZTsKKyAgc3RkOjpzdHJpbmcgbWNhc3RHcm91cCA9ICIyMjQuMC4yMy4xNzAiOworICBzdGQ6OnN0cmluZyBtY2FzdFBvcnQgPSAiNTYzNjMiOworCisKKyAgZm9yIChDb25maWdTZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpID0gY29uZmlnU2VjdGlvbi5iZWdpbigpOworICAgICAgIGkgIT0gY29uZmlnU2VjdGlvbi5lbmQoKTsKKyAgICAgICArK2kpCisgICAgeworICAgICAgaWYgKGktPmZpcnN0ID09ICJwb3J0IikKKyAgICAgICAgeworICAgICAgICAgIHBvcnQgPSBpLT5zZWNvbmQuZ2V0X3ZhbHVlPHN0ZDo6c3RyaW5nPigpOworICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1aW50MTZfdCBwb3J0Tm8gPSBib29zdDo6bGV4aWNhbF9jYXN0PHVpbnQxNl90Pihwb3J0KTsKKyAgICAgICAgICAgICAgTkZEX0xPR19UUkFDRSgiVURQIHBvcnQgc2V0IHRvICIgPDwgcG9ydE5vKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfY2FzdCYgZXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktPmZpcnN0ICsgIlwiIGluIFwidWRwXCIgc2VjdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAiZW5hYmxlX3Y0IikKKyAgICAgICAgeworICAgICAgICAgIGVuYWJsZVY0ID0gcGFyc2VZZXNObyhpLCBpLT5maXJzdCwgInVkcCIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAiZW5hYmxlX3Y2IikKKyAgICAgICAgeworICAgICAgICAgIGVuYWJsZVY2ID0gcGFyc2VZZXNObyhpLCBpLT5maXJzdCwgInVkcCIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAiaWRsZV90aW1lb3V0IikKKyAgICAgICAgeworICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0aW1lb3V0ID0gaS0+c2Vjb25kLmdldF92YWx1ZTxzaXplX3Q+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktPmZpcnN0ICsgIlwiIGluIFwidWRwXCIgc2VjdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAia2VlcF9hbGl2ZV9pbnRlcnZhbCIpCisgICAgICAgIHsKKyAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAga2VlcEFsaXZlSW50ZXJ2YWwgPSBpLT5zZWNvbmQuZ2V0X3ZhbHVlPHNpemVfdD4oKTsKKworICAgICAgICAgICAgICAvLy8gXHRvZG8gTWFrZSB1c2Ugb2Yga2VlcEFsaXZlSW50ZXJ2YWwKKyAgICAgICAgICAgICAgKHZvaWQpKGtlZXBBbGl2ZUludGVydmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0+Zmlyc3QgKyAiXCIgaW4gXCJ1ZHBcIiBzZWN0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGktPmZpcnN0ID09ICJtY2FzdCIpCisgICAgICAgIHsKKyAgICAgICAgICB1c2VNY2FzdCA9IHBhcnNlWWVzTm8oaSwgaS0+Zmlyc3QsICJ1ZHAiKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaS0+Zmlyc3QgPT0gIm1jYXN0X3BvcnQiKQorICAgICAgICB7CisgICAgICAgICAgbWNhc3RQb3J0ID0gaS0+c2Vjb25kLmdldF92YWx1ZTxzdGQ6OnN0cmluZz4oKTsKKyAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdWludDE2X3QgcG9ydE5vID0gYm9vc3Q6OmxleGljYWxfY2FzdDx1aW50MTZfdD4obWNhc3RQb3J0KTsKKyAgICAgICAgICAgICAgTkZEX0xPR19UUkFDRSgiVURQIG11bHRpY2FzdCBwb3J0IHNldCB0byAiIDw8IHBvcnRObyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2Nhc3QmIGVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLT5maXJzdCArICJcIiBpbiBcInVkcFwiIHNlY3Rpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaS0+Zmlyc3QgPT0gIm1jYXN0X2dyb3VwIikKKyAgICAgICAgeworICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6YXNpbzo6aXA7CisgICAgICAgICAgbWNhc3RHcm91cCA9IGktPnNlY29uZC5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCk7CisgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFkZHJlc3MgbWNhc3RHcm91cFRlc3QgPSBhZGRyZXNzOjpmcm9tX3N0cmluZyhtY2FzdEdyb3VwKTsKKyAgICAgICAgICAgICAgaWYgKCFtY2FzdEdyb3VwVGVzdC5pc192NCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktPmZpcnN0ICsgIlwiIGluIFwidWRwXCIgc2VjdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0+Zmlyc3QgKyAiXCIgaW4gXCJ1ZHBcIiBzZWN0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJVbnJlY29nbml6ZWQgb3B0aW9uIFwiIiArIGktPmZpcnN0ICsgIlwiIGluIFwidWRwXCIgc2VjdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgIGlmICghZW5hYmxlVjQgJiYgIWVuYWJsZVY2KQorICAgIHsKKyAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJUHY0IGFuZCBJUHY2IGNoYW5uZWxzIGhhdmUgYmVlbiBkaXNhYmxlZC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJlbW92ZSBcInVkcFwiIHNlY3Rpb24gdG8gZGlzYWJsZSBVRFAgY2hhbm5lbHMgb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlLWVuYWJsZSBhdCBsZWFzdCBvbmUgY2hhbm5lbCB0eXBlLiIpOworICAgIH0KKyAgZWxzZSBpZiAodXNlTWNhc3QgJiYgIWVuYWJsZVY0KQorICAgIHsKKyAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJUHY0IG11bHRpY2FzdCByZXF1ZXN0ZWQsIGJ1dCBJUHY0IGNoYW5uZWxzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXZlIGJlZW4gZGlzYWJsZWQgKGNvbmZsaWN0aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzZXQpIik7CisgICAgfQorCisgIC8vLyBcdG9kbyB3aGF0IGlzIGtlZXAgYWxpdmUgaW50ZXJ2YWwgdXNlZCBmb3I/CisKKyAgaWYgKCFpc0RyeVJ1bikKKyAgICB7CisgICAgICBzaGFyZWRfcHRyPFVkcEZhY3Rvcnk+IGZhY3Rvcnk7CisgICAgICBib29sIGlzUmVsb2FkID0gZmFsc2U7CisgICAgICBpZiAobV9mYWN0b3JpZXMuY291bnQoInVkcCIpID4gMCkgeworICAgICAgICBpc1JlbG9hZCA9IHRydWU7CisgICAgICAgIGZhY3RvcnkgPSBzdGF0aWNfcG9pbnRlcl9jYXN0PFVkcEZhY3Rvcnk+KG1fZmFjdG9yaWVzWyJ1ZHAiXSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgZmFjdG9yeSA9IG1ha2Vfc2hhcmVkPFVkcEZhY3Rvcnk+KHBvcnQpOworICAgICAgICBtX2ZhY3Rvcmllcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoInVkcCIsIGZhY3RvcnkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFpc1JlbG9hZCAmJiBlbmFibGVWNCkKKyAgICAgICAgeworICAgICAgICAgIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gdjRDaGFubmVsID0KKyAgICAgICAgICAgIGZhY3RvcnktPmNyZWF0ZUNoYW5uZWwoIjAuMC4wLjAiLCBwb3J0LCB0aW1lOjpzZWNvbmRzKHRpbWVvdXQpKTsKKworICAgICAgICAgIHY0Q2hhbm5lbC0+bGlzdGVuKGJpbmQoJkZhY2VUYWJsZTo6YWRkLCAmbV9mYWNlVGFibGUsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVZHBDaGFubmVsOjpDb25uZWN0RmFpbGVkQ2FsbGJhY2soKSk7CisKKyAgICAgICAgICBtX2ZhY3Rvcmllcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoInVkcDQiLCBmYWN0b3J5KSk7CisgICAgICAgIH0KKworICAgICAgaWYgKCFpc1JlbG9hZCAmJiBlbmFibGVWNikKKyAgICAgICAgeworICAgICAgICAgIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gdjZDaGFubmVsID0KKyAgICAgICAgICAgIGZhY3RvcnktPmNyZWF0ZUNoYW5uZWwoIjo6IiwgcG9ydCwgdGltZTo6c2Vjb25kcyh0aW1lb3V0KSk7CisKKyAgICAgICAgICB2NkNoYW5uZWwtPmxpc3RlbihiaW5kKCZGYWNlVGFibGU6OmFkZCwgJm1fZmFjZVRhYmxlLCBfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWRwQ2hhbm5lbDo6Q29ubmVjdEZhaWxlZENhbGxiYWNrKCkpOworICAgICAgICAgIG1fZmFjdG9yaWVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigidWRwNiIsIGZhY3RvcnkpKTsKKyAgICAgICAgfQorCisgICAgICBpZiAodXNlTWNhc3QgJiYgZW5hYmxlVjQpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OnZlY3RvcjxOZXR3b3JrSW50ZXJmYWNlSW5mbz4gaXB2NE11bHRpY2FzdEludGVyZmFjZXM7CisgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBuaWMgOiBuaWNMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAobmljLmlzVXAoKSAmJiBuaWMuaXNNdWx0aWNhc3RDYXBhYmxlKCkgJiYgIW5pYy5pcHY0QWRkcmVzc2VzLmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaXB2NE11bHRpY2FzdEludGVyZmFjZXMucHVzaF9iYWNrKG5pYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgYm9vbCBpc05pY05hbWVOZWNlc3NhcnkgPSBmYWxzZTsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICAgICAgICBpZiAoaXB2NE11bHRpY2FzdEludGVyZmFjZXMuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gT24gTGludXggaWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIE11bHRpY2FzdFVkcEZhY2UKKyAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgaXNOaWNOYW1lTmVjZXNzYXJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4gPiBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlOworICAgICAgICAgIGZvciAoVWRwRmFjdG9yeTo6TXVsdGljYXN0RmFjZU1hcDo6Y29uc3RfaXRlcmF0b3IgaSA9CisgICAgICAgICAgICAgICAgIGZhY3RvcnktPmdldE11bHRpY2FzdEZhY2VzKCkuYmVnaW4oKTsKKyAgICAgICAgICAgICAgIGkgIT0gZmFjdG9yeS0+Z2V0TXVsdGljYXN0RmFjZXMoKS5lbmQoKTsKKyAgICAgICAgICAgICAgICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXVsdGljYXN0RmFjZXNUb1JlbW92ZS5wdXNoX2JhY2soaS0+c2Vjb25kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbmljIDogaXB2NE11bHRpY2FzdEludGVyZmFjZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4gbmV3RmFjZTsKKyAgICAgICAgICAgICAgbmV3RmFjZSA9IGZhY3RvcnktPmNyZWF0ZU11bHRpY2FzdEZhY2UobmljLmlwdjRBZGRyZXNzZXNbMF0udG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jYXN0R3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jYXN0UG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOaWNOYW1lTmVjZXNzYXJ5ID8gbmljLm5hbWUgOiAiIik7CisgICAgICAgICAgICAgIGFkZENyZWF0ZWRGYWNlVG9Gb3J3YXJkZXIobmV3RmFjZSk7CisgICAgICAgICAgICAgIG11bHRpY2FzdEZhY2VzVG9SZW1vdmUucmVtb3ZlKG5ld0ZhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlPiA+OjppdGVyYXRvciBpID0KKyAgICAgICAgICAgICAgICAgbXVsdGljYXN0RmFjZXNUb1JlbW92ZS5iZWdpbigpOworICAgICAgICAgICAgICAgaSAhPSBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlLmVuZCgpOworICAgICAgICAgICAgICAgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAoKmkpLT5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlPiA+IG11bHRpY2FzdEZhY2VzVG9SZW1vdmU7CisgICAgICAgICAgZm9yIChVZHBGYWN0b3J5OjpNdWx0aWNhc3RGYWNlTWFwOjpjb25zdF9pdGVyYXRvciBpID0KKyAgICAgICAgICAgICAgICAgZmFjdG9yeS0+Z2V0TXVsdGljYXN0RmFjZXMoKS5iZWdpbigpOworICAgICAgICAgICAgICAgaSAhPSBmYWN0b3J5LT5nZXRNdWx0aWNhc3RGYWNlcygpLmVuZCgpOworICAgICAgICAgICAgICAgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlLnB1c2hfYmFjayhpLT5zZWNvbmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlPiA+OjppdGVyYXRvciBpID0KKyAgICAgICAgICAgICAgICAgbXVsdGljYXN0RmFjZXNUb1JlbW92ZS5iZWdpbigpOworICAgICAgICAgICAgICAgaSAhPSBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlLmVuZCgpOworICAgICAgICAgICAgICAgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAoKmkpLT5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkCitGYWNlTWFuYWdlcjo6cHJvY2Vzc1NlY3Rpb25FdGhlcihjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RyeVJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE5ldHdvcmtJbnRlcmZhY2VJbmZvPiYgbmljTGlzdCkKK3sKKyAgLy8gOyB0aGUgZXRoZXIgc2VjdGlvbiBjb250YWlucyBzZXR0aW5ncyBvZiBFdGhlcm5ldCBmYWNlcyBhbmQgY2hhbm5lbHMKKyAgLy8gZXRoZXIKKyAgLy8geworICAvLyAgIDsgTkZEIGNyZWF0ZXMgb25lIEV0aGVybmV0IG11bHRpY2FzdCBmYWNlIHBlciBOSUMKKyAgLy8gICBtY2FzdCB5ZXMgOyBzZXQgdG8gJ25vJyB0byBkaXNhYmxlIEV0aGVybmV0IG11bHRpY2FzdCwgZGVmYXVsdCAneWVzJworICAvLyAgIG1jYXN0X2dyb3VwIDAxOjAwOjVFOjAwOjE3OkFBIDsgRXRoZXJuZXQgbXVsdGljYXN0IGdyb3VwCisgIC8vIH0KKworI2lmIGRlZmluZWQoSEFWRV9MSUJQQ0FQKQorICBib29sIHVzZU1jYXN0ID0gdHJ1ZTsKKyAgZXRoZXJuZXQ6OkFkZHJlc3MgbWNhc3RHcm91cChldGhlcm5ldDo6Z2V0RGVmYXVsdE11bHRpY2FzdEFkZHJlc3MoKSk7CisKKyAgZm9yIChDb25maWdTZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpID0gY29uZmlnU2VjdGlvbi5iZWdpbigpOworICAgICAgIGkgIT0gY29uZmlnU2VjdGlvbi5lbmQoKTsKKyAgICAgICArK2kpCisgICAgeworICAgICAgaWYgKGktPmZpcnN0ID09ICJtY2FzdCIpCisgICAgICAgIHsKKyAgICAgICAgICB1c2VNY2FzdCA9IHBhcnNlWWVzTm8oaSwgaS0+Zmlyc3QsICJldGhlciIpOworICAgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKGktPmZpcnN0ID09ICJtY2FzdF9ncm91cCIpCisgICAgICAgIHsKKyAgICAgICAgICBtY2FzdEdyb3VwID0gZXRoZXJuZXQ6OkFkZHJlc3M6OmZyb21TdHJpbmcoaS0+c2Vjb25kLmdldF92YWx1ZTxzdGQ6OnN0cmluZz4oKSk7CisgICAgICAgICAgaWYgKG1jYXN0R3JvdXAuaXNOdWxsKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0+Zmlyc3QgKyAiXCIgaW4gXCJldGhlclwiIHNlY3Rpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIlVucmVjb2duaXplZCBvcHRpb24gXCIiICsgaS0+Zmlyc3QgKyAiXCIgaW4gXCJldGhlclwiIHNlY3Rpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWlzRHJ5UnVuKQorICAgIHsKKyAgICAgIHNoYXJlZF9wdHI8RXRoZXJuZXRGYWN0b3J5PiBmYWN0b3J5OworICAgICAgaWYgKG1fZmFjdG9yaWVzLmNvdW50KCJldGhlciIpID4gMCkgeworICAgICAgICBmYWN0b3J5ID0gc3RhdGljX3BvaW50ZXJfY2FzdDxFdGhlcm5ldEZhY3Rvcnk+KG1fZmFjdG9yaWVzWyJldGhlciJdKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBmYWN0b3J5ID0gbWFrZV9zaGFyZWQ8RXRoZXJuZXRGYWN0b3J5PigpOworICAgICAgICBtX2ZhY3Rvcmllcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoImV0aGVyIiwgZmFjdG9yeSkpOworICAgICAgfQorCisgICAgICBpZiAodXNlTWNhc3QpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+ID4gbXVsdGljYXN0RmFjZXNUb1JlbW92ZTsKKyAgICAgICAgICBmb3IgKEV0aGVybmV0RmFjdG9yeTo6TXVsdGljYXN0RmFjZU1hcDo6Y29uc3RfaXRlcmF0b3IgaSA9CisgICAgICAgICAgICAgICAgIGZhY3RvcnktPmdldE11bHRpY2FzdEZhY2VzKCkuYmVnaW4oKTsKKyAgICAgICAgICAgICAgIGkgIT0gZmFjdG9yeS0+Z2V0TXVsdGljYXN0RmFjZXMoKS5lbmQoKTsKKyAgICAgICAgICAgICAgICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXVsdGljYXN0RmFjZXNUb1JlbW92ZS5wdXNoX2JhY2soaS0+c2Vjb25kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbmljIDogbmljTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKG5pYy5pc1VwKCkgJiYgbmljLmlzTXVsdGljYXN0Q2FwYWJsZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+IG5ld0ZhY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS0+Y3JlYXRlTXVsdGljYXN0RmFjZShuaWMsIG1jYXN0R3JvdXApOworCisgICAgICAgICAgICAgICAgICAgICAgYWRkQ3JlYXRlZEZhY2VUb0ZvcndhcmRlcihuZXdGYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlLnJlbW92ZShuZXdGYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgY2F0Y2ggKGNvbnN0IEV0aGVybmV0RmFjdG9yeTo6RXJyb3ImIGZhY3RvcnlFcnJvcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIE5GRF9MT0dfRVJST1IoZmFjdG9yeUVycm9yLndoYXQoKSA8PCAiLCBjb250aW51aW5nIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNhdGNoIChjb25zdCBFdGhlcm5ldEZhY2U6OkVycm9yJiBmYWNlRXJyb3IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBORkRfTE9HX0VSUk9SKGZhY2VFcnJvci53aGF0KCkgPDwgIiwgY29udGludWluZyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+ID46Oml0ZXJhdG9yIGkgPQorICAgICAgICAgICAgICAgICBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlLmJlZ2luKCk7CisgICAgICAgICAgICAgICBpICE9IG11bHRpY2FzdEZhY2VzVG9SZW1vdmUuZW5kKCk7CisgICAgICAgICAgICAgICArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICgqaSktPmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6bGlzdDxzaGFyZWRfcHRyPEV0aGVybmV0RmFjZT4gPiBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlOworICAgICAgICAgIGZvciAoRXRoZXJuZXRGYWN0b3J5OjpNdWx0aWNhc3RGYWNlTWFwOjpjb25zdF9pdGVyYXRvciBpID0KKyAgICAgICAgICAgICAgICAgZmFjdG9yeS0+Z2V0TXVsdGljYXN0RmFjZXMoKS5iZWdpbigpOworICAgICAgICAgICAgICAgaSAhPSBmYWN0b3J5LT5nZXRNdWx0aWNhc3RGYWNlcygpLmVuZCgpOworICAgICAgICAgICAgICAgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlLnB1c2hfYmFjayhpLT5zZWNvbmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+ID46Oml0ZXJhdG9yIGkgPQorICAgICAgICAgICAgICAgICBtdWx0aWNhc3RGYWNlc1RvUmVtb3ZlLmJlZ2luKCk7CisgICAgICAgICAgICAgICBpICE9IG11bHRpY2FzdEZhY2VzVG9SZW1vdmUuZW5kKCk7CisgICAgICAgICAgICAgICArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICgqaSktPmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiTkZEIHdhcyBjb21waWxlZCB3aXRob3V0IGxpYnBjYXAsIGNhbm5vdCBwcm9jZXNzIFwiZXRoZXJcIiBzZWN0aW9uIik7CisjZW5kaWYgLy8gSEFWRV9MSUJQQ0FQCit9CisKK3ZvaWQKK0ZhY2VNYW5hZ2VyOjpwcm9jZXNzU2VjdGlvbldlYlNvY2tldChjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLCBib29sIGlzRHJ5UnVuKQoreworICAvLyA7IHRoZSB3ZWJzb2NrZXQgc2VjdGlvbiBjb250YWlucyBzZXR0aW5ncyBvZiBXZWJTb2NrZXQgZmFjZXMgYW5kIGNoYW5uZWxzCisgIC8vIHdlYnNvY2tldAorICAvLyB7CisgIC8vICAgbGlzdGVuIHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgV2ViU29ja2V0IGxpc3RlbmVyLCBkZWZhdWx0ICd5ZXMnCisgIC8vICAgcG9ydCA5Njk2IDsgV2ViU29ja2V0IGxpc3RlbmVyIHBvcnQgbnVtYmVyCisgIC8vICAgZW5hYmxlX3Y0IHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgbGlzdGVuaW5nIG9uIElQdjQgc29ja2V0LCBkZWZhdWx0ICd5ZXMnCisgIC8vICAgZW5hYmxlX3Y2IHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgbGlzdGVuaW5nIG9uIElQdjYgc29ja2V0LCBkZWZhdWx0ICd5ZXMnCisgIC8vIH0KKworI2lmIGRlZmluZWQoSEFWRV9XRUJTT0NLRVQpCisKKyAgc3RkOjpzdHJpbmcgcG9ydCA9ICI5Njk2IjsKKyAgYm9vbCBuZWVkVG9MaXN0ZW4gPSB0cnVlOworICBib29sIGVuYWJsZVY0ID0gdHJ1ZTsKKyAgYm9vbCBlbmFibGVWNiA9IHRydWU7CisKKyAgZm9yIChDb25maWdTZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpID0gY29uZmlnU2VjdGlvbi5iZWdpbigpOworICAgICAgIGkgIT0gY29uZmlnU2VjdGlvbi5lbmQoKTsKKyAgICAgICArK2kpCisgICAgeworICAgICAgaWYgKGktPmZpcnN0ID09ICJwb3J0IikKKyAgICAgICAgeworICAgICAgICAgIHBvcnQgPSBpLT5zZWNvbmQuZ2V0X3ZhbHVlPHN0ZDo6c3RyaW5nPigpOworICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1aW50MTZfdCBwb3J0Tm8gPSBib29zdDo6bGV4aWNhbF9jYXN0PHVpbnQxNl90Pihwb3J0KTsKKyAgICAgICAgICAgICAgTkZEX0xPR19UUkFDRSgiV2ViU29ja2V0IHBvcnQgc2V0IHRvICIgPDwgcG9ydE5vKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfY2FzdCYgZXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktPmZpcnN0ICsgIlwiIGluIFwid2Vic29ja2V0XCIgc2VjdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAibGlzdGVuIikKKyAgICAgICAgeworICAgICAgICAgIG5lZWRUb0xpc3RlbiA9IHBhcnNlWWVzTm8oaSwgaS0+Zmlyc3QsICJ3ZWJzb2NrZXQiKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaS0+Zmlyc3QgPT0gImVuYWJsZV92NCIpCisgICAgICAgIHsKKyAgICAgICAgICBlbmFibGVWNCA9IHBhcnNlWWVzTm8oaSwgaS0+Zmlyc3QsICJ3ZWJzb2NrZXQiKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaS0+Zmlyc3QgPT0gImVuYWJsZV92NiIpCisgICAgICAgIHsKKyAgICAgICAgICBlbmFibGVWNiA9IHBhcnNlWWVzTm8oaSwgaS0+Zmlyc3QsICJ3ZWJzb2NrZXQiKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIlVucmVjb2duaXplZCBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLT5maXJzdCArICJcIiBpbiBcIndlYnNvY2tldFwiIHNlY3Rpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWVuYWJsZVY0ICYmICFlbmFibGVWNikKKyAgICB7CisgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiSVB2NCBhbmQgSVB2NiBjaGFubmVscyBoYXZlIGJlZW4gZGlzYWJsZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZW1vdmUgXCJ3ZWJzb2NrZXRcIiBzZWN0aW9uIHRvIGRpc2FibGUgV2ViU29ja2V0IGNoYW5uZWxzIG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZS1lbmFibGUgYXQgbGVhc3Qgb25lIGNoYW5uZWwgdHlwZS4iKTsKKyAgICB9CisKKyAgaWYgKCFlbmFibGVWNCAmJiBlbmFibGVWNikKKyAgICB7CisgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiTkZEIGRvZXMgbm90IGFsbG93IHB1cmUgSVB2NiBXZWJTb2NrZXQgY2hhbm5lbC4iKTsKKyAgICB9CisKKyAgaWYgKCFpc0RyeVJ1bikKKyAgICB7CisgICAgICBpZiAobV9mYWN0b3JpZXMuY291bnQoIndlYnNvY2tldCIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBzaGFyZWRfcHRyPFdlYlNvY2tldEZhY3Rvcnk+IGZhY3RvcnkgPSBtYWtlX3NoYXJlZDxXZWJTb2NrZXRGYWN0b3J5Pihwb3J0KTsKKyAgICAgIG1fZmFjdG9yaWVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigid2Vic29ja2V0IiwgZmFjdG9yeSkpOworCisgICAgICBpZiAoZW5hYmxlVjYgJiYgZW5hYmxlVjQpCisgICAgICAgIHsKKyAgICAgICAgICBzaGFyZWRfcHRyPFdlYlNvY2tldENoYW5uZWw+IGlwNDZDaGFubmVsID0gZmFjdG9yeS0+Y3JlYXRlQ2hhbm5lbCgiOjoiLCBwb3J0KTsKKyAgICAgICAgICBpZiAobmVlZFRvTGlzdGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpcDQ2Q2hhbm5lbC0+bGlzdGVuKGJpbmQoJkZhY2VUYWJsZTo6YWRkLCAmbV9mYWNlVGFibGUsIF8xKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBtX2ZhY3Rvcmllcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoIndlYnNvY2tldDQ2IiwgZmFjdG9yeSkpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChlbmFibGVWNCkKKyAgICAgICAgeworICAgICAgICAgIHNoYXJlZF9wdHI8V2ViU29ja2V0Q2hhbm5lbD4gaXB2NENoYW5uZWwgPSBmYWN0b3J5LT5jcmVhdGVDaGFubmVsKCIwLjAuMC4wIiwgcG9ydCk7CisgICAgICAgICAgaWYgKG5lZWRUb0xpc3RlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaXB2NENoYW5uZWwtPmxpc3RlbihiaW5kKCZGYWNlVGFibGU6OmFkZCwgJm1fZmFjZVRhYmxlLCBfMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbV9mYWN0b3JpZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCJ3ZWJzb2NrZXQ0IiwgZmFjdG9yeSkpOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIk5GRCB3YXMgY29tcGlsZWQgd2l0aG91dCBXZWJTb2NrZXQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwcm9jZXNzIFwid2Vic29ja2V0XCIgc2VjdGlvbiIpOworI2VuZGlmIC8vIEhBVkVfV0VCU09DS0VUCit9CisKKwordm9pZAorRmFjZU1hbmFnZXI6Om9uRmFjZVJlcXVlc3QoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpCit7CisgIGNvbnN0IE5hbWUmIGNvbW1hbmQgPSByZXF1ZXN0LmdldE5hbWUoKTsKKyAgY29uc3Qgc2l6ZV90IGNvbW1hbmROQ29tcHMgPSBjb21tYW5kLnNpemUoKTsKKworICBpZiAoY29tbWFuZE5Db21wcyA8PSBDT01NQU5EX1BSRUZJWC5zaXplKCkpCisgICAgeworICAgICAgLy8gY29tbWFuZCBpcyB0b28gc2hvcnQgdG8gaGF2ZSBhIHZlcmIKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBtYWxmb3JtZWQiKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjb25zdCBOYW1lOjpDb21wb25lbnQmIHZlcmIgPSBjb21tYW5kLmF0KENPTU1BTkRfUFJFRklYLnNpemUoKSk7CisKKyAgY29uc3QgYXV0byB1bnNpZ25lZFZlcmJQcm9jZXNzb3IgPSBtX3Vuc2lnbmVkVmVyYkRpc3BhdGNoLmZpbmQodmVyYik7CisgIGlmICh1bnNpZ25lZFZlcmJQcm9jZXNzb3IgIT0gbV91bnNpZ25lZFZlcmJEaXNwYXRjaC5lbmQoKSkKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogcHJvY2Vzc2luZyB2ZXJiOiAiIDw8IHZlcmIpOworICAgICAgKHVuc2lnbmVkVmVyYlByb2Nlc3Nvci0+c2Vjb25kKSh0aGlzLCByZXF1ZXN0KTsKKyAgICB9CisgIGVsc2UgaWYgKENPTU1BTkRfVU5TSUdORURfTkNPTVBTIDw9IGNvbW1hbmROQ29tcHMgJiYKKyAgICAgICAgICAgY29tbWFuZE5Db21wcyA8IENPTU1BTkRfU0lHTkVEX05DT01QUykKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogdW5zaWduZWQgdmVyYjogIiA8PCBjb21tYW5kKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDEsICJTaWduYXR1cmUgcmVxdWlyZWQiKTsKKyAgICB9CisgIGVsc2UgaWYgKGNvbW1hbmROQ29tcHMgPCBDT01NQU5EX1NJR05FRF9OQ09NUFMgfHwKKyAgICAgICAgICAgIUNPTU1BTkRfUFJFRklYLmlzUHJlZml4T2YoY29tbWFuZCkpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IG1hbGZvcm1lZCIpOworICAgICAgc2VuZFJlc3BvbnNlKGNvbW1hbmQsIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmFsaWRhdGUocmVxdWVzdCwKKyAgICAgICAgICAgICAgIGJpbmQoJkZhY2VNYW5hZ2VyOjpvblZhbGlkYXRlZEZhY2VSZXF1ZXN0LCB0aGlzLCBfMSksCisgICAgICAgICAgICAgICBiaW5kKCZNYW5hZ2VyQmFzZTo6b25Db21tYW5kVmFsaWRhdGlvbkZhaWxlZCwgdGhpcywgXzEsIF8yKSk7CisgICAgfQorfQorCit2b2lkCitGYWNlTWFuYWdlcjo6b25WYWxpZGF0ZWRGYWNlUmVxdWVzdChjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCkKK3sKKyAgY29uc3QgTmFtZSYgY29tbWFuZCA9IHJlcXVlc3QtPmdldE5hbWUoKTsKKyAgY29uc3QgTmFtZTo6Q29tcG9uZW50JiB2ZXJiID0gY29tbWFuZFtDT01NQU5EX1BSRUZJWC5zaXplKCldOworICBjb25zdCBOYW1lOjpDb21wb25lbnQmIHBhcmFtZXRlckNvbXBvbmVudCA9IGNvbW1hbmRbQ09NTUFORF9QUkVGSVguc2l6ZSgpICsgMV07CisKKyAgU2lnbmVkVmVyYkRpc3BhdGNoVGFibGU6OmNvbnN0X2l0ZXJhdG9yIHNpZ25lZFZlcmJQcm9jZXNzb3IgPSBtX3NpZ25lZFZlcmJEaXNwYXRjaC5maW5kKHZlcmIpOworICBpZiAoc2lnbmVkVmVyYlByb2Nlc3NvciAhPSBtX3NpZ25lZFZlcmJEaXNwYXRjaC5lbmQoKSkKKyAgICB7CisgICAgICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgICAgaWYgKCFleHRyYWN0UGFyYW1ldGVycyhwYXJhbWV0ZXJDb21wb25lbnQsIHBhcmFtZXRlcnMpKQorICAgICAgICB7CisgICAgICAgICAgc2VuZFJlc3BvbnNlKGNvbW1hbmQsIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBwcm9jZXNzaW5nIHZlcmI6ICIgPDwgdmVyYik7CisgICAgICAoc2lnbmVkVmVyYlByb2Nlc3Nvci0+c2Vjb25kKSh0aGlzLCAqcmVxdWVzdCwgcGFyYW1ldGVycyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IHVuc3VwcG9ydGVkIHZlcmI6ICIgPDwgdmVyYik7CisgICAgICBzZW5kUmVzcG9uc2UoY29tbWFuZCwgNTAxLCAiVW5zdXBwb3J0ZWQgY29tbWFuZCIpOworICAgIH0KKworfQorCit2b2lkCitGYWNlTWFuYWdlcjo6YWRkQ3JlYXRlZEZhY2VUb0ZvcndhcmRlcihjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBuZXdGYWNlKQoreworICBtX2ZhY2VUYWJsZS5hZGQobmV3RmFjZSk7CisKKyAgLy9ORkRfTE9HX0RFQlVHKCJDcmVhdGVkIGZhY2UgIiA8PCBuZXdGYWNlLT5nZXRSZW1vdGVVcmkoKSA8PCAiIElEICIgPDwgbmV3RmFjZS0+Z2V0SWQoKSk7Cit9CisKK3ZvaWQKK0ZhY2VNYW5hZ2VyOjpvbkNyZWF0ZWQoY29uc3QgTmFtZSYgcmVxdWVzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBuZXdGYWNlKQoreworICBhZGRDcmVhdGVkRmFjZVRvRm9yd2FyZGVyKG5ld0ZhY2UpOworICBwYXJhbWV0ZXJzLnNldEZhY2VJZChuZXdGYWNlLT5nZXRJZCgpKTsKKyAgcGFyYW1ldGVycy5zZXRVcmkobmV3RmFjZS0+Z2V0UmVtb3RlVXJpKCkudG9TdHJpbmcoKSk7CisKKyAgc2VuZFJlc3BvbnNlKHJlcXVlc3ROYW1lLCAyMDAsICJTdWNjZXNzIiwgcGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworfQorCit2b2lkCitGYWNlTWFuYWdlcjo6b25Db25uZWN0RmFpbGVkKGNvbnN0IE5hbWUmIHJlcXVlc3ROYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQoreworICBORkRfTE9HX0RFQlVHKCJGYWlsZWQgdG8gY3JlYXRlIGZhY2U6ICIgPDwgcmVhc29uKTsKKyAgc2VuZFJlc3BvbnNlKHJlcXVlc3ROYW1lLCA0MDgsIHJlYXNvbik7Cit9CisKK3ZvaWQKK0ZhY2VNYW5hZ2VyOjpjcmVhdGVGYWNlKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpCit7CisgIGNvbnN0IE5hbWUmIHJlcXVlc3ROYW1lID0gcmVxdWVzdC5nZXROYW1lKCk7CisgIG5kbjo6bmZkOjpGYWNlQ3JlYXRlQ29tbWFuZCBjb21tYW5kOworCisgIGlmICghdmFsaWRhdGVQYXJhbWV0ZXJzKGNvbW1hbmQsIHBhcmFtZXRlcnMpKQorICAgIHsKKyAgICAgIHNlbmRSZXNwb25zZShyZXF1ZXN0TmFtZSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIE5GRF9MT0dfVFJBQ0UoImludmFsaWQgY29udHJvbCBwYXJhbWV0ZXJzIFVSSSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBGYWNlVXJpIHVyaTsKKyAgaWYgKCF1cmkucGFyc2UocGFyYW1ldGVycy5nZXRVcmkoKSkpCisgICAgeworICAgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3ROYW1lLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgTkZEX0xPR19UUkFDRSgiZmFpbGVkIHRvIHBhcnNlIFVSSSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIXVyaS5pc0Nhbm9uaWNhbCgpKQorICAgIHsKKyAgICAgIHNlbmRSZXNwb25zZShyZXF1ZXN0TmFtZSwgNDAwLCAiTm9uLWNhbm9uaWNhbCBVUkkiKTsKKyAgICAgIE5GRF9MT0dfVFJBQ0UoInJlY2VpdmVkIG5vbi1jYW5vbmljYWwgVVJJIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIEZhY3RvcnlNYXA6Oml0ZXJhdG9yIGZhY3RvcnkgPSBtX2ZhY3Rvcmllcy5maW5kKHVyaS5nZXRTY2hlbWUoKSk7CisgIGlmIChmYWN0b3J5ID09IG1fZmFjdG9yaWVzLmVuZCgpKQorICAgIHsKKyAgICAgIHNlbmRSZXNwb25zZShyZXF1ZXN0TmFtZSwgNTAxLCAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdHJ5CisgICAgeworICAgICAgZmFjdG9yeS0+c2Vjb25kLT5jcmVhdGVGYWNlKHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlTWFuYWdlcjo6b25DcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcmVxdWVzdE5hbWUsIHBhcmFtZXRlcnMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlTWFuYWdlcjo6b25Db25uZWN0RmFpbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcmVxdWVzdE5hbWUsIF8xKSk7CisgICAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpydW50aW1lX2Vycm9yJiBlcnJvcikKKyAgICB7CisgICAgICBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2UgPSAiTkZEIGVycm9yOiAiOworICAgICAgZXJyb3JNZXNzYWdlICs9IGVycm9yLndoYXQoKTsKKworICAgICAgTkZEX0xPR19FUlJPUihlcnJvck1lc3NhZ2UpOworICAgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3ROYW1lLCA1MDAsIGVycm9yTWVzc2FnZSk7CisgICAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpsb2dpY19lcnJvciYgZXJyb3IpCisgICAgeworICAgICAgc3RkOjpzdHJpbmcgZXJyb3JNZXNzYWdlID0gIk5GRCBlcnJvcjogIjsKKyAgICAgIGVycm9yTWVzc2FnZSArPSBlcnJvci53aGF0KCk7CisKKyAgICAgIE5GRF9MT0dfRVJST1IoZXJyb3JNZXNzYWdlKTsKKyAgICAgIHNlbmRSZXNwb25zZShyZXF1ZXN0TmFtZSwgNTAwLCBlcnJvck1lc3NhZ2UpOworICAgIH0KK30KKworCit2b2lkCitGYWNlTWFuYWdlcjo6ZGVzdHJveUZhY2UoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpCit7CisgIGNvbnN0IE5hbWUmIHJlcXVlc3ROYW1lID0gcmVxdWVzdC5nZXROYW1lKCk7CisgIG5kbjo6bmZkOjpGYWNlRGVzdHJveUNvbW1hbmQgY29tbWFuZDsKKworICBpZiAoIXZhbGlkYXRlUGFyYW1ldGVycyhjb21tYW5kLCBwYXJhbWV0ZXJzKSkKKyAgICB7CisgICAgICBzZW5kUmVzcG9uc2UocmVxdWVzdE5hbWUsIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNoYXJlZF9wdHI8RmFjZT4gdGFyZ2V0ID0gbV9mYWNlVGFibGUuZ2V0KHBhcmFtZXRlcnMuZ2V0RmFjZUlkKCkpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4odGFyZ2V0KSkKKyAgICB7CisgICAgICB0YXJnZXQtPmNsb3NlKCk7CisgICAgfQorCisgIHNlbmRSZXNwb25zZShyZXF1ZXN0TmFtZSwgMjAwLCAiU3VjY2VzcyIsIHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworfQorCit2b2lkCitGYWNlTWFuYWdlcjo6b25BZGRGYWNlKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSkKK3sKKyAgbmRuOjpuZmQ6OkZhY2VFdmVudE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb247CisgIG5vdGlmaWNhdGlvbi5zZXRLaW5kKG5kbjo6bmZkOjpGQUNFX0VWRU5UX0NSRUFURUQpOworICBmYWNlLT5jb3B5U3RhdHVzVG8obm90aWZpY2F0aW9uKTsKKworICBtX25vdGlmaWNhdGlvblN0cmVhbS5wb3N0Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7Cit9CisKK3ZvaWQKK0ZhY2VNYW5hZ2VyOjpvblJlbW92ZUZhY2Uoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKQoreworICBuZG46Om5mZDo6RmFjZUV2ZW50Tm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbjsKKyAgbm90aWZpY2F0aW9uLnNldEtpbmQobmRuOjpuZmQ6OkZBQ0VfRVZFTlRfREVTVFJPWUVEKTsKKyAgZmFjZS0+Y29weVN0YXR1c1RvKG5vdGlmaWNhdGlvbik7CisKKyAgbV9ub3RpZmljYXRpb25TdHJlYW0ucG9zdE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworfQorCitib29sCitGYWNlTWFuYWdlcjo6ZXh0cmFjdExvY2FsQ29udHJvbFBhcmFtZXRlcnMoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbENvbW1hbmQmIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxMb2NhbEZhY2U+JiBvdXRGYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsQ29udHJvbEZlYXR1cmUmIG91dEZlYXR1cmUpCit7CisgIGlmICghdmFsaWRhdGVQYXJhbWV0ZXJzKGNvbW1hbmQsIHBhcmFtZXRlcnMpKQorICAgIHsKKyAgICAgIHNlbmRSZXNwb25zZShyZXF1ZXN0LmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlID0gbV9mYWNlVGFibGUuZ2V0KHJlcXVlc3QuZ2V0SW5jb21pbmdGYWNlSWQoKSk7CisKKyAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihmYWNlKSkKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogZmFjZWlkICIgPDwgcmVxdWVzdC5nZXRJbmNvbWluZ0ZhY2VJZCgpIDw8ICIgbm90IGZvdW5kIik7CisgICAgICBzZW5kUmVzcG9uc2UocmVxdWVzdC5nZXROYW1lKCksIDQxMCwgIkZhY2Ugbm90IGZvdW5kIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmICghZmFjZS0+aXNMb2NhbCgpKQorICAgIHsKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBjYW5ub3QgZW5hYmxlIGxvY2FsIGNvbnRyb2wgb24gbm9uLWxvY2FsIGZhY2VpZCAiIDw8CisgICAgICAgICAgICAgICAgICAgIGZhY2UtPmdldElkKCkpOworICAgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QuZ2V0TmFtZSgpLCA0MTIsICJGYWNlIGlzIG5vbi1sb2NhbCIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBvdXRGYWNlID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8TG9jYWxGYWNlPihmYWNlKTsKKyAgb3V0RmVhdHVyZSA9IHN0YXRpY19jYXN0PExvY2FsQ29udHJvbEZlYXR1cmU+KHBhcmFtZXRlcnMuZ2V0TG9jYWxDb250cm9sRmVhdHVyZSgpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorRmFjZU1hbmFnZXI6OmVuYWJsZUxvY2FsQ29udHJvbChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpCit7CisgIG5kbjo6bmZkOjpGYWNlRW5hYmxlTG9jYWxDb250cm9sQ29tbWFuZCBjb21tYW5kOworCisKKyAgc2hhcmVkX3B0cjxMb2NhbEZhY2U+IGZhY2U7CisgIExvY2FsQ29udHJvbEZlYXR1cmUgZmVhdHVyZTsKKworICBpZiAoZXh0cmFjdExvY2FsQ29udHJvbFBhcmFtZXRlcnMocmVxdWVzdCwgcGFyYW1ldGVycywgY29tbWFuZCwgZmFjZSwgZmVhdHVyZSkpCisgICAgeworICAgICAgZmFjZS0+c2V0TG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZShmZWF0dXJlLCB0cnVlKTsKKyAgICAgIHNlbmRSZXNwb25zZShyZXF1ZXN0LmdldE5hbWUoKSwgMjAwLCAiU3VjY2VzcyIsIHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKyAgICB9Cit9CisKK3ZvaWQKK0ZhY2VNYW5hZ2VyOjpkaXNhYmxlTG9jYWxDb250cm9sKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpCit7CisgIG5kbjo6bmZkOjpGYWNlRGlzYWJsZUxvY2FsQ29udHJvbENvbW1hbmQgY29tbWFuZDsKKyAgc2hhcmVkX3B0cjxMb2NhbEZhY2U+IGZhY2U7CisgIExvY2FsQ29udHJvbEZlYXR1cmUgZmVhdHVyZTsKKworICBpZiAoZXh0cmFjdExvY2FsQ29udHJvbFBhcmFtZXRlcnMocmVxdWVzdCwgcGFyYW1ldGVycywgY29tbWFuZCwgZmFjZSwgZmVhdHVyZSkpCisgICAgeworICAgICAgZmFjZS0+c2V0TG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZShmZWF0dXJlLCBmYWxzZSk7CisgICAgICBzZW5kUmVzcG9uc2UocmVxdWVzdC5nZXROYW1lKCksIDIwMCwgIlN1Y2Nlc3MiLCBwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisgICAgfQorfQorCit2b2lkCitGYWNlTWFuYWdlcjo6bGlzdEZhY2VzKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KQoreworICBjb25zdCBOYW1lJiBjb21tYW5kID0gcmVxdWVzdC5nZXROYW1lKCk7CisgIGNvbnN0IHNpemVfdCBjb21tYW5kTkNvbXBzID0gY29tbWFuZC5zaXplKCk7CisKKyAgaWYgKGNvbW1hbmROQ29tcHMgPCBGQUNFU19MSVNUX0RBVEFTRVRfTkNPTVBTIHx8CisgICAgICAhRkFDRVNfTElTVF9EQVRBU0VUX1BSRUZJWC5pc1ByZWZpeE9mKGNvbW1hbmQpKQorICAgIHsKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBtYWxmb3JtZWQiKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtX2ZhY2VTdGF0dXNQdWJsaXNoZXIucHVibGlzaCgpOworfQorCit2b2lkCitGYWNlTWFuYWdlcjo6bGlzdENoYW5uZWxzKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KQoreworICBORkRfTE9HX0RFQlVHKCJpbiBsaXN0Q2hhbm5lbHMiKTsKKyAgY29uc3QgTmFtZSYgY29tbWFuZCA9IHJlcXVlc3QuZ2V0TmFtZSgpOworICBjb25zdCBzaXplX3QgY29tbWFuZE5Db21wcyA9IGNvbW1hbmQuc2l6ZSgpOworCisgIGlmIChjb21tYW5kTkNvbXBzIDwgQ0hBTk5FTFNfTElTVF9EQVRBU0VUX05DT01QUyB8fAorICAgICAgIUNIQU5ORUxTX0xJU1RfREFUQVNFVF9QUkVGSVguaXNQcmVmaXhPZihjb21tYW5kKSkKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogbWFsZm9ybWVkIik7CisgICAgICBzZW5kUmVzcG9uc2UoY29tbWFuZCwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgTkZEX0xPR19ERUJVRygicHVibGlzaGluZyIpOworICBtX2NoYW5uZWxTdGF0dXNQdWJsaXNoZXIucHVibGlzaCgpOworfQorCit2b2lkCitGYWNlTWFuYWdlcjo6bGlzdFF1ZXJpZWRGYWNlcyhjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCkKK3sKKyAgTkZEX0xPR19ERUJVRygiaW4gbGlzdFF1ZXJpZWRGYWNlcyIpOworICBjb25zdCBOYW1lJiBxdWVyeSA9IHJlcXVlc3QuZ2V0TmFtZSgpOworICBjb25zdCBzaXplX3QgcXVlcnlOQ29tcHMgPSBxdWVyeS5zaXplKCk7CisKKyAgaWYgKHF1ZXJ5TkNvbXBzIDwgRkFDRVNfUVVFUllfREFUQVNFVF9OQ09NUFMgfHwKKyAgICAgICFGQUNFU19RVUVSWV9EQVRBU0VUX1BSRUZJWC5pc1ByZWZpeE9mKHF1ZXJ5KSkKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJxdWVyeSByZXN1bHQ6IG1hbGZvcm1lZCIpOworICAgICAgc2VuZE5hY2socXVlcnkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBuZG46Om5mZDo6RmFjZVF1ZXJ5RmlsdGVyIGZhY2VGaWx0ZXI7CisgIHRyeQorICAgIHsKKyAgICAgIGZhY2VGaWx0ZXIud2lyZURlY29kZShxdWVyeVstMV0uYmxvY2tGcm9tVmFsdWUoKSk7CisgICAgfQorICBjYXRjaCAodGx2OjpFcnJvciYpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygicXVlcnkgcmVzdWx0OiBtYWxmb3JtZWQgZmlsdGVyIik7CisgICAgICBzZW5kTmFjayhxdWVyeSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIEZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlcgorICAgIGZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlcihtX2ZhY2VUYWJsZSwgKm1fZmFjZSwgcXVlcnksIGZhY2VGaWx0ZXIsIG1fa2V5Q2hhaW4pOworCisgIGZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlci5wdWJsaXNoKCk7Cit9CisKK3NoYXJlZF9wdHI8UHJvdG9jb2xGYWN0b3J5PgorRmFjZU1hbmFnZXI6OmZpbmRGYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b2NvbCkKK3sKKyAgRmFjdG9yeU1hcDo6aXRlcmF0b3IgZmFjdG9yeSA9IG1fZmFjdG9yaWVzLmZpbmQocHJvdG9jb2wpOworICBpZiAoZmFjdG9yeSAhPSBtX2ZhY3Rvcmllcy5lbmQoKSkKKyAgICByZXR1cm4gZmFjdG9yeS0+c2Vjb25kOworICBlbHNlCisgICAgcmV0dXJuIHNoYXJlZF9wdHI8UHJvdG9jb2xGYWN0b3J5PigpOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9mYWNlLW1hbmFnZXIuaHBwIGIvTkZEL2RhZW1vbi9tZ210L2ZhY2UtbWFuYWdlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0NzdiZgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9mYWNlLW1hbmFnZXIuaHBwCkBAIC0wLDAgKzEsMjUwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fTUdNVF9GQUNFX01BTkFHRVJfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fTUdNVF9GQUNFX01BTkFHRVJfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgImNvcmUvbm90aWZpY2F0aW9uLXN0cmVhbS5ocHAiCisjaW5jbHVkZSAiZmFjZS9sb2NhbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJtZ210L21hbmFnZXItYmFzZS5ocHAiCisjaW5jbHVkZSAibWdtdC9mYWNlLXN0YXR1cy1wdWJsaXNoZXIuaHBwIgorI2luY2x1ZGUgIm1nbXQvY2hhbm5lbC1zdGF0dXMtcHVibGlzaGVyLmhwcCIKKyNpbmNsdWRlICJtZ210L2ZhY2UtcXVlcnktc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisKKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWNvbnRyb2wtcGFyYW1ldGVycy5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sLXJlc3BvbnNlLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK2NvbnN0IHN0ZDo6c3RyaW5nIEZBQ0VfTUFOQUdFUl9QUklWSUxFR0UgPSAiZmFjZXMiOworCitjbGFzcyBDb25maWdGaWxlOworY2xhc3MgRmFjZTsKK2NsYXNzIEZhY2VUYWJsZTsKK2NsYXNzIExvY2FsRmFjZTsKK2NsYXNzIE5ldHdvcmtJbnRlcmZhY2VJbmZvOworY2xhc3MgUHJvdG9jb2xGYWN0b3J5OworCitjbGFzcyBGYWNlTWFuYWdlciA6IHB1YmxpYyBNYW5hZ2VyQmFzZQoreworcHVibGljOgorICBjbGFzcyBFcnJvciA6IHB1YmxpYyBNYW5hZ2VyQmFzZTo6RXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpIDogTWFuYWdlckJhc2U6OkVycm9yKHdoYXQpIHt9CisgIH07CisKKyAgLyoqCisgICAqIFx0aHJvd3MgRmFjZU1hbmFnZXI6OkVycm9yIGlmIGxvY2FsUG9ydCBpcyBhbiBpbnZhbGlkIHBvcnQgbnVtYmVyCisgICAqLworICBGYWNlTWFuYWdlcihGYWNlVGFibGUmIGZhY2VUYWJsZSwKKyAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UsCisgICAgICAgICAgICAgIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKTsKKworICB2aXJ0dWFsCisgIH5GYWNlTWFuYWdlcigpOworCisgIC8qKiBcYnJpZWYgU3Vic2NyaWJlIHRvIGEgZmFjZSBtYW5hZ2VtZW50IHNlY3Rpb24ocykgZm9yIHRoZSBjb25maWcgZmlsZQorICAgKi8KKyAgdm9pZAorICBzZXRDb25maWdGaWxlKENvbmZpZ0ZpbGUmIGNvbmZpZ0ZpbGUpOworCisgIHZvaWQKKyAgb25GYWNlUmVxdWVzdChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCk7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKyAgdm9pZAorICBsaXN0RmFjZXMoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpOworCisgIHZvaWQKKyAgbGlzdENoYW5uZWxzKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KTsKKworICB2b2lkCisgIGxpc3RRdWVyaWVkRmFjZXMoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpOworCisgIHNoYXJlZF9wdHI8UHJvdG9jb2xGYWN0b3J5PgorICBmaW5kRmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG9jb2wpOworCitQUk9URUNURURfV0lUSF9URVNUU19FTFNFX1BSSVZBVEU6CisgIHZvaWQKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCk7CisKKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgY3JlYXRlRmFjZShjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycyk7CisKKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgZGVzdHJveUZhY2UoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKTsKKworICBWSVJUVUFMX1dJVEhfVEVTVFMgYm9vbAorICBleHRyYWN0TG9jYWxDb250cm9sUGFyYW1ldGVycyhjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xDb21tYW5kJiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPExvY2FsRmFjZT4mIG91dEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsQ29udHJvbEZlYXR1cmUmIG91dEZlYXR1cmUpOworCisgIFZJUlRVQUxfV0lUSF9URVNUUyB2b2lkCisgIGVuYWJsZUxvY2FsQ29udHJvbChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWJldGVycyk7CisKKyAgVklSVFVBTF9XSVRIX1RFU1RTIHZvaWQKKyAgZGlzYWJsZUxvY2FsQ29udHJvbChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycyk7CisKKyAgdm9pZAorICBpZ25vcmVVbnNpZ25lZFZlcmIoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpOworCisgIHZvaWQKKyAgYWRkQ3JlYXRlZEZhY2VUb0ZvcndhcmRlcihjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBuZXdGYWNlKTsKKworICB2b2lkCisgIG9uQ3JlYXRlZChjb25zdCBOYW1lJiByZXF1ZXN0TmFtZSwKKyAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgbmV3RmFjZSk7CisKKyAgdm9pZAorICBvbkNvbm5lY3RGYWlsZWQoY29uc3QgTmFtZSYgcmVxdWVzdE5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pOworCisgIHZvaWQKKyAgb25BZGRGYWNlKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSk7CisKKyAgdm9pZAorICBvblJlbW92ZUZhY2Uoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKTsKKworcHJpdmF0ZToKKyAgdm9pZAorICBvbkNvbmZpZyhjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLCBib29sIGlzRHJ5UnVuLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCisgIHZvaWQKKyAgcHJvY2Vzc1NlY3Rpb25Vbml4KGNvbnN0IENvbmZpZ1NlY3Rpb24mIGNvbmZpZ1NlY3Rpb24sIGJvb2wgaXNEcnlSdW4pOworCisgIHZvaWQKKyAgcHJvY2Vzc1NlY3Rpb25UY3AoY29uc3QgQ29uZmlnU2VjdGlvbiYgY29uZmlnU2VjdGlvbiwgYm9vbCBpc0RyeVJ1bik7CisKKyAgdm9pZAorICBwcm9jZXNzU2VjdGlvblVkcChjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzRHJ5UnVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOZXR3b3JrSW50ZXJmYWNlSW5mbz4mIG5pY0xpc3QpOworCisgIHZvaWQKKyAgcHJvY2Vzc1NlY3Rpb25FdGhlcihjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmV0d29ya0ludGVyZmFjZUluZm8+JiBuaWNMaXN0KTsKKworICB2b2lkCisgIHByb2Nlc3NTZWN0aW9uV2ViU29ja2V0KGNvbnN0IENvbmZpZ1NlY3Rpb24mIGNvbmZpZ1NlY3Rpb24sIGJvb2wgaXNEcnlSdW4pOworCisgIC8qKiBcYnJpZWYgcGFyc2UgYSBjb25maWcgb3B0aW9uIHRoYXQgY2FuIGJlIGVpdGhlciAieWVzIiBvciAibm8iCisgICAqICBcdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IgdmFsdWUgaXMgbmVpdGhlciAieWVzIiBub3IgIm5vIgorICAgKiAgXHJldHVybiB0cnVlIGlmICJ5ZXMiLCBmYWxzZSBpZiAibm8iCisgICAqLworICBib29sCisgIHBhcnNlWWVzTm8oY29uc3QgQ29uZmlnU2VjdGlvbjo6Y29uc3RfaXRlcmF0b3ImIGksCisgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbk5hbWUsCisgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lKTsKKworUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFOgorICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLypwcm90b2NvbCovLCBzaGFyZWRfcHRyPFByb3RvY29sRmFjdG9yeT4+IEZhY3RvcnlNYXA7CisgIEZhY3RvcnlNYXAgbV9mYWN0b3JpZXM7CisKK3ByaXZhdGU6CisgIEZhY2VUYWJsZSYgbV9mYWNlVGFibGU7CisgIHNpZ25hbDo6U2NvcGVkQ29ubmVjdGlvbiBtX2ZhY2VBZGRDb25uOworICBzaWduYWw6OlNjb3BlZENvbm5lY3Rpb24gbV9mYWNlUmVtb3ZlQ29ubjsKKyAgRmFjZVN0YXR1c1B1Ymxpc2hlciBtX2ZhY2VTdGF0dXNQdWJsaXNoZXI7CisgIENoYW5uZWxTdGF0dXNQdWJsaXNoZXIgbV9jaGFubmVsU3RhdHVzUHVibGlzaGVyOworICBOb3RpZmljYXRpb25TdHJlYW08QXBwRmFjZT4gbV9ub3RpZmljYXRpb25TdHJlYW07CisKKyAgdHlwZWRlZiBmdW5jdGlvbjx2b2lkKEZhY2VNYW5hZ2VyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZXN0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJik+IFNpZ25lZFZlcmJQcm9jZXNzb3I7CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxOYW1lOjpDb21wb25lbnQsIFNpZ25lZFZlcmJQcm9jZXNzb3I+IFNpZ25lZFZlcmJEaXNwYXRjaFRhYmxlOworICB0eXBlZGVmIHN0ZDo6cGFpcjxOYW1lOjpDb21wb25lbnQsIFNpZ25lZFZlcmJQcm9jZXNzb3I+IFNpZ25lZFZlcmJBbmRQcm9jZXNzb3I7CisKKyAgdHlwZWRlZiBmdW5jdGlvbjx2b2lkKEZhY2VNYW5hZ2VyKiwgY29uc3QgSW50ZXJlc3QmKT4gVW5zaWduZWRWZXJiUHJvY2Vzc29yOworCisgIHR5cGVkZWYgc3RkOjptYXA8TmFtZTo6Q29tcG9uZW50LCBVbnNpZ25lZFZlcmJQcm9jZXNzb3I+IFVuc2lnbmVkVmVyYkRpc3BhdGNoVGFibGU7CisgIHR5cGVkZWYgc3RkOjpwYWlyPE5hbWU6OkNvbXBvbmVudCwgVW5zaWduZWRWZXJiUHJvY2Vzc29yPiBVbnNpZ25lZFZlcmJBbmRQcm9jZXNzb3I7CisKKyAgY29uc3QgU2lnbmVkVmVyYkRpc3BhdGNoVGFibGUgbV9zaWduZWRWZXJiRGlzcGF0Y2g7CisgIGNvbnN0IFVuc2lnbmVkVmVyYkRpc3BhdGNoVGFibGUgbV91bnNpZ25lZFZlcmJEaXNwYXRjaDsKKworICBzdGF0aWMgY29uc3QgTmFtZSBDT01NQU5EX1BSRUZJWDsgLy8gL2xvY2FsaG9zdC9uZmQvZmFjZXMKKworICAvLyBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhbiBpbnZhbGlkIHNpZ25lZCBjb21tYW5kIChpLmUuIHNob3VsZCBiZSBzaWduZWQsIGJ1dCBpc24ndCkKKyAgLy8gKC9sb2NhbGhvc3QvbmZkL2ZhY2VzICsgdmVyYiArIHBhcmFtZXRlcnMpID0gNQorICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTU1BTkRfVU5TSUdORURfTkNPTVBTOworCisgIC8vIG51bWJlciBvZiBjb21wb25lbnRzIGluIGEgdmFsaWQgc2lnbmVkIGNvbW1hbmQuCisgIC8vIChzZWUgVU5TSUdORURfTkNPTVBTKSwgOSB3aXRoIHNpZ25lZCBJbnRlcmVzdCBzdXBwb3J0LgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTU1BTkRfU0lHTkVEX05DT01QUzsKKworICBzdGF0aWMgY29uc3QgU2lnbmVkVmVyYkFuZFByb2Nlc3NvciBTSUdORURfQ09NTUFORF9WRVJCU1tdOworICBzdGF0aWMgY29uc3QgVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yIFVOU0lHTkVEX0NPTU1BTkRfVkVSQlNbXTsKKworICBzdGF0aWMgY29uc3QgTmFtZSBGQUNFU19MSVNUX0RBVEFTRVRfUFJFRklYOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZBQ0VTX0xJU1RfREFUQVNFVF9OQ09NUFM7CisKKyAgc3RhdGljIGNvbnN0IE5hbWUgQ0hBTk5FTFNfTElTVF9EQVRBU0VUX1BSRUZJWDsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBDSEFOTkVMU19MSVNUX0RBVEFTRVRfTkNPTVBTOworCisgIHN0YXRpYyBjb25zdCBOYW1lIEZBQ0VTX1FVRVJZX0RBVEFTRVRfUFJFRklYOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZBQ0VTX1FVRVJZX0RBVEFTRVRfTkNPTVBTOworCisgIHN0YXRpYyBjb25zdCBOYW1lIEZBQ0VfRVZFTlRTX1BSRUZJWDsKK307CisKK2lubGluZSBib29sCitGYWNlTWFuYWdlcjo6cGFyc2VZZXNObyhjb25zdCBDb25maWdTZWN0aW9uOjpjb25zdF9pdGVyYXRvciYgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lKQoreworICBjb25zdCBzdGQ6OnN0cmluZyB2YWx1ZSA9IGktPnNlY29uZC5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCk7CisgIGlmICh2YWx1ZSA9PSAieWVzIikKKyAgICB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHZhbHVlID09ICJubyIpCisgICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk5hbWUgKyAiXCIgaW4gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbk5hbWUgKyAiXCIgc2VjdGlvbiIpOworfQorCitpbmxpbmUgdm9pZAorRmFjZU1hbmFnZXI6Omlnbm9yZVVuc2lnbmVkVmVyYihjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCkKK3sKKyAgLy8gZG8gbm90aGluZworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fTUdNVF9GQUNFX01BTkFHRVJfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL21nbXQvZmFjZS1xdWVyeS1zdGF0dXMtcHVibGlzaGVyLmNwcCBiL05GRC9kYWVtb24vbWdtdC9mYWNlLXF1ZXJ5LXN0YXR1cy1wdWJsaXNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDgwODcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvZmFjZS1xdWVyeS1zdGF0dXMtcHVibGlzaGVyLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJmYWNlLXF1ZXJ5LXN0YXR1cy1wdWJsaXNoZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hZGFwdG9yL3JldmVyc2VkLmhwcD4KKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmFjZS1zdGF0dXMuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJGYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIiKTsKKworCitGYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXI6OkZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlcihjb25zdCBGYWNlVGFibGUmIGZhY2VUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46Om5mZDo6RmFjZVF1ZXJ5RmlsdGVyJiBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbikKKyAgOiBTZWdtZW50UHVibGlzaGVyKGZhY2UsIHByZWZpeCwga2V5Q2hhaW4pCisgICwgbV9mYWNlVGFibGUoZmFjZVRhYmxlKQorICAsIG1fZmFjZUZpbHRlcihmaWx0ZXIpCit7Cit9CisKK0ZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlcjo6fkZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlcigpCit7Cit9CisKK2Jvb2wKK0ZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlcjo6ZG9lc01hdGNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIGZhY2UpCit7CisgIGlmIChtX2ZhY2VGaWx0ZXIuaGFzRmFjZUlkKCkgJiYKKyAgICAgIG1fZmFjZUZpbHRlci5nZXRGYWNlSWQoKSAhPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZmFjZS0+Z2V0SWQoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAobV9mYWNlRmlsdGVyLmhhc1VyaVNjaGVtZSgpICYmCisgICAgICAobV9mYWNlRmlsdGVyLmdldFVyaVNjaGVtZSgpICE9IGZhY2UtPmdldFJlbW90ZVVyaSgpLmdldFNjaGVtZSgpIHx8CisgICAgICAgbV9mYWNlRmlsdGVyLmdldFVyaVNjaGVtZSgpICE9IGZhY2UtPmdldExvY2FsVXJpKCkuZ2V0U2NoZW1lKCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG1fZmFjZUZpbHRlci5oYXNSZW1vdGVVcmkoKSAmJgorICAgICAgbV9mYWNlRmlsdGVyLmdldFJlbW90ZVVyaSgpICE9IGZhY2UtPmdldFJlbW90ZVVyaSgpLnRvU3RyaW5nKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAobV9mYWNlRmlsdGVyLmhhc0xvY2FsVXJpKCkgJiYgbV9mYWNlRmlsdGVyLmdldExvY2FsVXJpKCkgIT0gZmFjZS0+Z2V0TG9jYWxVcmkoKS50b1N0cmluZygpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG1fZmFjZUZpbHRlci5oYXNGYWNlU2NvcGUoKSAmJgorICAgICAgKG1fZmFjZUZpbHRlci5nZXRGYWNlU2NvcGUoKSA9PSBuZG46Om5mZDo6RkFDRV9TQ09QRV9MT0NBTCkgIT0gZmFjZS0+aXNMb2NhbCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG1fZmFjZUZpbHRlci5oYXNGYWNlUGVyc2lzdGVuY3koKSAmJgorICAgICAgKG1fZmFjZUZpbHRlci5nZXRGYWNlUGVyc2lzdGVuY3koKSA9PSBuZG46Om5mZDo6RkFDRV9QRVJTSVNURU5DWV9PTl9ERU1BTkQpICE9CisgICAgICBmYWNlLT5pc09uRGVtYW5kKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAobV9mYWNlRmlsdGVyLmhhc0xpbmtUeXBlKCkgJiYKKyAgICAgIChtX2ZhY2VGaWx0ZXIuZ2V0TGlua1R5cGUoKSA9PSBuZG46Om5mZDo6TElOS19UWVBFX01VTFRJX0FDQ0VTUykgIT0gZmFjZS0+aXNNdWx0aUFjY2VzcygpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3NpemVfdAorRmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyOjpnZW5lcmF0ZShuZG46OkVuY29kaW5nQnVmZmVyJiBvdXRCdWZmZXIpCit7CisgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisKKyAgZm9yIChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBmYWNlIDogbV9mYWNlVGFibGUgfCBib29zdDo6YWRhcHRvcnM6OnJldmVyc2VkKSB7CisgICAgaWYgKGRvZXNNYXRjaEZpbHRlcihmYWNlKSkgeworICAgICAgbmRuOjpuZmQ6OkZhY2VTdGF0dXMgc3RhdHVzID0gZmFjZS0+Z2V0RmFjZVN0YXR1cygpOworICAgICAgdG90YWxMZW5ndGggKz0gc3RhdHVzLndpcmVFbmNvZGUob3V0QnVmZmVyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRvdGFsTGVuZ3RoOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9mYWNlLXF1ZXJ5LXN0YXR1cy1wdWJsaXNoZXIuaHBwIGIvTkZEL2RhZW1vbi9tZ210L2ZhY2UtcXVlcnktc3RhdHVzLXB1Ymxpc2hlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3Y2VjYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9mYWNlLXF1ZXJ5LXN0YXR1cy1wdWJsaXNoZXIuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9NR01UX1FVRVJJRURfRkFDRV9TVEFUVVNfUFVCTElTSEVSX0hQUAorI2RlZmluZSBORkRfREFFTU9OX01HTVRfUVVFUklFRF9GQUNFX1NUQVRVU19QVUJMSVNIRVJfSFBQCisKKyNpbmNsdWRlICJjb3JlL3NlZ21lbnQtcHVibGlzaGVyLmhwcCIKKyNpbmNsdWRlICJtZ210L2FwcC1mYWNlLmhwcCIKKyNpbmNsdWRlICJmdy9mYWNlLXRhYmxlLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmFjZS1xdWVyeS1maWx0ZXIuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgRmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyIDogcHVibGljIFNlZ21lbnRQdWJsaXNoZXI8QXBwRmFjZT4KK3sKK3B1YmxpYzoKKyAgRmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyKGNvbnN0IEZhY2VUYWJsZSYgZmFjZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwRmFjZSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpGYWNlUXVlcnlGaWx0ZXImIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKTsKKworICB2aXJ0dWFsCisgIH5GYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIoKTsKKworICBib29sCisgIGRvZXNNYXRjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBmYWNlKTsKKworcHJvdGVjdGVkOgorCisgIHZpcnR1YWwgc2l6ZV90CisgIGdlbmVyYXRlKG5kbjo6RW5jb2RpbmdCdWZmZXImIG91dEJ1ZmZlcik7CisKK3ByaXZhdGU6CisgIGNvbnN0IEZhY2VUYWJsZSYgbV9mYWNlVGFibGU7CisgIGNvbnN0IG5kbjo6bmZkOjpGYWNlUXVlcnlGaWx0ZXImIG1fZmFjZUZpbHRlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9NR01UX1FVRVJJRURfRkFDRV9TVEFUVVNfUFVCTElTSEVSX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9tZ210L2ZhY2Utc3RhdHVzLXB1Ymxpc2hlci5jcHAgYi9ORkQvZGFlbW9uL21nbXQvZmFjZS1zdGF0dXMtcHVibGlzaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTlmOWNlCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L2ZhY2Utc3RhdHVzLXB1Ymxpc2hlci5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImZhY2Utc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImZ3L2ZhY2UtdGFibGUuaHBwIgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FkYXB0b3IvcmV2ZXJzZWQuaHBwPgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1mYWNlLXN0YXR1cy5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworCitORkRfTE9HX0lOSVQoIkZhY2VTdGF0dXNQdWJsaXNoZXIiKTsKKworCitGYWNlU3RhdHVzUHVibGlzaGVyOjpGYWNlU3RhdHVzUHVibGlzaGVyKGNvbnN0IEZhY2VUYWJsZSYgZmFjZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBGYWNlJiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKQorICA6IFNlZ21lbnRQdWJsaXNoZXIoZmFjZSwgcHJlZml4LCBrZXlDaGFpbikKKyAgLCBtX2ZhY2VUYWJsZShmYWNlVGFibGUpCit7CisKK30KKworCitGYWNlU3RhdHVzUHVibGlzaGVyOjp+RmFjZVN0YXR1c1B1Ymxpc2hlcigpCit7CisKK30KKworc2l6ZV90CitGYWNlU3RhdHVzUHVibGlzaGVyOjpnZW5lcmF0ZShuZG46OkVuY29kaW5nQnVmZmVyJiBvdXRCdWZmZXIpCit7CisgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisKKyAgZm9yIChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBmYWNlIDogbV9mYWNlVGFibGUgfCBib29zdDo6YWRhcHRvcnM6OnJldmVyc2VkKSB7CisgICAgbmRuOjpuZmQ6OkZhY2VTdGF0dXMgc3RhdHVzID0gZmFjZS0+Z2V0RmFjZVN0YXR1cygpOworICAgIHRvdGFsTGVuZ3RoICs9IHN0YXR1cy53aXJlRW5jb2RlKG91dEJ1ZmZlcik7CisgIH0KKyAgcmV0dXJuIHRvdGFsTGVuZ3RoOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9mYWNlLXN0YXR1cy1wdWJsaXNoZXIuaHBwIGIvTkZEL2RhZW1vbi9tZ210L2ZhY2Utc3RhdHVzLXB1Ymxpc2hlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5MTE2NQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9mYWNlLXN0YXR1cy1wdWJsaXNoZXIuaHBwCkBAIC0wLDAgKzEsNTggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9NR01UX0ZBQ0VfU1RBVFVTX1BVQkxJU0hFUl9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9NR01UX0ZBQ0VfU1RBVFVTX1BVQkxJU0hFUl9IUFAKKworI2luY2x1ZGUgImNvcmUvc2VnbWVudC1wdWJsaXNoZXIuaHBwIgorI2luY2x1ZGUgIm1nbXQvYXBwLWZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgRmFjZVRhYmxlOworCitjbGFzcyBGYWNlU3RhdHVzUHVibGlzaGVyIDogcHVibGljIFNlZ21lbnRQdWJsaXNoZXI8QXBwRmFjZT4KK3sKK3B1YmxpYzoKKyAgRmFjZVN0YXR1c1B1Ymxpc2hlcihjb25zdCBGYWNlVGFibGUmIGZhY2VUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBBcHBGYWNlJiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbik7CisKKyAgdmlydHVhbAorICB+RmFjZVN0YXR1c1B1Ymxpc2hlcigpOworCitwcm90ZWN0ZWQ6CisKKyAgdmlydHVhbCBzaXplX3QKKyAgZ2VuZXJhdGUobmRuOjpFbmNvZGluZ0J1ZmZlciYgb3V0QnVmZmVyKTsKKworcHJpdmF0ZToKKyAgY29uc3QgRmFjZVRhYmxlJiBtX2ZhY2VUYWJsZTsKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9NR01UX0ZBQ0VfU1RBVFVTX1BVQkxJU0hFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9maWItZW51bWVyYXRpb24tcHVibGlzaGVyLmNwcCBiL05GRC9kYWVtb24vbWdtdC9maWItZW51bWVyYXRpb24tcHVibGlzaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2JhZDUxCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L2ZpYi1lbnVtZXJhdGlvbi1wdWJsaXNoZXIuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJmaWItZW51bWVyYXRpb24tcHVibGlzaGVyLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisjaW5jbHVkZSAidGFibGUvZmliLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmliLWVudHJ5LmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiRmliRW51bWVyYXRpb25QdWJsaXNoZXIiKTsKKworRmliRW51bWVyYXRpb25QdWJsaXNoZXI6OkZpYkVudW1lcmF0aW9uUHVibGlzaGVyKGNvbnN0IEZpYiYgZmliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZSYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKQorICA6IFNlZ21lbnRQdWJsaXNoZXIoZmFjZSwgcHJlZml4LCBrZXlDaGFpbikKKyAgLCBtX2ZpYihmaWIpCit7Cit9CisKK0ZpYkVudW1lcmF0aW9uUHVibGlzaGVyOjp+RmliRW51bWVyYXRpb25QdWJsaXNoZXIoKQoreworfQorCitzaXplX3QKK0ZpYkVudW1lcmF0aW9uUHVibGlzaGVyOjpnZW5lcmF0ZShuZG46OkVuY29kaW5nQnVmZmVyJiBvdXRCdWZmZXIpCit7CisgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisKKyAgLy8vIFx0b2RvIEVuYWJsZSB1c2Ugb2YgRmliOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICh3aGVuIGl0IGlzIGF2YWlsYWJsZSkKKyAgZm9yIChGaWI6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2ZpYi5iZWdpbigpOyBpICE9IG1fZmliLmVuZCgpOyArK2kpCisgICAgeworICAgICAgY29uc3QgZmliOjpFbnRyeSYgZW50cnkgPSAqaTsKKyAgICAgIGNvbnN0IE5hbWUmIHByZWZpeCA9IGVudHJ5LmdldFByZWZpeCgpOworICAgICAgc2l6ZV90IGZpYkVudHJ5TGVuZ3RoID0gMDsKKworICAgICAgbmRuOjpuZmQ6OkZpYkVudHJ5IHRsdkVudHJ5OworICAgICAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dEhvcHMgPSBlbnRyeS5nZXROZXh0SG9wcygpOworCisgICAgICBmb3IgKGZpYjo6TmV4dEhvcExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGogPSBuZXh0SG9wcy5iZWdpbigpOworICAgICAgICAgICBqICE9IG5leHRIb3BzLmVuZCgpOworICAgICAgICAgICArK2opCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBmaWI6Ok5leHRIb3AmIG5leHQgPSAqajsKKyAgICAgICAgICBuZG46Om5mZDo6TmV4dEhvcFJlY29yZCBuZXh0SG9wUmVjb3JkOworICAgICAgICAgIG5leHRIb3BSZWNvcmQuc2V0RmFjZUlkKG5leHQuZ2V0RmFjZSgpLT5nZXRJZCgpKTsKKyAgICAgICAgICBuZXh0SG9wUmVjb3JkLnNldENvc3QobmV4dC5nZXRDb3N0KCkpOworCisgICAgICAgICAgdGx2RW50cnkuYWRkTmV4dEhvcFJlY29yZChuZXh0SG9wUmVjb3JkKTsKKyAgICAgICAgfQorCisgICAgICB0bHZFbnRyeS5zZXRQcmVmaXgocHJlZml4KTsKKyAgICAgIGZpYkVudHJ5TGVuZ3RoICs9IHRsdkVudHJ5LndpcmVFbmNvZGUob3V0QnVmZmVyKTsKKworICAgICAgTkZEX0xPR19ERUJVRygiZ2VuZXJhdGU6IGZpYiBlbnRyeSBsZW5ndGggPSAiIDw8IGZpYkVudHJ5TGVuZ3RoKTsKKworICAgICAgdG90YWxMZW5ndGggKz0gZmliRW50cnlMZW5ndGg7CisgICAgfQorICBORkRfTE9HX0RFQlVHKCJnZW5lcmF0ZTogVG90YWwgbGVuZ3RoID0gIiA8PCB0b3RhbExlbmd0aCk7CisgIHJldHVybiB0b3RhbExlbmd0aDsKK30KKworCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9maWItZW51bWVyYXRpb24tcHVibGlzaGVyLmhwcCBiL05GRC9kYWVtb24vbWdtdC9maWItZW51bWVyYXRpb24tcHVibGlzaGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmY1YzMxCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L2ZpYi1lbnVtZXJhdGlvbi1wdWJsaXNoZXIuaHBwCkBAIC0wLDAgKzEsNTggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9NR01UX0ZJQl9FTlVNRVJBVElPTl9QVUJMSVNIRVJfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fTUdNVF9GSUJfRU5VTUVSQVRJT05fUFVCTElTSEVSX0hQUAorCisjaW5jbHVkZSAiY29yZS9zZWdtZW50LXB1Ymxpc2hlci5ocHAiCisjaW5jbHVkZSAibWdtdC9hcHAtZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBGaWI7CisKK2NsYXNzIEZpYkVudW1lcmF0aW9uUHVibGlzaGVyIDogcHVibGljIFNlZ21lbnRQdWJsaXNoZXI8QXBwRmFjZT4KK3sKK3B1YmxpYzoKKyAgRmliRW51bWVyYXRpb25QdWJsaXNoZXIoY29uc3QgRmliJiBmaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpLZXlDaGFpbiYga2V5Q2hhaW4pOworCisgIHZpcnR1YWwKKyAgfkZpYkVudW1lcmF0aW9uUHVibGlzaGVyKCk7CisKK3Byb3RlY3RlZDoKKworICB2aXJ0dWFsIHNpemVfdAorICBnZW5lcmF0ZShuZG46OkVuY29kaW5nQnVmZmVyJiBvdXRCdWZmZXIpOworCitwcml2YXRlOgorICBjb25zdCBGaWImIG1fZmliOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX01HTVRfRklCX0VOVU1FUkFUSU9OX1BVQkxJU0hFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9maWItbWFuYWdlci5jcHAgYi9ORkQvZGFlbW9uL21nbXQvZmliLW1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYjI2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvZmliLW1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjg0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZmliLW1hbmFnZXIuaHBwIgorCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgInRhYmxlL2ZpYi5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJtZ210L2ludGVybmFsLWZhY2UuaHBwIgorI2luY2x1ZGUgIm1nbXQvYXBwLWZhY2UuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9lbmNvZGluZy90bHYuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJGaWJNYW5hZ2VyIik7CisKK2NvbnN0IE5hbWUgRmliTWFuYWdlcjo6Q09NTUFORF9QUkVGSVggPSAiL2xvY2FsaG9zdC9uZmQvZmliIjsKKworY29uc3Qgc2l6ZV90IEZpYk1hbmFnZXI6OkNPTU1BTkRfVU5TSUdORURfTkNPTVBTID0KKyAgRmliTWFuYWdlcjo6Q09NTUFORF9QUkVGSVguc2l6ZSgpICsKKyAgMSArIC8vIHZlcmIKKyAgMTsgIC8vIHZlcmIgcGFyYW1ldGVycworCitjb25zdCBzaXplX3QgRmliTWFuYWdlcjo6Q09NTUFORF9TSUdORURfTkNPTVBTID0KKyAgRmliTWFuYWdlcjo6Q09NTUFORF9VTlNJR05FRF9OQ09NUFMgKworICA0OyAvLyAodGltZXN0YW1wLCBub25jZSwgc2lnbmVkIGluZm8gdGx2LCBzaWduYXR1cmUgdGx2KQorCitjb25zdCBGaWJNYW5hZ2VyOjpTaWduZWRWZXJiQW5kUHJvY2Vzc29yIEZpYk1hbmFnZXI6OlNJR05FRF9DT01NQU5EX1ZFUkJTW10gPQorICB7CisKKyAgICBTaWduZWRWZXJiQW5kUHJvY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZTo6Q29tcG9uZW50KCJhZGQtbmV4dGhvcCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZpYk1hbmFnZXI6OmFkZE5leHRIb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisKKyAgICBTaWduZWRWZXJiQW5kUHJvY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZTo6Q29tcG9uZW50KCJyZW1vdmUtbmV4dGhvcCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZpYk1hbmFnZXI6OnJlbW92ZU5leHRIb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisKKyAgfTsKKworY29uc3QgRmliTWFuYWdlcjo6VW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yIEZpYk1hbmFnZXI6OlVOU0lHTkVEX0NPTU1BTkRfVkVSQlNbXSA9CisgIHsKKyAgICBVbnNpZ25lZFZlcmJBbmRQcm9jZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgibGlzdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRmliTWFuYWdlcjo6bGlzdEVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgfTsKKworY29uc3QgTmFtZSBGaWJNYW5hZ2VyOjpMSVNUX0NPTU1BTkRfUFJFRklYKCIvbG9jYWxob3N0L25mZC9maWIvbGlzdCIpOworY29uc3Qgc2l6ZV90IEZpYk1hbmFnZXI6OkxJU1RfQ09NTUFORF9OQ09NUFMgPSBMSVNUX0NPTU1BTkRfUFJFRklYLnNpemUoKTsKKworCitGaWJNYW5hZ2VyOjpGaWJNYW5hZ2VyKEZpYiYgZmliLAorICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjxzaGFyZWRfcHRyPEZhY2U+KEZhY2VJZCk+IGdldEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbikKKyAgOiBNYW5hZ2VyQmFzZShmYWNlLCBGSUJfUFJJVklMRUdFLCBrZXlDaGFpbikKKyAgLCBtX21hbmFnZWRGaWIoZmliKQorICAsIG1fZ2V0RmFjZShnZXRGYWNlKQorICAsIG1fZmliRW51bWVyYXRpb25QdWJsaXNoZXIoZmliLCAqZmFjZSwgTElTVF9DT01NQU5EX1BSRUZJWCwga2V5Q2hhaW4pCisgICwgbV9zaWduZWRWZXJiRGlzcGF0Y2goU0lHTkVEX0NPTU1BTkRfVkVSQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkVEX0NPTU1BTkRfVkVSQlMgKworICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoU0lHTkVEX0NPTU1BTkRfVkVSQlMpIC8gc2l6ZW9mKFNpZ25lZFZlcmJBbmRQcm9jZXNzb3IpKSkKKyAgLCBtX3Vuc2lnbmVkVmVyYkRpc3BhdGNoKFVOU0lHTkVEX0NPTU1BTkRfVkVSQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlNJR05FRF9DT01NQU5EX1ZFUkJTICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoVU5TSUdORURfQ09NTUFORF9WRVJCUykgLyBzaXplb2YoVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yKSkpCit7CisgIGZhY2UtPnNldEludGVyZXN0RmlsdGVyKCIvbG9jYWxob3N0L25mZC9maWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGaWJNYW5hZ2VyOjpvbkZpYlJlcXVlc3QsIHRoaXMsIF8yKSk7Cit9CisKK0ZpYk1hbmFnZXI6On5GaWJNYW5hZ2VyKCkKK3sKKworfQorCit2b2lkCitGaWJNYW5hZ2VyOjpvbkZpYlJlcXVlc3QoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpCit7CisgIGNvbnN0IE5hbWUmIGNvbW1hbmQgPSByZXF1ZXN0LmdldE5hbWUoKTsKKyAgY29uc3Qgc2l6ZV90IGNvbW1hbmROQ29tcHMgPSBjb21tYW5kLnNpemUoKTsKKworICBpZiAoY29tbWFuZE5Db21wcyA8PSBDT01NQU5EX1BSRUZJWC5zaXplKCkpCisgICAgeworICAgICAgLy8gY29tbWFuZCBpcyB0b28gc2hvcnQgdG8gaGF2ZSBhIHZlcmIKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBtYWxmb3JtZWQiKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjb25zdCBOYW1lOjpDb21wb25lbnQmIHZlcmIgPSBjb21tYW5kLmF0KENPTU1BTkRfUFJFRklYLnNpemUoKSk7CisKKyAgY29uc3QgYXV0byB1bnNpZ25lZFZlcmJQcm9jZXNzb3IgPSBtX3Vuc2lnbmVkVmVyYkRpc3BhdGNoLmZpbmQodmVyYik7CisgIGlmICh1bnNpZ25lZFZlcmJQcm9jZXNzb3IgIT0gbV91bnNpZ25lZFZlcmJEaXNwYXRjaC5lbmQoKSkKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogcHJvY2Vzc2luZyB2ZXJiOiAiIDw8IHZlcmIpOworICAgICAgKHVuc2lnbmVkVmVyYlByb2Nlc3Nvci0+c2Vjb25kKSh0aGlzLCByZXF1ZXN0KTsKKyAgICB9CisgIGVsc2UgaWYgKENPTU1BTkRfVU5TSUdORURfTkNPTVBTIDw9IGNvbW1hbmROQ29tcHMgJiYKKyAgICAgICAgICAgY29tbWFuZE5Db21wcyA8IENPTU1BTkRfU0lHTkVEX05DT01QUykKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogdW5zaWduZWQgdmVyYjogIiA8PCBjb21tYW5kKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDEsICJTaWduYXR1cmUgcmVxdWlyZWQiKTsKKyAgICB9CisgIGVsc2UgaWYgKGNvbW1hbmROQ29tcHMgPCBDT01NQU5EX1NJR05FRF9OQ09NUFMgfHwKKyAgICAgICAgICAgIUNPTU1BTkRfUFJFRklYLmlzUHJlZml4T2YoY29tbWFuZCkpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IG1hbGZvcm1lZCIpOworICAgICAgc2VuZFJlc3BvbnNlKGNvbW1hbmQsIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmFsaWRhdGUocmVxdWVzdCwKKyAgICAgICAgICAgICAgIGJpbmQoJkZpYk1hbmFnZXI6Om9uVmFsaWRhdGVkRmliUmVxdWVzdCwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgYmluZCgmTWFuYWdlckJhc2U6Om9uQ29tbWFuZFZhbGlkYXRpb25GYWlsZWQsIHRoaXMsIF8xLCBfMikpOworICAgIH0KK30KKwordm9pZAorRmliTWFuYWdlcjo6b25WYWxpZGF0ZWRGaWJSZXF1ZXN0KGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0KQoreworICBjb25zdCBOYW1lJiBjb21tYW5kID0gcmVxdWVzdC0+Z2V0TmFtZSgpOworICBjb25zdCBOYW1lOjpDb21wb25lbnQmIHZlcmIgPSBjb21tYW5kW0NPTU1BTkRfUFJFRklYLnNpemUoKV07CisgIGNvbnN0IE5hbWU6OkNvbXBvbmVudCYgcGFyYW1ldGVyQ29tcG9uZW50ID0gY29tbWFuZFtDT01NQU5EX1BSRUZJWC5zaXplKCkgKyAxXTsKKworICBTaWduZWRWZXJiRGlzcGF0Y2hUYWJsZTo6Y29uc3RfaXRlcmF0b3IgdmVyYlByb2Nlc3NvciA9IG1fc2lnbmVkVmVyYkRpc3BhdGNoLmZpbmQodmVyYik7CisgIGlmICh2ZXJiUHJvY2Vzc29yICE9IG1fc2lnbmVkVmVyYkRpc3BhdGNoLmVuZCgpKQorICAgIHsKKyAgICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgICAgICBpZiAoIWV4dHJhY3RQYXJhbWV0ZXJzKHBhcmFtZXRlckNvbXBvbmVudCwgcGFyYW1ldGVycykpCisgICAgICAgIHsKKyAgICAgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogbWFsZm9ybWVkIHZlcmI6ICIgPDwgdmVyYik7CisgICAgICAgICAgc2VuZFJlc3BvbnNlKGNvbW1hbmQsIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGJvb2wgaXNTZWxmUmVnaXN0cmF0aW9uID0gKCFwYXJhbWV0ZXJzLmhhc0ZhY2VJZCgpIHx8IHBhcmFtZXRlcnMuZ2V0RmFjZUlkKCkgPT0gMCk7CisgICAgICBpZiAoaXNTZWxmUmVnaXN0cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcGFyYW1ldGVycy5zZXRGYWNlSWQocmVxdWVzdC0+Z2V0SW5jb21pbmdGYWNlSWQoKSk7CisgICAgICAgIH0KKworICAgICAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IHByb2Nlc3NpbmcgdmVyYjogIiA8PCB2ZXJiKTsKKyAgICAgIENvbnRyb2xSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICh2ZXJiUHJvY2Vzc29yLT5zZWNvbmQpKHRoaXMsIHBhcmFtZXRlcnMsIHJlc3BvbnNlKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCByZXNwb25zZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IHVuc3VwcG9ydGVkIHZlcmI6ICIgPDwgdmVyYik7CisgICAgICBzZW5kUmVzcG9uc2UoY29tbWFuZCwgNTAxLCAiVW5zdXBwb3J0ZWQgY29tbWFuZCIpOworICAgIH0KK30KKwordm9pZAorRmliTWFuYWdlcjo6YWRkTmV4dEhvcChDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFJlc3BvbnNlJiByZXNwb25zZSkKK3sKKyAgbmRuOjpuZmQ6OkZpYkFkZE5leHRIb3BDb21tYW5kIGNvbW1hbmQ7CisKKyAgaWYgKCF2YWxpZGF0ZVBhcmFtZXRlcnMoY29tbWFuZCwgcGFyYW1ldGVycykpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiYWRkLW5leHRob3AgcmVzdWx0OiBGQUlMIHJlYXNvbjogbWFsZm9ybWVkIik7CisgICAgICBzZXRSZXNwb25zZShyZXNwb25zZSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29uc3QgTmFtZSYgcHJlZml4ID0gcGFyYW1ldGVycy5nZXROYW1lKCk7CisgIEZhY2VJZCBmYWNlSWQgPSBwYXJhbWV0ZXJzLmdldEZhY2VJZCgpOworICB1aW50NjRfdCBjb3N0ID0gcGFyYW1ldGVycy5nZXRDb3N0KCk7CisKKyAgTkZEX0xPR19UUkFDRSgiYWRkLW5leHRob3AgcHJlZml4OiAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgIDw8ICIgZmFjZWlkOiAiIDw8IGZhY2VJZAorICAgICAgICAgICAgICAgIDw8ICIgY29zdDogIiA8PCBjb3N0KTsKKworICBzaGFyZWRfcHRyPEZhY2U+IG5leHRIb3BGYWNlID0gbV9nZXRGYWNlKGZhY2VJZCk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihuZXh0SG9wRmFjZSkpCisgICAgeworICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBlbnRyeSA9IG1fbWFuYWdlZEZpYi5pbnNlcnQocHJlZml4KS5maXJzdDsKKworICAgICAgZW50cnktPmFkZE5leHRIb3AobmV4dEhvcEZhY2UsIGNvc3QpOworCisgICAgICBORkRfTE9HX0RFQlVHKCJhZGQtbmV4dGhvcCByZXN1bHQ6IE9LIgorICAgICAgICAgICAgICAgICAgICA8PCAiIHByZWZpeDoiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgICA8PCAiIGZhY2VpZDogIiA8PCBmYWNlSWQKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBjb3N0OiAiIDw8IGNvc3QpOworCisgICAgICBzZXRSZXNwb25zZShyZXNwb25zZSwgMjAwLCAiU3VjY2VzcyIsIHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJhZGQtbmV4dGhvcCByZXN1bHQ6IEZBSUwgcmVhc29uOiB1bmtub3duLWZhY2VpZDogIiA8PCBmYWNlSWQpOworICAgICAgc2V0UmVzcG9uc2UocmVzcG9uc2UsIDQxMCwgIkZhY2Ugbm90IGZvdW5kIik7CisgICAgfQorfQorCit2b2lkCitGaWJNYW5hZ2VyOjpyZW1vdmVOZXh0SG9wKENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICBuZG46Om5mZDo6RmliUmVtb3ZlTmV4dEhvcENvbW1hbmQgY29tbWFuZDsKKyAgaWYgKCF2YWxpZGF0ZVBhcmFtZXRlcnMoY29tbWFuZCwgcGFyYW1ldGVycykpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygicmVtb3ZlLW5leHRob3AgcmVzdWx0OiBGQUlMIHJlYXNvbjogbWFsZm9ybWVkIik7CisgICAgICBzZXRSZXNwb25zZShyZXNwb25zZSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgTkZEX0xPR19UUkFDRSgicmVtb3ZlLW5leHRob3AgcHJlZml4OiAiIDw8IHBhcmFtZXRlcnMuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIiBmYWNlaWQ6ICIgPDwgcGFyYW1ldGVycy5nZXRGYWNlSWQoKSk7CisKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlVG9SZW1vdmUgPSBtX2dldEZhY2UocGFyYW1ldGVycy5nZXRGYWNlSWQoKSk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihmYWNlVG9SZW1vdmUpKQorICAgIHsKKyAgICAgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZW50cnkgPSBtX21hbmFnZWRGaWIuZmluZEV4YWN0TWF0Y2gocGFyYW1ldGVycy5nZXROYW1lKCkpOworICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5LT5yZW1vdmVOZXh0SG9wKGZhY2VUb1JlbW92ZSk7CisgICAgICAgICAgTkZEX0xPR19ERUJVRygicmVtb3ZlLW5leHRob3AgcmVzdWx0OiBPSyBwcmVmaXg6ICIgPDwgcGFyYW1ldGVycy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFjZWlkOiAiIDw8IHBhcmFtZXRlcnMuZ2V0RmFjZUlkKCkpOworCisgICAgICAgICAgaWYgKCFlbnRyeS0+aGFzTmV4dEhvcHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbV9tYW5hZ2VkRmliLmVyYXNlKCplbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIE5GRF9MT0dfREVCVUcoInJlbW92ZS1uZXh0aG9wIHJlc3VsdDogT0ssIGJ1dCBlbnRyeSBmb3IgZmFjZSBpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbWV0ZXJzLmdldEZhY2VJZCgpIDw8ICIgbm90IGZvdW5kIik7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJyZW1vdmUtbmV4dGhvcCByZXN1bHQ6IE9LLCBidXQgZmFjZSBpZCAiCisgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtZXRlcnMuZ2V0RmFjZUlkKCkgPDwgIiBub3QgZm91bmQiKTsKKyAgICB9CisKKyAgc2V0UmVzcG9uc2UocmVzcG9uc2UsIDIwMCwgIlN1Y2Nlc3MiLCBwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7Cit9CisKK3ZvaWQKK0ZpYk1hbmFnZXI6Omxpc3RFbnRyaWVzKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KQoreworICBjb25zdCBOYW1lJiBjb21tYW5kID0gcmVxdWVzdC5nZXROYW1lKCk7CisgIGNvbnN0IHNpemVfdCBjb21tYW5kTkNvbXBzID0gY29tbWFuZC5zaXplKCk7CisKKyAgaWYgKGNvbW1hbmROQ29tcHMgPCBMSVNUX0NPTU1BTkRfTkNPTVBTIHx8CisgICAgICAhTElTVF9DT01NQU5EX1BSRUZJWC5pc1ByZWZpeE9mKGNvbW1hbmQpKQorICAgIHsKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBtYWxmb3JtZWQiKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtX2ZpYkVudW1lcmF0aW9uUHVibGlzaGVyLnB1Ymxpc2goKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL21nbXQvZmliLW1hbmFnZXIuaHBwIGIvTkZEL2RhZW1vbi9tZ210L2ZpYi1tYW5hZ2VyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGMyMWVhCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L2ZpYi1tYW5hZ2VyLmhwcApAQCAtMCwwICsxLDExNCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX01HTVRfRklCX01BTkFHRVJfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fTUdNVF9GSUJfTUFOQUdFUl9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisjaW5jbHVkZSAibWdtdC9tYW5hZ2VyLWJhc2UuaHBwIgorI2luY2x1ZGUgIm1nbXQvZmliLWVudW1lcmF0aW9uLXB1Ymxpc2hlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBGYWNlOworY2xhc3MgRm9yd2FyZGVyOworY2xhc3MgRmliOworCitjb25zdCBzdGQ6OnN0cmluZyBGSUJfUFJJVklMRUdFID0gImZpYiI7IC8vIGNvbmZpZyBmaWxlIHByaXZpbGVnZSBuYW1lCisKK2NsYXNzIEZpYk1hbmFnZXIgOiBwdWJsaWMgTWFuYWdlckJhc2UKK3sKK3B1YmxpYzoKKworICBGaWJNYW5hZ2VyKEZpYiYgZmliLAorICAgICAgICAgICAgIGZ1bmN0aW9uPHNoYXJlZF9wdHI8RmFjZT4oRmFjZUlkKT4gZ2V0RmFjZSwKKyAgICAgICAgICAgICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSwKKyAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbik7CisKKyAgdmlydHVhbAorICB+RmliTWFuYWdlcigpOworCisgIHZvaWQKKyAgb25GaWJSZXF1ZXN0KGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KTsKKworcHJpdmF0ZToKKworICB2b2lkCisgIG9uVmFsaWRhdGVkRmliUmVxdWVzdChjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCk7CisKKyAgdm9pZAorICBhZGROZXh0SG9wKENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgIENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UpOworCisgIHZvaWQKKyAgcmVtb3ZlTmV4dEhvcChDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBDb250cm9sUmVzcG9uc2UmIHJlc3BvbnNlKTsKKworICB2b2lkCisgIGxpc3RFbnRyaWVzKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KTsKKworcHJpdmF0ZToKKworICBGaWImIG1fbWFuYWdlZEZpYjsKKyAgZnVuY3Rpb248c2hhcmVkX3B0cjxGYWNlPihGYWNlSWQpPiBtX2dldEZhY2U7CisgIEZpYkVudW1lcmF0aW9uUHVibGlzaGVyIG1fZmliRW51bWVyYXRpb25QdWJsaXNoZXI7CisKKyAgdHlwZWRlZiBmdW5jdGlvbjx2b2lkKEZpYk1hbmFnZXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFJlc3BvbnNlJik+IFNpZ25lZFZlcmJQcm9jZXNzb3I7CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxOYW1lOjpDb21wb25lbnQsIFNpZ25lZFZlcmJQcm9jZXNzb3I+IFNpZ25lZFZlcmJEaXNwYXRjaFRhYmxlOworCisgIHR5cGVkZWYgc3RkOjpwYWlyPE5hbWU6OkNvbXBvbmVudCwgU2lnbmVkVmVyYlByb2Nlc3Nvcj4gU2lnbmVkVmVyYkFuZFByb2Nlc3NvcjsKKworICB0eXBlZGVmIGZ1bmN0aW9uPHZvaWQoRmliTWFuYWdlciosIGNvbnN0IEludGVyZXN0Jik+IFVuc2lnbmVkVmVyYlByb2Nlc3NvcjsKKworICB0eXBlZGVmIHN0ZDo6bWFwPE5hbWU6OkNvbXBvbmVudCwgVW5zaWduZWRWZXJiUHJvY2Vzc29yPiBVbnNpZ25lZFZlcmJEaXNwYXRjaFRhYmxlOworICB0eXBlZGVmIHN0ZDo6cGFpcjxOYW1lOjpDb21wb25lbnQsIFVuc2lnbmVkVmVyYlByb2Nlc3Nvcj4gVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yOworCisKKyAgY29uc3QgU2lnbmVkVmVyYkRpc3BhdGNoVGFibGUgbV9zaWduZWRWZXJiRGlzcGF0Y2g7CisgIGNvbnN0IFVuc2lnbmVkVmVyYkRpc3BhdGNoVGFibGUgbV91bnNpZ25lZFZlcmJEaXNwYXRjaDsKKworICBzdGF0aWMgY29uc3QgTmFtZSBDT01NQU5EX1BSRUZJWDsgLy8gL2xvY2FsaG9zdC9uZmQvZmliCisKKyAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYW4gaW52YWxpZCwgYnV0IG5vdCBtYWxmb3JtZWQsIHVuc2lnbmVkIGNvbW1hbmQuCisgIC8vICgvbG9jYWxob3N0L25mZC9maWIgKyB2ZXJiICsgcGFyYW1ldGVycykgPSA1CisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ09NTUFORF9VTlNJR05FRF9OQ09NUFM7CisKKyAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYSB2YWxpZCBzaWduZWQgSW50ZXJlc3QuCisgIC8vIFVOU0lHTkVEX05DT01QUyArIDQgY29tbWFuZCBJbnRlcmVzdCBjb21wb25lbnRzID0gOQorICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTU1BTkRfU0lHTkVEX05DT01QUzsKKworICBzdGF0aWMgY29uc3QgU2lnbmVkVmVyYkFuZFByb2Nlc3NvciBTSUdORURfQ09NTUFORF9WRVJCU1tdOworICBzdGF0aWMgY29uc3QgVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yIFVOU0lHTkVEX0NPTU1BTkRfVkVSQlNbXTsKKworICBzdGF0aWMgY29uc3QgTmFtZSBMSVNUX0NPTU1BTkRfUFJFRklYOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IExJU1RfQ09NTUFORF9OQ09NUFM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fTUdNVF9GSUJfTUFOQUdFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9nZW5lcmFsLWNvbmZpZy1zZWN0aW9uLmNwcCBiL05GRC9kYWVtb24vbWdtdC9nZW5lcmFsLWNvbmZpZy1zZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY0NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L2dlbmVyYWwtY29uZmlnLXNlY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAiZ2VuZXJhbC1jb25maWctc2VjdGlvbi5ocHAiCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKyNpbmNsdWRlICJjb3JlL3ByaXZpbGVnZS1oZWxwZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvY29uZmlnLWZpbGUuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworbmFtZXNwYWNlIGdlbmVyYWwgeworCitORkRfTE9HX0lOSVQoIkdlbmVyYWxDb25maWdTZWN0aW9uIik7CisKK3N0YXRpYyB2b2lkCitvbkNvbmZpZyhjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLAorICAgICAgICAgYm9vbCBpc0RyeVJ1biwKKyAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgLy8gZ2VuZXJhbAorICAvLyB7CisgIC8vICAgIDsgdXNlciAibmRuLXVzZXIiCisgIC8vICAgIDsgZ3JvdXAgIm5kbi11c2VyIgorICAvLyB9CisKKyAgc3RkOjpzdHJpbmcgdXNlcjsKKyAgc3RkOjpzdHJpbmcgZ3JvdXA7CisKKyAgZm9yIChDb25maWdTZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpID0gY29uZmlnU2VjdGlvbi5iZWdpbigpOworICAgICAgIGkgIT0gY29uZmlnU2VjdGlvbi5lbmQoKTsKKyAgICAgICArK2kpCisgICAgeworICAgICAgaWYgKGktPmZpcnN0ID09ICJ1c2VyIikKKyAgICAgICAgeworICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1c2VyID0gaS0+c2Vjb25kLmdldF92YWx1ZTxzdGQ6OnN0cmluZz4oInVzZXIiKTsKKworICAgICAgICAgICAgICBpZiAodXNlci5lbXB0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBcInVzZXJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gXCJnZW5lcmFsXCIgc2VjdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoY29uc3QgYm9vc3Q6OnByb3BlcnR5X3RyZWU6OnB0cmVlX2Vycm9yJiBlcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIkludmFsaWQgdmFsdWUgZm9yIFwidXNlclwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIFwiZ2VuZXJhbFwiIHNlY3Rpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaS0+Zmlyc3QgPT0gImdyb3VwIikKKyAgICAgICAgeworICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBncm91cCA9IGktPnNlY29uZC5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCJncm91cCIpOworCisgICAgICAgICAgICAgIGlmIChncm91cC5lbXB0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBcImdyb3VwXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIFwiZ2VuZXJhbFwiIHNlY3Rpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKGNvbnN0IGJvb3N0Ojpwcm9wZXJ0eV90cmVlOjpwdHJlZV9lcnJvciYgZXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBcImdyb3VwXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gXCJnZW5lcmFsXCIgc2VjdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBORkRfTE9HX1RSQUNFKCJ1c2luZyB1c2VyIFwiIiA8PCB1c2VyIDw8ICJcIiBncm91cCBcIiIgPDwgZ3JvdXAgPDwgIlwiIik7CisKKyAgUHJpdmlsZWdlSGVscGVyOjppbml0aWFsaXplKHVzZXIsIGdyb3VwKTsKK30KKwordm9pZAorc2V0Q29uZmlnRmlsZShDb25maWdGaWxlJiBjb25maWdGaWxlKQoreworICBjb25maWdGaWxlLmFkZFNlY3Rpb25IYW5kbGVyKCJnZW5lcmFsIiwgJm9uQ29uZmlnKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2VuZXJhbAorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9nZW5lcmFsLWNvbmZpZy1zZWN0aW9uLmhwcCBiL05GRC9kYWVtb24vbWdtdC9nZW5lcmFsLWNvbmZpZy1zZWN0aW9uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U1NDczCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L2dlbmVyYWwtY29uZmlnLXNlY3Rpb24uaHBwCkBAIC0wLDAgKzEsNDEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX01HTVRfR0VORVJBTF9DT05GSUdfU0VDVElPTl9IUFAKKyNkZWZpbmUgTkZEX01HTVRfR0VORVJBTF9DT05GSUdfU0VDVElPTl9IUFAKKworbmFtZXNwYWNlIG5mZCB7CisKK2NsYXNzIENvbmZpZ0ZpbGU7CisKK25hbWVzcGFjZSBnZW5lcmFsIHsKKwordm9pZAorc2V0Q29uZmlnRmlsZShDb25maWdGaWxlJiBjb25maWdGaWxlKTsKKworfSAvLyBuYW1lc3BhY2UgZ2VuZXJhbAorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9NR01UX0dFTkVSQUxfQ09ORklHX1NFQ1RJT05fSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL21nbXQvaW50ZXJuYWwtZmFjZS5jcHAgYi9ORkQvZGFlbW9uL21nbXQvaW50ZXJuYWwtZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZDMyOAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9pbnRlcm5hbC1mYWNlLmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImludGVybmFsLWZhY2UuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKyNpbmNsdWRlICJjb3JlL2dsb2JhbC1pby5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitORkRfTE9HX0lOSVQoIkludGVybmFsRmFjZSIpOworCitJbnRlcm5hbEZhY2U6OkludGVybmFsRmFjZSgpCisgIDogRmFjZShGYWNlVXJpKCJpbnRlcm5hbDovLyIpLCBGYWNlVXJpKCJpbnRlcm5hbDovLyIpLCB0cnVlKQoreworfQorCit2b2lkCitJbnRlcm5hbEZhY2U6OnNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIG9uU2VuZEludGVyZXN0KGludGVyZXN0KTsKKworICAvLyBJbnZva2UgLnByb2Nlc3NJbnRlcmVzdCBhIGJpdCBsYXRlciwKKyAgLy8gdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIGluIGZvcndhcmRpbmcgcGlwZWxpbmVzLgorICBnZXRHbG9iYWxJb1NlcnZpY2UoKS5wb3N0KGJpbmQoJkludGVybmFsRmFjZTo6cHJvY2Vzc0ludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgaW50ZXJlc3Quc2hhcmVkX2Zyb21fdGhpcygpKSk7Cit9CisKK3ZvaWQKK0ludGVybmFsRmFjZTo6cHJvY2Vzc0ludGVyZXN0KGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiBpbnRlcmVzdCkKK3sKKyAgaWYgKG1faW50ZXJlc3RGaWx0ZXJzLnNpemUoKSA9PSAwKQorICAgIHsKKyAgICAgIE5GRF9MT0dfREVCVUcoIm5vIEludGVyZXN0IGZpbHRlcnMgdG8gbWF0Y2ggYWdhaW5zdCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjb25zdCBOYW1lJiBpbnRlcmVzdE5hbWUoaW50ZXJlc3QtPmdldE5hbWUoKSk7CisgIE5GRF9MT0dfREVCVUcoInJlY2VpdmVkIEludGVyZXN0OiAiIDw8IGludGVyZXN0TmFtZSk7CisKKyAgc3RkOjptYXA8TmFtZSwgT25JbnRlcmVzdD46OmNvbnN0X2l0ZXJhdG9yIGZpbHRlciA9CisgICAgbV9pbnRlcmVzdEZpbHRlcnMubG93ZXJfYm91bmQoaW50ZXJlc3ROYW1lKTsKKworICAvLyBsb3dlcl9ib3VuZCBnaXZlcyB1cyB0aGUgZmlyc3QgTmFtZSB0aGF0IGlzCisgIC8vIGFuIGV4YWN0IG1hdGNoIE9SIG9yZGVyZWQgYWZ0ZXIgaW50ZXJlc3ROYW1lLgorICAvLworICAvLyBJZiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBtYXAsIHRoZW4gd2UgbmVlZAorICAvLyBvbmx5IGNoZWNrIGlmIHRoZSBiZWZvcmUtZW5kIGVsZW1lbnQgaXMgYSBtYXRjaC4KKyAgLy8KKyAgLy8gSWYgd2UgbWF0Y2ggYW4gZWxlbWVudCwgdGhlbiB0aGUgY3VycmVudAorICAvLyBwb3NpdGlvbiBvciB0aGUgcHJldmlvdXMgZWxlbWVudCBhcmUgcG90ZW50aWFsCisgIC8vIG1hdGNoZXMuCisgIC8vCisgIC8vIElmIHdlIGhpdCBiZWdpbiwgdGhlIGVsZW1lbnQgaXMgZWl0aGVyIGFuIGV4YWN0CisgIC8vIG1hdGNoIG9yIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHByZWZpeCBpbiB0aGUgbWFwLgorCisKKyAgaWYgKGZpbHRlciA9PSBtX2ludGVyZXN0RmlsdGVycy5lbmQoKSAmJiBmaWx0ZXIgIT0gbV9pbnRlcmVzdEZpbHRlcnMuYmVnaW4oKSkKKyAgICB7CisgICAgICAvLyBXZSBoaXQgdGhlIGVuZCwgY2hlY2sgaWYgdGhlIHByZXZpb3VzIGVsZW1lbnQKKyAgICAgIC8vIGlzIGEgbWF0Y2gKKyAgICAgIC0tZmlsdGVyOworICAgICAgaWYgKGZpbHRlci0+Zmlyc3QuaXNQcmVmaXhPZihpbnRlcmVzdE5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgTkZEX0xPR19ERUJVRygiZm91bmQgSW50ZXJlc3QgZmlsdGVyIGZvciAiIDw8IGZpbHRlci0+Zmlyc3QgPDwgIiAoYmVmb3JlIGVuZCBtYXRjaCkiKTsKKyAgICAgICAgICBmaWx0ZXItPnNlY29uZChpbnRlcmVzdE5hbWUsICppbnRlcmVzdCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIE5GRF9MT0dfREVCVUcoIm5vIEludGVyZXN0IGZpbHRlciBmb3VuZCBmb3IgIiA8PCBpbnRlcmVzdE5hbWUgPDwgIiAoYmVmb3JlIGVuZCkiKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoZmlsdGVyLT5maXJzdCA9PSBpbnRlcmVzdE5hbWUpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiZm91bmQgSW50ZXJlc3QgZmlsdGVyIGZvciAiIDw8IGZpbHRlci0+Zmlyc3QgPDwgIiAoZXhhY3QgbWF0Y2gpIik7CisgICAgICBmaWx0ZXItPnNlY29uZChpbnRlcmVzdE5hbWUsICppbnRlcmVzdCk7CisgICAgfQorICBlbHNlIGlmIChmaWx0ZXIgIT0gbV9pbnRlcmVzdEZpbHRlcnMuYmVnaW4oKSkKKyAgICB7CisgICAgICAvLyB0aGUgZWxlbWVudCB3ZSBmb3VuZCBpcyBjYW5vbmljYWxseQorICAgICAgLy8gb3JkZXJlZCBhZnRlciBpbnRlcmVzdE5hbWUuCisgICAgICAvLyBDaGVjayB0aGUgcHJldmlvdXMgZWxlbWVudC4KKyAgICAgIC0tZmlsdGVyOworICAgICAgaWYgKGZpbHRlci0+Zmlyc3QuaXNQcmVmaXhPZihpbnRlcmVzdE5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgTkZEX0xPR19ERUJVRygiZm91bmQgSW50ZXJlc3QgZmlsdGVyIGZvciAiIDw8IGZpbHRlci0+Zmlyc3QgPDwgIiAocHJldmlvdXMgbWF0Y2gpIik7CisgICAgICAgICAgZmlsdGVyLT5zZWNvbmQoaW50ZXJlc3ROYW1lLCAqaW50ZXJlc3QpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBORkRfTE9HX0RFQlVHKCJubyBJbnRlcmVzdCBmaWx0ZXIgZm91bmQgZm9yICIgPDwgaW50ZXJlc3ROYW1lIDw8ICIgKHByZXZpb3VzKSIpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygibm8gSW50ZXJlc3QgZmlsdGVyIGZvdW5kIGZvciAiIDw8IGludGVyZXN0TmFtZSA8PCAiIChiZWdpbikiKTsKKyAgICB9CisgIC8vRHJvcCBJbnRlcmVzdAorfQorCit2b2lkCitJbnRlcm5hbEZhY2U6OnNlbmREYXRhKGNvbnN0IERhdGEmIGRhdGEpCit7CisgIG9uU2VuZERhdGEoZGF0YSk7Cit9CisKK3ZvaWQKK0ludGVybmFsRmFjZTo6Y2xvc2UoKQoreworICB0aHJvdyBFcnJvcigiSW50ZXJuYWwgZmFjZSBjYW5ub3QgYmUgY2xvc2VkIik7Cit9CisKK3ZvaWQKK0ludGVybmFsRmFjZTo6c2V0SW50ZXJlc3RGaWx0ZXIoY29uc3QgTmFtZSYgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkludGVyZXN0IG9uSW50ZXJlc3QpCit7CisgIE5GRF9MT0dfSU5GTygicmVnaXN0ZXJpbmcgY2FsbGJhY2sgZm9yICIgPDwgZmlsdGVyKTsKKyAgbV9pbnRlcmVzdEZpbHRlcnNbZmlsdGVyXSA9IG9uSW50ZXJlc3Q7Cit9CisKK3ZvaWQKK0ludGVybmFsRmFjZTo6cHV0KGNvbnN0IERhdGEmIGRhdGEpCit7CisgIG9uUmVjZWl2ZURhdGEoZGF0YSk7Cit9CisKK0ludGVybmFsRmFjZTo6fkludGVybmFsRmFjZSgpCit7CisKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL21nbXQvaW50ZXJuYWwtZmFjZS5ocHAgYi9ORkQvZGFlbW9uL21nbXQvaW50ZXJuYWwtZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1Njc2ZgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9pbnRlcm5hbC1mYWNlLmhwcApAQCAtMCwwICsxLDk4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fTUdNVF9JTlRFUk5BTF9GQUNFX0hQUAorI2RlZmluZSBORkRfREFFTU9OX01HTVRfSU5URVJOQUxfRkFDRV9IUFAKKworI2luY2x1ZGUgImZhY2UvZmFjZS5ocHAiCisjaW5jbHVkZSAiYXBwLWZhY2UuaHBwIgorCisjaW5jbHVkZSAiY29tbWFuZC12YWxpZGF0b3IuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgSW50ZXJuYWxGYWNlIDogcHVibGljIEZhY2UsIHB1YmxpYyBBcHBGYWNlCit7CitwdWJsaWM6CisgIC8qKgorICAgKiBcYnJpZWYgSW50ZXJuYWxGYWNlLXJlbGF0ZWQgZXJyb3IKKyAgICovCisgIGNsYXNzIEVycm9yIDogcHVibGljIEZhY2U6OkVycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IEZhY2U6OkVycm9yKHdoYXQpCisgICAgeworICAgIH0KKyAgfTsKKworICBJbnRlcm5hbEZhY2UoKTsKKworICBDb21tYW5kVmFsaWRhdG9yJgorICBnZXRWYWxpZGF0b3IoKTsKKworICB2aXJ0dWFsCisgIH5JbnRlcm5hbEZhY2UoKTsKKworICAvLyBPdmVycmlkZGVuIEZhY2UgbWV0aG9kcyBmb3IgZm9yd2FyZGVyCisKKyAgdmlydHVhbCB2b2lkCisgIHNlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpOworCisgIHZpcnR1YWwgdm9pZAorICBzZW5kRGF0YShjb25zdCBEYXRhJiBkYXRhKTsKKworICB2aXJ0dWFsIHZvaWQKKyAgY2xvc2UoKTsKKworICAvLyBNZXRob2RzIGltcGxlbWVudGluZyBBcHBGYWNlIGludGVyZmFjZS4gRG8gbm90IGludm9rZSBmcm9tIGZvcndhcmRlci4KKworICB2aXJ0dWFsIHZvaWQKKyAgc2V0SW50ZXJlc3RGaWx0ZXIoY29uc3QgTmFtZSYgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICBPbkludGVyZXN0IG9uSW50ZXJlc3QpOworCisgIHZpcnR1YWwgdm9pZAorICBwdXQoY29uc3QgRGF0YSYgZGF0YSk7CisKK3ByaXZhdGU6CisgIHZvaWQKKyAgcHJvY2Vzc0ludGVyZXN0KGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiBpbnRlcmVzdCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6bWFwPE5hbWUsIE9uSW50ZXJlc3Q+IG1faW50ZXJlc3RGaWx0ZXJzOworICBDb21tYW5kVmFsaWRhdG9yIG1fdmFsaWRhdG9yOworfTsKKworaW5saW5lIENvbW1hbmRWYWxpZGF0b3ImCitJbnRlcm5hbEZhY2U6OmdldFZhbGlkYXRvcigpCit7CisgIHJldHVybiBtX3ZhbGlkYXRvcjsKK30KKworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fTUdNVF9JTlRFUk5BTF9GQUNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9tZ210L21hbmFnZXItYmFzZS5jcHAgYi9ORkQvZGFlbW9uL21nbXQvbWFuYWdlci1iYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjc1ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L21hbmFnZXItYmFzZS5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJtYW5hZ2VyLWJhc2UuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiTWFuYWdlckJhc2UiKTsKKworTWFuYWdlckJhc2U6Ok1hbmFnZXJCYXNlKHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJpdmlsZWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKQorICA6IG1fZmFjZShmYWNlKQorICAsIG1fa2V5Q2hhaW4oa2V5Q2hhaW4pCit7CisgIGZhY2UtPmdldFZhbGlkYXRvcigpLmFkZFN1cHBvcnRlZFByaXZpbGVnZShwcml2aWxlZ2UpOworfQorCitNYW5hZ2VyQmFzZTo6fk1hbmFnZXJCYXNlKCkKK3sKKworfQorCitib29sCitNYW5hZ2VyQmFzZTo6ZXh0cmFjdFBhcmFtZXRlcnMoY29uc3QgTmFtZTo6Q29tcG9uZW50JiBwYXJhbWV0ZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIGV4dHJhY3RlZFBhcmFtZXRlcnMpCit7CisgIHRyeQorICAgIHsKKyAgICAgIEJsb2NrIHJhd1BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJDb21wb25lbnQuYmxvY2tGcm9tVmFsdWUoKTsKKyAgICAgIGV4dHJhY3RlZFBhcmFtZXRlcnMud2lyZURlY29kZShyYXdQYXJhbWV0ZXJzKTsKKyAgICB9CisgIGNhdGNoIChjb25zdCB0bHY6OkVycm9yJikKKyAgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIE5GRF9MT0dfREVCVUcoIlBhcmFtZXRlcnMgcGFyc2VkIE9LIik7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkCitNYW5hZ2VyQmFzZTo6c2VuZFJlc3BvbnNlKGNvbnN0IE5hbWUmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KQoreworICBDb250cm9sUmVzcG9uc2UgcmVzcG9uc2UoY29kZSwgdGV4dCk7CisgIHNlbmRSZXNwb25zZShuYW1lLCByZXNwb25zZSk7Cit9CisKK3ZvaWQKK01hbmFnZXJCYXNlOjpzZW5kUmVzcG9uc2UoY29uc3QgTmFtZSYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrJiBib2R5KQoreworICBDb250cm9sUmVzcG9uc2UgcmVzcG9uc2UoY29kZSwgdGV4dCk7CisgIHJlc3BvbnNlLnNldEJvZHkoYm9keSk7CisgIHNlbmRSZXNwb25zZShuYW1lLCByZXNwb25zZSk7Cit9CisKK3ZvaWQKK01hbmFnZXJCYXNlOjpzZW5kUmVzcG9uc2UoY29uc3QgTmFtZSYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFJlc3BvbnNlJiByZXNwb25zZSkKK3sKKyAgTkZEX0xPR19ERUJVRygicmVzcG9uZGluZyIKKyAgICAgICAgICAgICAgICA8PCAiIG5hbWU6ICIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgY29kZTogIiA8PCByZXNwb25zZS5nZXRDb2RlKCkKKyAgICAgICAgICAgICAgICA8PCAiIHRleHQ6ICIgPDwgcmVzcG9uc2UuZ2V0VGV4dCgpKTsKKworICBjb25zdCBCbG9jayYgZW5jb2RlZENvbnRyb2wgPSByZXNwb25zZS53aXJlRW5jb2RlKCk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiByZXNwb25zZURhdGEobWFrZV9zaGFyZWQ8RGF0YT4obmFtZSkpOworICByZXNwb25zZURhdGEtPnNldENvbnRlbnQoZW5jb2RlZENvbnRyb2wpOworCisgIG1fa2V5Q2hhaW4uc2lnbigqcmVzcG9uc2VEYXRhKTsKKyAgbV9mYWNlLT5wdXQoKnJlc3BvbnNlRGF0YSk7Cit9CisKK3ZvaWQKK01hbmFnZXJCYXNlOjpzZW5kTmFjayhjb25zdCBOYW1lJiBuYW1lKQoreworICBORkRfTE9HX0RFQlVHKCJyZXNwb25kaW5nIE5BQ0sgdG8gIiA8PCBuYW1lKTsKKworICBuZG46Ok1ldGFJbmZvIG1ldGE7CisgIG1ldGEuc2V0VHlwZSh0bHY6OkNvbnRlbnRUeXBlX05hY2spOworCisgIHNoYXJlZF9wdHI8RGF0YT4gcmVzcG9uc2VEYXRhKG1ha2Vfc2hhcmVkPERhdGE+KG5hbWUpKTsKKyAgcmVzcG9uc2VEYXRhLT5zZXRNZXRhSW5mbyhtZXRhKTsKKworICBtX2tleUNoYWluLnNpZ24oKnJlc3BvbnNlRGF0YSk7CisgIG1fZmFjZS0+cHV0KCpyZXNwb25zZURhdGEpOworfQorCitib29sCitNYW5hZ2VyQmFzZTo6dmFsaWRhdGVQYXJhbWV0ZXJzKGNvbnN0IENvbnRyb2xDb21tYW5kJiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycykKK3sKKyAgdHJ5CisgICAgeworICAgICAgY29tbWFuZC52YWxpZGF0ZVJlcXVlc3QocGFyYW1ldGVycyk7CisgICAgfQorICBjYXRjaCAoY29uc3QgQ29udHJvbENvbW1hbmQ6OkFyZ3VtZW50RXJyb3ImIGVycm9yKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgY29tbWFuZC5hcHBseURlZmF1bHRzVG9SZXF1ZXN0KHBhcmFtZXRlcnMpOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkCitNYW5hZ2VyQmFzZTo6b25Db21tYW5kVmFsaWRhdGlvbkZhaWxlZChjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcikKK3sKKyAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IHVuYXV0aG9yaXplZCBjb21tYW5kOiAiIDw8ICpjb21tYW5kIDw8ICIgKCIgPDwgZXJyb3IgPDwgIikiKTsKKyAgc2VuZFJlc3BvbnNlKGNvbW1hbmQtPmdldE5hbWUoKSwgNDAzLCAiVW5hdXRob3JpemVkIGNvbW1hbmQiKTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9tYW5hZ2VyLWJhc2UuaHBwIGIvTkZEL2RhZW1vbi9tZ210L21hbmFnZXItYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxMTYxNQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vbWdtdC9tYW5hZ2VyLWJhc2UuaHBwCkBAIC0wLDAgKzEsMTY5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fTUdNVF9NQU5BR0VSX0JBU0VfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fTUdNVF9NQU5BR0VSX0JBU0VfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCisjaW5jbHVkZSAibWdtdC9jb21tYW5kLXZhbGlkYXRvci5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY29udHJvbC1jb21tYW5kLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWNvbnRyb2wtcmVzcG9uc2UuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY29udHJvbC1wYXJhbWV0ZXJzLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK3VzaW5nIG5kbjo6bmZkOjpDb250cm9sQ29tbWFuZDsKK3VzaW5nIG5kbjo6bmZkOjpDb250cm9sUmVzcG9uc2U7Cit1c2luZyBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnM7CisKK2NsYXNzIEludGVybmFsRmFjZTsKKworY2xhc3MgTWFuYWdlckJhc2UKK3sKK3B1YmxpYzoKKworICBzdHJ1Y3QgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgICBFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgd2hhdCkgOiBzdGQ6OnJ1bnRpbWVfZXJyb3Iod2hhdCkge30KKyAgfTsKKworICBNYW5hZ2VyQmFzZShzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByaXZpbGVnZSwKKyAgICAgICAgICAgICAgbmRuOjpLZXlDaGFpbiYga2V5Q2hhaW4pOworCisgIHZpcnR1YWwKKyAgfk1hbmFnZXJCYXNlKCk7CisKKyAgdm9pZAorICBvbkNvbW1hbmRWYWxpZGF0aW9uRmFpbGVkKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcik7CisKK3Byb3RlY3RlZDoKKworICBzdGF0aWMgYm9vbAorICBleHRyYWN0UGFyYW1ldGVycyhjb25zdCBOYW1lOjpDb21wb25lbnQmIHBhcmFtZXRlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIGV4dHJhY3RlZFBhcmFtZXRlcnMpOworCisgIHZvaWQKKyAgc2V0UmVzcG9uc2UoQ29udHJvbFJlc3BvbnNlJiByZXNwb25zZSwKKyAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpOworICB2b2lkCisgIHNldFJlc3BvbnNlKENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LAorICAgICAgICAgICAgICBjb25zdCBCbG9jayYgYm9keSk7CisKKyAgdm9pZAorICBzZW5kUmVzcG9uc2UoY29uc3QgTmFtZSYgbmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UpOworCisgIHZvaWQKKyAgc2VuZFJlc3BvbnNlKGNvbnN0IE5hbWUmIG5hbWUsCisgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpOworCisgIHZvaWQKKyAgc2VuZFJlc3BvbnNlKGNvbnN0IE5hbWUmIG5hbWUsCisgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICBjb25zdCBCbG9jayYgYm9keSk7CisKKyAgdm9pZAorICBzZW5kTmFjayhjb25zdCBOYW1lJiBuYW1lKTsKKworICB2aXJ0dWFsIGJvb2wKKyAgdmFsaWRhdGVQYXJhbWV0ZXJzKGNvbnN0IENvbnRyb2xDb21tYW5kJiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpOworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BST1RFQ1RFRDoKKyAgdm9pZAorICBhZGRJbnRlcmVzdFJ1bGUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjpJZGVudGl0eUNlcnRpZmljYXRlJiBjZXJ0aWZpY2F0ZSk7CisKKyAgdm9pZAorICBhZGRJbnRlcmVzdFJ1bGUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZSYga2V5TmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6UHVibGljS2V5JiBwdWJsaWNLZXkpOworCisgIHZvaWQKKyAgdmFsaWRhdGUoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LAorICAgICAgICAgICBjb25zdCBuZG46Ok9uSW50ZXJlc3RWYWxpZGF0ZWQmIG9uVmFsaWRhdGVkLAorICAgICAgICAgICBjb25zdCBuZG46Ok9uSW50ZXJlc3RWYWxpZGF0aW9uRmFpbGVkJiBvblZhbGlkYXRpb25GYWlsZWQpOworCitwcm90ZWN0ZWQ6CisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBtX2ZhY2U7CisgIG5kbjo6S2V5Q2hhaW4mIG1fa2V5Q2hhaW47Cit9OworCitpbmxpbmUgdm9pZAorTWFuYWdlckJhc2U6OnNldFJlc3BvbnNlKENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkKK3sKKyAgcmVzcG9uc2Uuc2V0Q29kZShjb2RlKTsKKyAgcmVzcG9uc2Uuc2V0VGV4dCh0ZXh0KTsKK30KKworaW5saW5lIHZvaWQKK01hbmFnZXJCYXNlOjpzZXRSZXNwb25zZShDb250cm9sUmVzcG9uc2UmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2smIGJvZHkpCit7CisgIHNldFJlc3BvbnNlKHJlc3BvbnNlLCBjb2RlLCB0ZXh0KTsKKyAgcmVzcG9uc2Uuc2V0Qm9keShib2R5KTsKK30KKworaW5saW5lIHZvaWQKK01hbmFnZXJCYXNlOjphZGRJbnRlcmVzdFJ1bGUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46OklkZW50aXR5Q2VydGlmaWNhdGUmIGNlcnRpZmljYXRlKQoreworICBtX2ZhY2UtPmdldFZhbGlkYXRvcigpLmFkZEludGVyZXN0UnVsZShyZWdleCwgY2VydGlmaWNhdGUpOworfQorCitpbmxpbmUgdm9pZAorTWFuYWdlckJhc2U6OmFkZEludGVyZXN0UnVsZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIGtleU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6UHVibGljS2V5JiBwdWJsaWNLZXkpCit7CisgIG1fZmFjZS0+Z2V0VmFsaWRhdG9yKCkuYWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCBrZXlOYW1lLCBwdWJsaWNLZXkpOworfQorCitpbmxpbmUgdm9pZAorTWFuYWdlckJhc2U6OnZhbGlkYXRlKGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46Ok9uSW50ZXJlc3RWYWxpZGF0ZWQmIG9uVmFsaWRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6T25JbnRlcmVzdFZhbGlkYXRpb25GYWlsZWQmIG9uVmFsaWRhdGlvbkZhaWxlZCkKK3sKKyAgbV9mYWNlLT5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZShpbnRlcmVzdCwgb25WYWxpZGF0ZWQsIG9uVmFsaWRhdGlvbkZhaWxlZCk7Cit9CisKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX01HTVRfTUFOQUdFUl9CQVNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9tZ210L3N0YXR1cy1zZXJ2ZXIuY3BwIGIvTkZEL2RhZW1vbi9tZ210L3N0YXR1cy1zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Y2U1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvc3RhdHVzLXNlcnZlci5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInN0YXR1cy1zZXJ2ZXIuaHBwIgorI2luY2x1ZGUgImZ3L2ZvcndhcmRlci5ocHAiCisjaW5jbHVkZSAidmVyc2lvbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjb25zdCBOYW1lIFN0YXR1c1NlcnZlcjo6REFUQVNFVF9QUkVGSVggPSAibmRuOi9sb2NhbGhvc3QvbmZkL3N0YXR1cyI7Citjb25zdCB0aW1lOjptaWxsaXNlY29uZHMgU3RhdHVzU2VydmVyOjpSRVNQT05TRV9GUkVTSE5FU1MgPSB0aW1lOjptaWxsaXNlY29uZHMoNTAwMCk7CisKK1N0YXR1c1NlcnZlcjo6U3RhdHVzU2VydmVyKHNoYXJlZF9wdHI8QXBwRmFjZT4gZmFjZSwgRm9yd2FyZGVyJiBmb3J3YXJkZXIsIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKQorICA6IG1fZmFjZShmYWNlKQorICAsIG1fZm9yd2FyZGVyKGZvcndhcmRlcikKKyAgLCBtX3N0YXJ0VGltZXN0YW1wKHRpbWU6OnN5c3RlbV9jbG9jazo6bm93KCkpCisgICwgbV9rZXlDaGFpbihrZXlDaGFpbikKK3sKKyAgbV9mYWNlLT5zZXRJbnRlcmVzdEZpbHRlcihEQVRBU0VUX1BSRUZJWCwgYmluZCgmU3RhdHVzU2VydmVyOjpvbkludGVyZXN0LCB0aGlzLCBfMikpOworfQorCit2b2lkCitTdGF0dXNTZXJ2ZXI6Om9uSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KSBjb25zdAoreworICBOYW1lIG5hbWUoREFUQVNFVF9QUkVGSVgpOworICBuYW1lLmFwcGVuZFZlcnNpb24oKTsKKyAgbmFtZS5hcHBlbmRTZWdtZW50KDApOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2Vfc2hhcmVkPERhdGE+KG5hbWUpOworICBkYXRhLT5zZXRGcmVzaG5lc3NQZXJpb2QoUkVTUE9OU0VfRlJFU0hORVNTKTsKKworICBzaGFyZWRfcHRyPG5kbjo6bmZkOjpGb3J3YXJkZXJTdGF0dXM+IHN0YXR1cyA9IHRoaXMtPmNvbGxlY3RTdGF0dXMoKTsKKyAgZGF0YS0+c2V0Q29udGVudChzdGF0dXMtPndpcmVFbmNvZGUoKSk7CisKKyAgbV9rZXlDaGFpbi5zaWduKCpkYXRhKTsKKyAgbV9mYWNlLT5wdXQoKmRhdGEpOworfQorCitzaGFyZWRfcHRyPG5kbjo6bmZkOjpGb3J3YXJkZXJTdGF0dXM+CitTdGF0dXNTZXJ2ZXI6OmNvbGxlY3RTdGF0dXMoKSBjb25zdAoreworICBzaGFyZWRfcHRyPG5kbjo6bmZkOjpGb3J3YXJkZXJTdGF0dXM+IHN0YXR1cyA9IG1ha2Vfc2hhcmVkPG5kbjo6bmZkOjpGb3J3YXJkZXJTdGF0dXM+KCk7CisKKyAgc3RhdHVzLT5zZXROZmRWZXJzaW9uKE5GRF9WRVJTSU9OX0JVSUxEX1NUUklORyk7CisgIHN0YXR1cy0+c2V0U3RhcnRUaW1lc3RhbXAobV9zdGFydFRpbWVzdGFtcCk7CisgIHN0YXR1cy0+c2V0Q3VycmVudFRpbWVzdGFtcCh0aW1lOjpzeXN0ZW1fY2xvY2s6Om5vdygpKTsKKworICBzdGF0dXMtPnNldE5OYW1lVHJlZUVudHJpZXMobV9mb3J3YXJkZXIuZ2V0TmFtZVRyZWUoKS5zaXplKCkpOworICBzdGF0dXMtPnNldE5GaWJFbnRyaWVzKG1fZm9yd2FyZGVyLmdldEZpYigpLnNpemUoKSk7CisgIHN0YXR1cy0+c2V0TlBpdEVudHJpZXMobV9mb3J3YXJkZXIuZ2V0UGl0KCkuc2l6ZSgpKTsKKyAgc3RhdHVzLT5zZXROTWVhc3VyZW1lbnRzRW50cmllcyhtX2ZvcndhcmRlci5nZXRNZWFzdXJlbWVudHMoKS5zaXplKCkpOworICBzdGF0dXMtPnNldE5Dc0VudHJpZXMobV9mb3J3YXJkZXIuZ2V0Q3MoKS5zaXplKCkpOworCisgIG1fZm9yd2FyZGVyLmdldENvdW50ZXJzKCkuY29weVRvKCpzdGF0dXMpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9tZ210L3N0YXR1cy1zZXJ2ZXIuaHBwIGIvTkZEL2RhZW1vbi9tZ210L3N0YXR1cy1zZXJ2ZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvc3RhdHVzLXNlcnZlci5ocHAKQEAgLTAsMCArMSw2MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX01HTVRfU1RBVFVTX1NFUlZFUl9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9NR01UX1NUQVRVU19TRVJWRVJfSFBQCisKKyNpbmNsdWRlICJtZ210L2FwcC1mYWNlLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZvcndhcmRlci1zdGF0dXMuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgRm9yd2FyZGVyOworCitjbGFzcyBTdGF0dXNTZXJ2ZXIgOiBub25jb3B5YWJsZQoreworcHVibGljOgorICBTdGF0dXNTZXJ2ZXIoc2hhcmVkX3B0cjxBcHBGYWNlPiBmYWNlLCBGb3J3YXJkZXImIGZvcndhcmRlciwgbmRuOjpLZXlDaGFpbiYga2V5Q2hhaW4pOworCitwcml2YXRlOgorICB2b2lkCisgIG9uSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KSBjb25zdDsKKworICBzaGFyZWRfcHRyPG5kbjo6bmZkOjpGb3J3YXJkZXJTdGF0dXM+CisgIGNvbGxlY3RTdGF0dXMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IE5hbWUgREFUQVNFVF9QUkVGSVg7CisgIHN0YXRpYyBjb25zdCB0aW1lOjptaWxsaXNlY29uZHMgUkVTUE9OU0VfRlJFU0hORVNTOworCisgIHNoYXJlZF9wdHI8QXBwRmFjZT4gbV9mYWNlOworICBGb3J3YXJkZXImIG1fZm9yd2FyZGVyOworICB0aW1lOjpzeXN0ZW1fY2xvY2s6OlRpbWVQb2ludCBtX3N0YXJ0VGltZXN0YW1wOworICBuZG46OktleUNoYWluJiBtX2tleUNoYWluOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX01HTVRfU1RBVFVTX1NFUlZFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9zdHJhdGVneS1jaG9pY2UtbWFuYWdlci5jcHAgYi9ORkQvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLW1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjcyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLW1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjE0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAic3RyYXRlZ3ktY2hvaWNlLW1hbmFnZXIuaHBwIgorI2luY2x1ZGUgInRhYmxlL3N0cmF0ZWd5LWNob2ljZS5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgIm1nbXQvYXBwLWZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJTdHJhdGVneUNob2ljZU1hbmFnZXIiKTsKKworY29uc3QgTmFtZSBTdHJhdGVneUNob2ljZU1hbmFnZXI6OkNPTU1BTkRfUFJFRklYID0gIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZSI7CisKK2NvbnN0IHNpemVfdCBTdHJhdGVneUNob2ljZU1hbmFnZXI6OkNPTU1BTkRfVU5TSUdORURfTkNPTVBTID0KKyAgU3RyYXRlZ3lDaG9pY2VNYW5hZ2VyOjpDT01NQU5EX1BSRUZJWC5zaXplKCkgKworICAxICsgLy8gdmVyYgorICAxOyAgLy8gdmVyYiBwYXJhbWV0ZXJzCisKK2NvbnN0IHNpemVfdCBTdHJhdGVneUNob2ljZU1hbmFnZXI6OkNPTU1BTkRfU0lHTkVEX05DT01QUyA9CisgIFN0cmF0ZWd5Q2hvaWNlTWFuYWdlcjo6Q09NTUFORF9VTlNJR05FRF9OQ09NUFMgKworICA0OyAvLyAodGltZXN0YW1wLCBub25jZSwgc2lnbmVkIGluZm8gdGx2LCBzaWduYXR1cmUgdGx2KQorCitjb25zdCBOYW1lIFN0cmF0ZWd5Q2hvaWNlTWFuYWdlcjo6TElTVF9EQVRBU0VUX1BSRUZJWCgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlL2xpc3QiKTsKKworU3RyYXRlZ3lDaG9pY2VNYW5hZ2VyOjpTdHJhdGVneUNob2ljZU1hbmFnZXIoU3RyYXRlZ3lDaG9pY2UmIHN0cmF0ZWd5Q2hvaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbikKKyAgOiBNYW5hZ2VyQmFzZShmYWNlLCBTVFJBVEVHWV9DSE9JQ0VfUFJJVklMRUdFLCBrZXlDaGFpbikKKyAgLCBtX3N0cmF0ZWd5Q2hvaWNlKHN0cmF0ZWd5Q2hvaWNlKQorICAsIG1fbGlzdFB1Ymxpc2hlcihzdHJhdGVneUNob2ljZSwgKm1fZmFjZSwgTElTVF9EQVRBU0VUX1BSRUZJWCwga2V5Q2hhaW4pCit7CisgIGZhY2UtPnNldEludGVyZXN0RmlsdGVyKCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZTdHJhdGVneUNob2ljZU1hbmFnZXI6Om9uU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0LCB0aGlzLCBfMikpOworfQorCitTdHJhdGVneUNob2ljZU1hbmFnZXI6On5TdHJhdGVneUNob2ljZU1hbmFnZXIoKQoreworCit9CisKK3ZvaWQKK1N0cmF0ZWd5Q2hvaWNlTWFuYWdlcjo6b25TdHJhdGVneUNob2ljZVJlcXVlc3QoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpCit7CisgIGNvbnN0IE5hbWUmIGNvbW1hbmQgPSByZXF1ZXN0LmdldE5hbWUoKTsKKyAgY29uc3Qgc2l6ZV90IGNvbW1hbmROQ29tcHMgPSBjb21tYW5kLnNpemUoKTsKKworICBpZiAoY29tbWFuZCA9PSBMSVNUX0RBVEFTRVRfUFJFRklYKQorICAgIHsKKyAgICAgIGxpc3RTdHJhdGVnaWVzKHJlcXVlc3QpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoY29tbWFuZE5Db21wcyA8PSBDT01NQU5EX1BSRUZJWC5zaXplKCkpCisgICAgeworICAgICAgLy8gY29tbWFuZCBpcyB0b28gc2hvcnQgdG8gaGF2ZSBhIHZlcmIKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBtYWxmb3JtZWQiKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoQ09NTUFORF9VTlNJR05FRF9OQ09NUFMgPD0gY29tbWFuZE5Db21wcyAmJgorICAgICAgY29tbWFuZE5Db21wcyA8IENPTU1BTkRfU0lHTkVEX05DT01QUykKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogdW5zaWduZWQgdmVyYjogIiA8PCBjb21tYW5kKTsKKyAgICAgIHNlbmRSZXNwb25zZShjb21tYW5kLCA0MDEsICJTaWduYXR1cmUgcmVxdWlyZWQiKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoY29tbWFuZE5Db21wcyA8IENPTU1BTkRfU0lHTkVEX05DT01QUyB8fAorICAgICAgICAgICAhQ09NTUFORF9QUkVGSVguaXNQcmVmaXhPZihjb21tYW5kKSkKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogbWFsZm9ybWVkIik7CisgICAgICBzZW5kUmVzcG9uc2UoY29tbWFuZCwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdmFsaWRhdGUocmVxdWVzdCwKKyAgICAgICAgICAgYmluZCgmU3RyYXRlZ3lDaG9pY2VNYW5hZ2VyOjpvblZhbGlkYXRlZFN0cmF0ZWd5Q2hvaWNlUmVxdWVzdCwgdGhpcywgXzEpLAorICAgICAgICAgICBiaW5kKCZNYW5hZ2VyQmFzZTo6b25Db21tYW5kVmFsaWRhdGlvbkZhaWxlZCwgdGhpcywgXzEsIF8yKSk7Cit9CisKK3ZvaWQKK1N0cmF0ZWd5Q2hvaWNlTWFuYWdlcjo6bGlzdFN0cmF0ZWdpZXMoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpCit7CisgIG1fbGlzdFB1Ymxpc2hlci5wdWJsaXNoKCk7Cit9CisKK3ZvaWQKK1N0cmF0ZWd5Q2hvaWNlTWFuYWdlcjo6b25WYWxpZGF0ZWRTdHJhdGVneUNob2ljZVJlcXVlc3QoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QpCit7CisgIHN0YXRpYyBjb25zdCBOYW1lOjpDb21wb25lbnQgVkVSQl9TRVQoInNldCIpOworICBzdGF0aWMgY29uc3QgTmFtZTo6Q29tcG9uZW50IFZFUkJfVU5TRVQoInVuc2V0Iik7CisKKyAgY29uc3QgTmFtZSYgY29tbWFuZCA9IHJlcXVlc3QtPmdldE5hbWUoKTsKKyAgY29uc3QgTmFtZTo6Q29tcG9uZW50JiBwYXJhbWV0ZXJDb21wb25lbnQgPSBjb21tYW5kW0NPTU1BTkRfUFJFRklYLnNpemUoKSArIDFdOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIGlmICghZXh0cmFjdFBhcmFtZXRlcnMocGFyYW1ldGVyQ29tcG9uZW50LCBwYXJhbWV0ZXJzKSkKKyAgICB7CisgICAgICBzZW5kUmVzcG9uc2UoY29tbWFuZCwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29uc3QgTmFtZTo6Q29tcG9uZW50JiB2ZXJiID0gY29tbWFuZC5hdChDT01NQU5EX1BSRUZJWC5zaXplKCkpOworICBDb250cm9sUmVzcG9uc2UgcmVzcG9uc2U7CisgIGlmICh2ZXJiID09IFZFUkJfU0VUKQorICAgIHsKKyAgICAgIHNldFN0cmF0ZWd5KHBhcmFtZXRlcnMsIHJlc3BvbnNlKTsKKyAgICB9CisgIGVsc2UgaWYgKHZlcmIgPT0gVkVSQl9VTlNFVCkKKyAgICB7CisgICAgICB1bnNldFN0cmF0ZWd5KHBhcmFtZXRlcnMsIHJlc3BvbnNlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogdW5zdXBwb3J0ZWQgdmVyYjogIiA8PCB2ZXJiKTsKKyAgICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlLCA1MDEsICJVbnN1cHBvcnRlZCBjb21tYW5kIik7CisgICAgfQorCisgIHNlbmRSZXNwb25zZShjb21tYW5kLCByZXNwb25zZSk7Cit9CisKK3ZvaWQKK1N0cmF0ZWd5Q2hvaWNlTWFuYWdlcjo6c2V0U3RyYXRlZ3koQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UpCit7CisgIG5kbjo6bmZkOjpTdHJhdGVneUNob2ljZVNldENvbW1hbmQgY29tbWFuZDsKKworICBpZiAoIXZhbGlkYXRlUGFyYW1ldGVycyhjb21tYW5kLCBwYXJhbWV0ZXJzKSkKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJzdHJhdGVneS1jaG9pY2UgcmVzdWx0OiBGQUlMIHJlYXNvbjogbWFsZm9ybWVkIik7CisgICAgICBzZXRSZXNwb25zZShyZXNwb25zZSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29uc3QgTmFtZSYgcHJlZml4ID0gcGFyYW1ldGVycy5nZXROYW1lKCk7CisgIGNvbnN0IE5hbWUmIHNlbGVjdGVkU3RyYXRlZ3kgPSBwYXJhbWV0ZXJzLmdldFN0cmF0ZWd5KCk7CisKKyAgaWYgKCFtX3N0cmF0ZWd5Q2hvaWNlLmhhc1N0cmF0ZWd5KHNlbGVjdGVkU3RyYXRlZ3kpKQorICAgIHsKKyAgICAgIE5GRF9MT0dfREVCVUcoInN0cmF0ZWd5LWNob2ljZSByZXN1bHQ6IEZBSUwgcmVhc29uOiB1bmtub3duLXN0cmF0ZWd5OiAiCisgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtZXRlcnMuZ2V0U3RyYXRlZ3koKSk7CisgICAgICBzZXRSZXNwb25zZShyZXNwb25zZSwgNTA0LCAiVW5zdXBwb3J0ZWQgc3RyYXRlZ3kiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG1fc3RyYXRlZ3lDaG9pY2UuaW5zZXJ0KHByZWZpeCwgc2VsZWN0ZWRTdHJhdGVneSkpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygic3RyYXRlZ3ktY2hvaWNlIHJlc3VsdDogU1VDQ0VTUyIpOworICAgICAgYXV0byBjdXJyZW50U3RyYXRlZ3lDaG9pY2UgPSBtX3N0cmF0ZWd5Q2hvaWNlLmdldChwcmVmaXgpOworICAgICAgQk9PU1RfQVNTRVJUKGN1cnJlbnRTdHJhdGVneUNob2ljZS5maXJzdCk7CisgICAgICBwYXJhbWV0ZXJzLnNldFN0cmF0ZWd5KGN1cnJlbnRTdHJhdGVneUNob2ljZS5zZWNvbmQpOworICAgICAgc2V0UmVzcG9uc2UocmVzcG9uc2UsIDIwMCwgIlN1Y2Nlc3MiLCBwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygic3RyYXRlZ3ktY2hvaWNlIHJlc3VsdDogRkFJTCByZWFzb246IG5vdC1pbnN0YWxsZWQiKTsKKyAgICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlLCA0MDUsICJTdHJhdGVneSBub3QgaW5zdGFsbGVkIik7CisgICAgfQorfQorCit2b2lkCitTdHJhdGVneUNob2ljZU1hbmFnZXI6OnVuc2V0U3RyYXRlZ3koQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFJlc3BvbnNlJiByZXNwb25zZSkKK3sKKyAgbmRuOjpuZmQ6OlN0cmF0ZWd5Q2hvaWNlVW5zZXRDb21tYW5kIGNvbW1hbmQ7CisKKyAgaWYgKCF2YWxpZGF0ZVBhcmFtZXRlcnMoY29tbWFuZCwgcGFyYW1ldGVycykpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IE5hbWUgUk9PVF9QUkVGSVg7CisgICAgICBpZiAocGFyYW1ldGVycy5oYXNOYW1lKCkgJiYgcGFyYW1ldGVycy5nZXROYW1lKCkgPT0gUk9PVF9QUkVGSVgpCisgICAgICAgIHsKKyAgICAgICAgICBORkRfTE9HX0RFQlVHKCJzdHJhdGVneS1jaG9pY2UgcmVzdWx0OiBGQUlMIHJlYXNvbjogdW5zZXQtcm9vdCIpOworICAgICAgICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlLCA0MDMsICJDYW5ub3QgdW5zZXQgcm9vdCBwcmVmaXggc3RyYXRlZ3kiKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgTkZEX0xPR19ERUJVRygic3RyYXRlZ3ktY2hvaWNlIHJlc3VsdDogRkFJTCByZWFzb246IG1hbGZvcm1lZCIpOworICAgICAgICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgIG1fc3RyYXRlZ3lDaG9pY2UuZXJhc2UocGFyYW1ldGVycy5nZXROYW1lKCkpOworCisgIE5GRF9MT0dfREVCVUcoInN0cmF0ZWd5LWNob2ljZSByZXN1bHQ6IFNVQ0NFU1MiKTsKKyAgc2V0UmVzcG9uc2UocmVzcG9uc2UsIDIwMCwgIlN1Y2Nlc3MiLCBwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7Cit9CisKKworCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9zdHJhdGVneS1jaG9pY2UtbWFuYWdlci5ocHAgYi9ORkQvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLW1hbmFnZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyY2NkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLW1hbmFnZXIuaHBwCkBAIC0wLDAgKzEsOTEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9NR01UX1NUUkFURUdZX0NIT0lDRV9NQU5BR0VSX0hQUAorI2RlZmluZSBORkRfREFFTU9OX01HTVRfU1RSQVRFR1lfQ0hPSUNFX01BTkFHRVJfSFBQCisKKyNpbmNsdWRlICJtZ210L21hbmFnZXItYmFzZS5ocHAiCisjaW5jbHVkZSAibWdtdC9zdHJhdGVneS1jaG9pY2UtcHVibGlzaGVyLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY29udHJvbC1wYXJhbWV0ZXJzLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CisKK2NvbnN0IHN0ZDo6c3RyaW5nIFNUUkFURUdZX0NIT0lDRV9QUklWSUxFR0UgPSAic3RyYXRlZ3ktY2hvaWNlIjsKKworY2xhc3MgU3RyYXRlZ3lDaG9pY2U7CisKK2NsYXNzIFN0cmF0ZWd5Q2hvaWNlTWFuYWdlciA6IHB1YmxpYyBNYW5hZ2VyQmFzZQoreworcHVibGljOgorICBTdHJhdGVneUNob2ljZU1hbmFnZXIoU3RyYXRlZ3lDaG9pY2UmIHN0cmF0ZWd5Q2hvaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbik7CisKKyAgdmlydHVhbAorICB+U3RyYXRlZ3lDaG9pY2VNYW5hZ2VyKCk7CisKKyAgdm9pZAorICBvblN0cmF0ZWd5Q2hvaWNlUmVxdWVzdChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCk7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKworICB2b2lkCisgIGxpc3RTdHJhdGVnaWVzKGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KTsKKworICB2b2lkCisgIG9uVmFsaWRhdGVkU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0KGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0KTsKKworICB2b2lkCisgIHNldFN0cmF0ZWd5KENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICBDb250cm9sUmVzcG9uc2UmIHJlc3BvbnNlKTsKKworICB2b2lkCisgIHVuc2V0U3RyYXRlZ3koQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgQ29udHJvbFJlc3BvbnNlJiByZXNwb25zZSk7CisKK3ByaXZhdGU6CisKKyAgU3RyYXRlZ3lDaG9pY2UmIG1fc3RyYXRlZ3lDaG9pY2U7CisKKyAgU3RyYXRlZ3lDaG9pY2VQdWJsaXNoZXIgbV9saXN0UHVibGlzaGVyOworCisgIHN0YXRpYyBjb25zdCBOYW1lIENPTU1BTkRfUFJFRklYOyAvLyAvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UKKworICAvLyBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhbiBpbnZhbGlkLCBidXQgbm90IG1hbGZvcm1lZCwgdW5zaWduZWQgY29tbWFuZC4KKyAgLy8gKC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZSArIHZlcmIgKyBwYXJhbWV0ZXJzKSA9IDUKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBDT01NQU5EX1VOU0lHTkVEX05DT01QUzsKKworICAvLyBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhIHZhbGlkIHNpZ25lZCBJbnRlcmVzdC4KKyAgLy8gKHNlZSBVTlNJR05FRF9OQ09NUFMpLCA5IHdpdGggc2lnbmVkIEludGVyZXN0IHN1cHBvcnQuCisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ09NTUFORF9TSUdORURfTkNPTVBTOworCisgIHN0YXRpYyBjb25zdCBOYW1lIExJU1RfREFUQVNFVF9QUkVGSVg7IC8vIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZS9saXN0CisKK307CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9NR01UX1NUUkFURUdZX0NIT0lDRV9NQU5BR0VSX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9tZ210L3N0cmF0ZWd5LWNob2ljZS1wdWJsaXNoZXIuY3BwIGIvTkZEL2RhZW1vbi9tZ210L3N0cmF0ZWd5LWNob2ljZS1wdWJsaXNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2FjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLXB1Ymxpc2hlci5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgInN0cmF0ZWd5LWNob2ljZS1wdWJsaXNoZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9zdHJhdGVneS1jaG9pY2UuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1zdHJhdGVneS1jaG9pY2UuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKKworTkZEX0xPR19JTklUKCJTdHJhdGVneUNob2ljZVB1Ymxpc2hlciIpOworCisKK1N0cmF0ZWd5Q2hvaWNlUHVibGlzaGVyOjpTdHJhdGVneUNob2ljZVB1Ymxpc2hlcihjb25zdCBTdHJhdGVneUNob2ljZSYgc3RyYXRlZ3lDaG9pY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwRmFjZSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpLZXlDaGFpbiYga2V5Q2hhaW4pCisgIDogU2VnbWVudFB1Ymxpc2hlcihmYWNlLCBwcmVmaXgsIGtleUNoYWluKQorICAsIG1fc3RyYXRlZ3lDaG9pY2Uoc3RyYXRlZ3lDaG9pY2UpCit7CisKK30KKworU3RyYXRlZ3lDaG9pY2VQdWJsaXNoZXI6On5TdHJhdGVneUNob2ljZVB1Ymxpc2hlcigpCit7CisKK30KKworc2l6ZV90CitTdHJhdGVneUNob2ljZVB1Ymxpc2hlcjo6Z2VuZXJhdGUobmRuOjpFbmNvZGluZ0J1ZmZlciYgb3V0QnVmZmVyKQoreworICBzaXplX3QgdG90YWxMZW5ndGggPSAwOworCisgIGZvciAoU3RyYXRlZ3lDaG9pY2U6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX3N0cmF0ZWd5Q2hvaWNlLmJlZ2luKCk7CisgICAgICAgaSAhPSBtX3N0cmF0ZWd5Q2hvaWNlLmVuZCgpOworICAgICAgICsraSkKKyAgICB7CisgICAgICBuZG46Om5mZDo6U3RyYXRlZ3lDaG9pY2UgZW50cnk7CisKKyAgICAgIGVudHJ5LnNldE5hbWUoaS0+Z2V0UHJlZml4KCkpCisgICAgICAgICAgIC5zZXRTdHJhdGVneShpLT5nZXRTdHJhdGVneU5hbWUoKSk7CisKKyAgICAgIHRvdGFsTGVuZ3RoICs9IGVudHJ5LndpcmVFbmNvZGUob3V0QnVmZmVyKTsKKyAgICB9CisKKyAgcmV0dXJuIHRvdGFsTGVuZ3RoOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vbWdtdC9zdHJhdGVneS1jaG9pY2UtcHVibGlzaGVyLmhwcCBiL05GRC9kYWVtb24vbWdtdC9zdHJhdGVneS1jaG9pY2UtcHVibGlzaGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzIyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L3N0cmF0ZWd5LWNob2ljZS1wdWJsaXNoZXIuaHBwCkBAIC0wLDAgKzEsNjAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9NR01UX1NUUkFURUdZX0NIT0lDRV9QVUJMSVNIRVJfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fTUdNVF9TVFJBVEVHWV9DSE9JQ0VfUFVCTElTSEVSX0hQUAorCisjaW5jbHVkZSAiY29yZS9zZWdtZW50LXB1Ymxpc2hlci5ocHAiCisjaW5jbHVkZSAibWdtdC9hcHAtZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBTdHJhdGVneUNob2ljZTsKKworY2xhc3MgU3RyYXRlZ3lDaG9pY2VQdWJsaXNoZXIgOiBwdWJsaWMgU2VnbWVudFB1Ymxpc2hlcjxBcHBGYWNlPgoreworcHVibGljOgorICBTdHJhdGVneUNob2ljZVB1Ymxpc2hlcihjb25zdCBTdHJhdGVneUNob2ljZSYgc3RyYXRlZ3lDaG9pY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpLZXlDaGFpbiYga2V5Q2hhaW4pOworCisgIHZpcnR1YWwKKyAgflN0cmF0ZWd5Q2hvaWNlUHVibGlzaGVyKCk7CisKK3Byb3RlY3RlZDoKKworICB2aXJ0dWFsIHNpemVfdAorICBnZW5lcmF0ZShuZG46OkVuY29kaW5nQnVmZmVyJiBvdXRCdWZmZXIpOworCitwcml2YXRlOgorCisgIGNvbnN0IFN0cmF0ZWd5Q2hvaWNlJiBtX3N0cmF0ZWd5Q2hvaWNlOworCit9OworCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fTUdNVF9TVFJBVEVHWV9DSE9JQ0VfUFVCTElTSEVSX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi9tZ210L3RhYmxlcy1jb25maWctc2VjdGlvbi5jcHAgYi9ORkQvZGFlbW9uL21nbXQvdGFibGVzLWNvbmZpZy1zZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFlZDdmCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi9tZ210L3RhYmxlcy1jb25maWctc2VjdGlvbi5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ0YWJsZXMtY29uZmlnLXNlY3Rpb24uaHBwIgorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisjaW5jbHVkZSAiY29yZS9jb25maWctZmlsZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitORkRfTE9HX0lOSVQoIlRhYmxlc0NvbmZpZ1NlY3Rpb24iKTsKKworY29uc3Qgc2l6ZV90IFRhYmxlc0NvbmZpZ1NlY3Rpb246OkRFRkFVTFRfQ1NfTUFYX1BBQ0tFVFMgPSA2NTUzNjsKKworVGFibGVzQ29uZmlnU2VjdGlvbjo6VGFibGVzQ29uZmlnU2VjdGlvbihDcyYgY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpdCYgcGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWImIGZpYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyYXRlZ3lDaG9pY2UmIHN0cmF0ZWd5Q2hvaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlbWVudHMmIG1lYXN1cmVtZW50cykKKyAgOiBtX2NzKGNzKQorICAvLyAsIG1fcGl0KHBpdCkKKyAgLy8gLCBtX2ZpYihmaWIpCisgICwgbV9zdHJhdGVneUNob2ljZShzdHJhdGVneUNob2ljZSkKKyAgLy8gLCBtX21lYXN1cmVtZW50cyhtZWFzdXJlbWVudHMpCisgICwgbV9hcmVUYWJsZXNDb25maWd1cmVkKGZhbHNlKQoreworCit9CisKK3ZvaWQKK1RhYmxlc0NvbmZpZ1NlY3Rpb246OnNldENvbmZpZ0ZpbGUoQ29uZmlnRmlsZSYgY29uZmlnRmlsZSkKK3sKKyAgY29uZmlnRmlsZS5hZGRTZWN0aW9uSGFuZGxlcigidGFibGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZUYWJsZXNDb25maWdTZWN0aW9uOjpvbkNvbmZpZywgdGhpcywgXzEsIF8yLCBfMykpOworfQorCisKK3ZvaWQKK1RhYmxlc0NvbmZpZ1NlY3Rpb246OmVuc3VyZVRhYmxlc0FyZUNvbmZpZ3VyZWQoKQoreworICBpZiAobV9hcmVUYWJsZXNDb25maWd1cmVkKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgTkZEX0xPR19JTkZPKCJTZXR0aW5nIENTIG1heCBwYWNrZXRzIHRvICIgPDwgREVGQVVMVF9DU19NQVhfUEFDS0VUUyk7CisgIG1fY3Muc2V0TGltaXQoREVGQVVMVF9DU19NQVhfUEFDS0VUUyk7CisKKyAgbV9hcmVUYWJsZXNDb25maWd1cmVkID0gdHJ1ZTsKK30KKwordm9pZAorVGFibGVzQ29uZmlnU2VjdGlvbjo6b25Db25maWcoY29uc3QgQ29uZmlnU2VjdGlvbiYgY29uZmlnU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIC8vIHRhYmxlcworICAvLyB7CisgIC8vICAgIGNzX21heF9wYWNrZXRzIDY1NTM2CisgIC8vCisgIC8vICAgIHN0cmF0ZWd5X2Nob2ljZQorICAvLyAgICB7CisgIC8vICAgICAgIC8gICAgICAgICAgICAgICAvbG9jYWxob3N0L25mZC9zdHJhdGVneS9iZXN0LXJvdXRlCisgIC8vICAgICAgIC9sb2NhbGhvc3QgICAgICAvbG9jYWxob3N0L25mZC9zdHJhdGVneS9icm9hZGNhc3QKKyAgLy8gICAgICAgL2xvY2FsaG9zdC9uZmQgIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jlc3Qtcm91dGUKKyAgLy8gICAgICAgL25kbi9icm9hZGNhc3QgIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jyb2FkY2FzdAorICAvLyAgICB9CisgIC8vIH0KKworICBzaXplX3QgbkNzTWF4UGFja2V0cyA9IERFRkFVTFRfQ1NfTUFYX1BBQ0tFVFM7CisKKyAgYm9vc3Q6Om9wdGlvbmFsPGNvbnN0IENvbmZpZ1NlY3Rpb24mPiBjc01heFBhY2tldHNOb2RlID0KKyAgICBjb25maWdTZWN0aW9uLmdldF9jaGlsZF9vcHRpb25hbCgiY3NfbWF4X3BhY2tldHMiKTsKKworICBpZiAoY3NNYXhQYWNrZXRzTm9kZSkKKyAgICB7CisgICAgICBib29zdDo6b3B0aW9uYWw8c2l6ZV90PiB2YWxDc01heFBhY2tldHMgPQorICAgICAgICBjb25maWdTZWN0aW9uLmdldF9vcHRpb25hbDxzaXplX3Q+KCJjc19tYXhfcGFja2V0cyIpOworCisgICAgICBpZiAoIXZhbENzTWF4UGFja2V0cykKKyAgICAgICAgeworICAgICAgICAgIHRocm93IENvbmZpZ0ZpbGU6OkVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJjc19tYXhfcGFja2V0c1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gXCJ0YWJsZXNcIiBzZWN0aW9uIik7CisgICAgICAgIH0KKworICAgICAgbkNzTWF4UGFja2V0cyA9ICp2YWxDc01heFBhY2tldHM7CisgICAgfQorCisgIGJvb3N0OjpvcHRpb25hbDxjb25zdCBDb25maWdTZWN0aW9uJj4gc3RyYXRlZ3lDaG9pY2VTZWN0aW9uID0KKyAgICBjb25maWdTZWN0aW9uLmdldF9jaGlsZF9vcHRpb25hbCgic3RyYXRlZ3lfY2hvaWNlIik7CisKKyAgaWYgKHN0cmF0ZWd5Q2hvaWNlU2VjdGlvbikKKyAgICB7CisgICAgICBwcm9jZXNzU2VjdGlvblN0cmF0ZWd5Q2hvaWNlKCpzdHJhdGVneUNob2ljZVNlY3Rpb24sIGlzRHJ5UnVuKTsKKyAgICB9CisKKyAgaWYgKCFpc0RyeVJ1bikKKyAgICB7CisgICAgICBORkRfTE9HX0lORk8oIlNldHRpbmcgQ1MgbWF4IHBhY2tldHMgdG8gIiA8PCBuQ3NNYXhQYWNrZXRzKTsKKworICAgICAgbV9jcy5zZXRMaW1pdChuQ3NNYXhQYWNrZXRzKTsKKyAgICAgIG1fYXJlVGFibGVzQ29uZmlndXJlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkCitUYWJsZXNDb25maWdTZWN0aW9uOjpwcm9jZXNzU2VjdGlvblN0cmF0ZWd5Q2hvaWNlKGNvbnN0IENvbmZpZ1NlY3Rpb24mIGNvbmZpZ1NlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4pCit7CisgIC8vIHN0cmF0ZWd5X2Nob2ljZQorICAvLyB7CisgIC8vICAgLyAgICAgICAgICAgICAgIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jlc3Qtcm91dGUKKyAgLy8gICAvbG9jYWxob3N0ICAgICAgL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvYnJvYWRjYXN0CisgIC8vICAgL2xvY2FsaG9zdC9uZmQgIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jlc3Qtcm91dGUKKyAgLy8gICAvbmRuL2Jyb2FkY2FzdCAgL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvYnJvYWRjYXN0CisgIC8vIH0KKworICBzdGQ6Om1hcDxOYW1lLCBOYW1lPiBjaG9pY2VzOworCisgIGZvciAoY29uc3QgYXV0byYgcHJlZml4QW5kU3RyYXRlZ3kgOiBjb25maWdTZWN0aW9uKQorICAgIHsKKyAgICAgIGNvbnN0IE5hbWUgcHJlZml4KHByZWZpeEFuZFN0cmF0ZWd5LmZpcnN0KTsKKyAgICAgIGlmIChjaG9pY2VzLmZpbmQocHJlZml4KSAhPSBjaG9pY2VzLmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIkR1cGxpY2F0ZSBzdHJhdGVneSBjaG9pY2UgZm9yIHByZWZpeCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeC50b1VyaSgpICsgIlwiIGluIFwic3RyYXRlZ3lfY2hvaWNlXCIgc2VjdGlvbiIpOworICAgICAgICB9CisKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmF0ZWd5U3RyaW5nKHByZWZpeEFuZFN0cmF0ZWd5LnNlY29uZC5nZXRfdmFsdWU8c3RkOjpzdHJpbmc+KCkpOworICAgICAgaWYgKHN0cmF0ZWd5U3RyaW5nLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiSW52YWxpZCBzdHJhdGVneSBjaG9pY2UgXCJcIiBmb3IgcHJlZml4IFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LnRvVXJpKCkgKyAiXCIgaW4gXCJzdHJhdGVneV9jaG9pY2VcIiBzZWN0aW9uIik7CisgICAgICAgIH0KKworICAgICAgY29uc3QgTmFtZSBzdHJhdGVneU5hbWUoc3RyYXRlZ3lTdHJpbmcpOworICAgICAgaWYgKCFtX3N0cmF0ZWd5Q2hvaWNlLmhhc1N0cmF0ZWd5KHN0cmF0ZWd5TmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBDb25maWdGaWxlOjpFcnJvcigiSW52YWxpZCBzdHJhdGVneSBjaG9pY2UgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneU5hbWUudG9VcmkoKSArICJcIiBmb3IgcHJlZml4IFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LnRvVXJpKCkgKyAiXCIgaW4gXCJzdHJhdGVneV9jaG9pY2VcIiBzZWN0aW9uIik7CisgICAgICAgIH0KKworICAgICAgY2hvaWNlc1twcmVmaXhdID0gc3RyYXRlZ3lOYW1lOworICAgIH0KKworCisgIGZvciAoY29uc3QgYXV0byYgcHJlZml4QW5kU3RyYXRlZ3kgOiBjaG9pY2VzKQorICAgIHsKKyAgICAgIGlmICghaXNEcnlSdW4gJiYgIW1fc3RyYXRlZ3lDaG9pY2UuaW5zZXJ0KHByZWZpeEFuZFN0cmF0ZWd5LmZpcnN0LCBwcmVmaXhBbmRTdHJhdGVneS5zZWNvbmQpKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIkZhaWxlZCB0byBzZXQgc3RyYXRlZ3kgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhBbmRTdHJhdGVneS5zZWNvbmQudG9VcmkoKSArICJcIiBmb3IgcHJlZml4IFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4QW5kU3RyYXRlZ3kuZmlyc3QudG9VcmkoKSArICJcIiBpbiBcInN0cmF0ZWd5X2Nob2ljZXZcIiIpOworICAgICAgICB9CisgICAgfQorfQorCisKKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL21nbXQvdGFibGVzLWNvbmZpZy1zZWN0aW9uLmhwcCBiL05GRC9kYWVtb24vbWdtdC90YWJsZXMtY29uZmlnLXNlY3Rpb24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTMyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL21nbXQvdGFibGVzLWNvbmZpZy1zZWN0aW9uLmhwcApAQCAtMCwwICsxLDgxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9NR01UX1RBQkxFU19DT05GSUdfU0VDVElPTl9IUFAKKyNkZWZpbmUgTkZEX01HTVRfVEFCTEVTX0NPTkZJR19TRUNUSU9OX0hQUAorCisjaW5jbHVkZSAidGFibGUvZmliLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9waXQuaHBwIgorI2luY2x1ZGUgInRhYmxlL2NzLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9tZWFzdXJlbWVudHMuaHBwIgorI2luY2x1ZGUgInRhYmxlL3N0cmF0ZWd5LWNob2ljZS5ocHAiCisKKyNpbmNsdWRlICJjb3JlL2NvbmZpZy1maWxlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK2NsYXNzIFRhYmxlc0NvbmZpZ1NlY3Rpb24KK3sKK3B1YmxpYzoKKyAgVGFibGVzQ29uZmlnU2VjdGlvbihDcyYgY3MsCisgICAgICAgICAgICAgICAgICAgICAgUGl0JiBwaXQsCisgICAgICAgICAgICAgICAgICAgICAgRmliJiBmaWIsCisgICAgICAgICAgICAgICAgICAgICAgU3RyYXRlZ3lDaG9pY2UmIHN0cmF0ZWd5Q2hvaWNlLAorICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVtZW50cyYgbWVhc3VyZW1lbnRzKTsKKworICB2b2lkCisgIHNldENvbmZpZ0ZpbGUoQ29uZmlnRmlsZSYgY29uZmlnRmlsZSk7CisKKyAgdm9pZAorICBlbnN1cmVUYWJsZXNBcmVDb25maWd1cmVkKCk7CisKK3ByaXZhdGU6CisKKyAgdm9pZAorICBvbkNvbmZpZyhjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLAorICAgICAgICAgICBib29sIGlzRHJ5UnVuLAorICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCisgIHZvaWQKKyAgcHJvY2Vzc1NlY3Rpb25TdHJhdGVneUNob2ljZShjb25zdCBDb25maWdTZWN0aW9uJiBjb25maWdTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4pOworCitwcml2YXRlOgorICBDcyYgbV9jczsKKyAgLy8gUGl0JiBtX3BpdDsKKyAgLy8gRmliJiBtX2ZpYjsKKyAgU3RyYXRlZ3lDaG9pY2UmIG1fc3RyYXRlZ3lDaG9pY2U7CisgIC8vIE1lYXN1cmVtZW50cyYgbV9tZWFzdXJlbWVudHM7CisKKyAgYm9vbCBtX2FyZVRhYmxlc0NvbmZpZ3VyZWQ7CisKK3ByaXZhdGU6CisKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBERUZBVUxUX0NTX01BWF9QQUNLRVRTOworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfTUdNVF9UQUJMRVNfQ09ORklHX1NFQ1RJT05fSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL2NzLWVudHJ5LmNwcCBiL05GRC9kYWVtb24vdGFibGUvY3MtZW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2RlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL2NzLWVudHJ5LmNwcApAQCAtMCwwICsxLDczIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBcYXV0aG9yIElseWEgTW9pc2VlbmtvIDxodHRwOi8vaWx5YW1vaXNlZW5rby5jb20vPgorICogXGF1dGhvciBKdW54aWFvIFNoaSA8aHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9wZW9wbGUvc2hpanVueGlhby8+CisgKiBcYXV0aG9yIEFsZXhhbmRlciBBZmFuYXN5ZXYgPGh0dHA6Ly9sYXNyLmNzLnVjbGEuZWR1L2FmYW5hc3lldi9pbmRleC5odG1sPgorICovCisKKyNpbmNsdWRlICJjcy1lbnRyeS5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBjcyB7CisKK05GRF9MT0dfSU5JVCgiQ3NFbnRyeSIpOworCitFbnRyeTo6RW50cnkoKQorICA6IG1faXNVbnNvbGljaXRlZChmYWxzZSkKK3sKK30KKwordm9pZAorRW50cnk6OnNldERhdGEoY29uc3QgRGF0YSYgZGF0YSwgYm9vbCBpc1Vuc29saWNpdGVkKQoreworICBtX2lzVW5zb2xpY2l0ZWQgPSBpc1Vuc29saWNpdGVkOworICBtX2RhdGFQYWNrZXQgPSBkYXRhLnNoYXJlZF9mcm9tX3RoaXMoKTsKKworICB1cGRhdGVTdGFsZVRpbWUoKTsKK30KKwordm9pZAorRW50cnk6OnVwZGF0ZVN0YWxlVGltZSgpCit7CisgIG1fc3RhbGVBdCA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBtX2RhdGFQYWNrZXQtPmdldEZyZXNobmVzc1BlcmlvZCgpOworfQorCitib29sCitFbnRyeTo6aXNTdGFsZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX3N0YWxlQXQgPCB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpOworfQorCit2b2lkCitFbnRyeTo6cmVzZXQoKQoreworICBtX3N0YWxlQXQgPSB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCgpOworICBtX2RhdGFQYWNrZXQucmVzZXQoKTsKKyAgbV9pc1Vuc29saWNpdGVkID0gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vdGFibGUvY3MtZW50cnkuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9jcy1lbnRyeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMmZmZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvY3MtZW50cnkuaHBwCkBAIC0wLDAgKzEsMTQzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBcYXV0aG9yIElseWEgTW9pc2VlbmtvIDxodHRwOi8vaWx5YW1vaXNlZW5rby5jb20vPgorICogXGF1dGhvciBKdW54aWFvIFNoaSA8aHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9wZW9wbGUvc2hpanVueGlhby8+CisgKiBcYXV0aG9yIEFsZXhhbmRlciBBZmFuYXN5ZXYgPGh0dHA6Ly9sYXNyLmNzLnVjbGEuZWR1L2FmYW5hc3lldi9pbmRleC5odG1sPgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9DU19FTlRSWV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9UQUJMRV9DU19FTlRSWV9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIGNzIHsKKworY2xhc3MgRW50cnk7CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyBhIGJhc2UgY2xhc3MgZm9yIENTIGVudHJ5CisgKi8KK2NsYXNzIEVudHJ5IDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgRW50cnkoKTsKKworICAvKiogXGJyaWVmIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIERhdGEgcGFja2V0IHN0b3JlZCBpbiB0aGUgQ1MgZW50cnkKKyAgICogIFxyZXR1cm57IE5ETiBuYW1lIH0KKyAgICovCisgIGNvbnN0IE5hbWUmCisgIGdldE5hbWUoKSBjb25zdDsKKworICAvKiogXGJyaWVmIHJldHVybnMgdGhlIGZ1bGwgbmFtZSAoaW5jbHVkaW5nIGltcGxpY2l0IGRpZ2VzdCkgb2YgdGhlIERhdGEgcGFja2V0IHN0b3JlZAorICAgKiAgICAgICAgIGluIHRoZSBDUyBlbnRyeQorICAgKiAgXHJldHVybnsgTkROIG5hbWUgfQorICAgKi8KKyAgY29uc3QgTmFtZSYKKyAgZ2V0RnVsbE5hbWUoKSBjb25zdDsKKworICAvKiogXGJyaWVmIERhdGEgcGFja2V0IGlzIHVuc29saWNpdGVkIGlmIHRoaXMgcGFydGljdWxhciBORE4gbm9kZQorICAgKiAgZGlkIG5vdCByZWNlaXZlIGFuIEludGVyZXN0IHBhY2tldCBmb3IgaXQsIG9yIHRoZSBJbnRlcmVzdCBwYWNrZXQgaGFzIGFscmVhZHkgZXhwaXJlZAorICAgKiAgXHJldHVybnsgVHJ1ZSBpZiB0aGUgRGF0YSBwYWNrZXQgaXMgdW5zb2xpY2l0ZWQ7IG90aGVyd2lzZSBGYWxzZSAgfQorICAgKi8KKyAgYm9vbAorICBpc1Vuc29saWNpdGVkKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIHRoZSBEYXRhIHBhY2tldCBzdG9yZWQgaW4gdGhlIENTIGVudHJ5CisgICAqLworICBjb25zdCBEYXRhJgorICBnZXREYXRhKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBjaGFuZ2VzIHRoZSBjb250ZW50IG9mIENTIGVudHJ5IGFuZCByZWNvbXB1dGVzIGRpZ2VzdAorICAgKi8KKyAgdm9pZAorICBzZXREYXRhKGNvbnN0IERhdGEmIGRhdGEsIGJvb2wgaXNVbnNvbGljaXRlZCk7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIHRoZSBhYnNvbHV0ZSB0aW1lIHdoZW4gRGF0YSBiZWNvbWVzIGV4cGlyZWQKKyAgICogIFxyZXR1cm57IFRpbWUgKHJlc29sdXRpb24gdXAgdG8gdGltZTo6bWlsbGlzZWNvbmRzKSB9CisgICAqLworICBjb25zdCB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCYKKyAgZ2V0U3RhbGVUaW1lKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiByZWZyZXNoZXMgdGhlIHRpbWUgd2hlbiBEYXRhIGJlY29tZXMgZXhwaXJlZAorICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGFic29sdXRlIHRpbWUuCisgICAqLworICB2b2lkCisgIHVwZGF0ZVN0YWxlVGltZSgpOworCisgIC8qKiBcYnJpZWYgY2hlY2tzIGlmIHRoZSBzdG9yZWQgRGF0YSBpcyBzdGFsZQorICAgKi8KKyAgYm9vbAorICBpc1N0YWxlKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBjbGVhcnMgQ1MgZW50cnkKKyAgICogIEFmdGVyIHJlc2V0LCAqdGhpcyA9PSBFbnRyeSgpCisgICAqLworICB2b2lkCisgIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IG1fc3RhbGVBdDsKKyAgc2hhcmVkX3B0cjxjb25zdCBEYXRhPiBtX2RhdGFQYWNrZXQ7CisKKyAgYm9vbCBtX2lzVW5zb2xpY2l0ZWQ7Cit9OworCitpbmxpbmUgY29uc3QgTmFtZSYKK0VudHJ5OjpnZXROYW1lKCkgY29uc3QKK3sKKyAgQk9PU1RfQVNTRVJUKG1fZGF0YVBhY2tldCAhPSBudWxscHRyKTsKKyAgcmV0dXJuIG1fZGF0YVBhY2tldC0+Z2V0TmFtZSgpOworfQorCitpbmxpbmUgY29uc3QgTmFtZSYKK0VudHJ5OjpnZXRGdWxsTmFtZSgpIGNvbnN0Cit7CisgIEJPT1NUX0FTU0VSVChtX2RhdGFQYWNrZXQgIT0gbnVsbHB0cik7CisgIHJldHVybiBtX2RhdGFQYWNrZXQtPmdldEZ1bGxOYW1lKCk7Cit9CisKK2lubGluZSBjb25zdCBEYXRhJgorRW50cnk6OmdldERhdGEoKSBjb25zdAoreworICBCT09TVF9BU1NFUlQobV9kYXRhUGFja2V0ICE9IG51bGxwdHIpOworICByZXR1cm4gKm1fZGF0YVBhY2tldDsKK30KKworaW5saW5lIGJvb2wKK0VudHJ5Ojppc1Vuc29saWNpdGVkKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1faXNVbnNvbGljaXRlZDsKK30KKworaW5saW5lIGNvbnN0IHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50JgorRW50cnk6OmdldFN0YWxlVGltZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX3N0YWxlQXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNzCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fVEFCTEVfQ1NfRU5UUllfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL2NzLXNraXAtbGlzdC1lbnRyeS5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL2NzLXNraXAtbGlzdC1lbnRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1ZjBkMQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvY3Mtc2tpcC1saXN0LWVudHJ5LmNwcApAQCAtMCwwICsxLDcyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBcYXV0aG9yIElseWEgTW9pc2VlbmtvIDxodHRwOi8vaWx5YW1vaXNlZW5rby5jb20vPgorICogXGF1dGhvciBKdW54aWFvIFNoaSA8aHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9wZW9wbGUvc2hpanVueGlhby8+CisgKiBcYXV0aG9yIEFsZXhhbmRlciBBZmFuYXN5ZXYgPGh0dHA6Ly9sYXNyLmNzLnVjbGEuZWR1L2FmYW5hc3lldi9pbmRleC5odG1sPgorICovCisKKyNpbmNsdWRlICJjcy1za2lwLWxpc3QtZW50cnkuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgY3MgeworbmFtZXNwYWNlIHNraXBfbGlzdCB7CisKK05GRF9MT0dfSU5JVCgiQ3NTa2lwTGlzdEVudHJ5Iik7CisKK3ZvaWQKK0VudHJ5OjpyZWxlYXNlKCkKK3sKKyAgQk9PU1RfQVNTRVJUKG1fbGF5ZXJJdGVyYXRvcnMuZW1wdHkoKSk7CisKKyAgcmVzZXQoKTsKK30KKwordm9pZAorRW50cnk6OnNldEl0ZXJhdG9yKGludCBsYXllciwgY29uc3QgRW50cnk6OkxheWVySXRlcmF0b3JzOjptYXBwZWRfdHlwZSYgbGF5ZXJJdGVyYXRvcikKK3sKKyAgbV9sYXllckl0ZXJhdG9yc1tsYXllcl0gPSBsYXllckl0ZXJhdG9yOworfQorCit2b2lkCitFbnRyeTo6cmVtb3ZlSXRlcmF0b3IoaW50IGxheWVyKQoreworICBtX2xheWVySXRlcmF0b3JzLmVyYXNlKGxheWVyKTsKK30KKwordm9pZAorRW50cnk6OnByaW50SXRlcmF0b3JzKCkgY29uc3QKK3sKKyAgZm9yIChMYXllckl0ZXJhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2xheWVySXRlcmF0b3JzLmJlZ2luKCk7CisgICAgICAgaXQgIT0gbV9sYXllckl0ZXJhdG9ycy5lbmQoKTsKKyAgICAgICArK2l0KQorICAgIHsKKyAgICAgIE5GRF9MT0dfVFJBQ0UoIlsiIDw8IGl0LT5maXJzdCA8PCAiXSIgPDwgIiAiIDw8ICYoKml0LT5zZWNvbmQpKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIHNraXBfbGlzdAorfSAvLyBuYW1lc3BhY2UgY3MKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9jcy1za2lwLWxpc3QtZW50cnkuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9jcy1za2lwLWxpc3QtZW50cnkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjhjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL2NzLXNraXAtbGlzdC1lbnRyeS5ocHAKQEAgLTAsMCArMSw4OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogXGF1dGhvciBJbHlhIE1vaXNlZW5rbyA8aHR0cDovL2lseWFtb2lzZWVua28uY29tLz4KKyAqIFxhdXRob3IgSnVueGlhbyBTaGkgPGh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvcGVvcGxlL3NoaWp1bnhpYW8vPgorICogXGF1dGhvciBBbGV4YW5kZXIgQWZhbmFzeWV2IDxodHRwOi8vbGFzci5jcy51Y2xhLmVkdS9hZmFuYXN5ZXYvaW5kZXguaHRtbD4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fVEFCTEVfQ1NfU0tJUF9MSVNUX0VOVFJZX0hQUAorI2RlZmluZSBORkRfREFFTU9OX1RBQkxFX0NTX1NLSVBfTElTVF9FTlRSWV9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisjaW5jbHVkZSAiY3MtZW50cnkuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBjcyB7CituYW1lc3BhY2Ugc2tpcF9saXN0IHsKKworLyoqIFxicmllZiByZXByZXNlbnRzIGFuIGVudHJ5IGluIGEgQ1Mgd2l0aCBza2lwIGxpc3QgaW1wbGVtZW50YXRpb24KKyAqLworY2xhc3MgRW50cnkgOiBwdWJsaWMgY3M6OkVudHJ5Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjptYXA8aW50LCBzdGQ6Omxpc3Q8RW50cnkqPjo6aXRlcmF0b3IgPiBMYXllckl0ZXJhdG9yczsKKworICBFbnRyeSgpID0gZGVmYXVsdDsKKworICAvKiogXGJyaWVmIHJlbGVhc2VzIHJlZmVyZW5jZSBjb3VudHMgb24gc2hhcmVkIG9iamVjdHMKKyAgICovCisgIHZvaWQKKyAgcmVsZWFzZSgpOworCisgIC8qKiBcYnJpZWYgc2F2ZXMgdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBDUyBlbnRyeSBvbiBhIHNwZWNpZmljIGxheWVyIG9mIHNraXAgbGlzdAorICAgKi8KKyAgdm9pZAorICBzZXRJdGVyYXRvcihpbnQgbGF5ZXIsIGNvbnN0IExheWVySXRlcmF0b3JzOjptYXBwZWRfdHlwZSYgbGF5ZXJJdGVyYXRvcik7CisKKyAgLyoqIFxicmllZiByZW1vdmVzIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgQ1MgZW50cnkgb24gYSBzcGVjaWZpYyBsYXllciBvZiBza2lwIGxpc3QKKyAgICovCisgIHZvaWQKKyAgcmVtb3ZlSXRlcmF0b3IoaW50IGxheWVyKTsKKworICAvKiogXGJyaWVmIHJldHVybnMgdGhlIHRhYmxlIGNvbnRhaW5pbmcgPGxheWVyLCBpdGVyYXRvcj4gcGFpcnMuCisgICAqLworICBjb25zdCBMYXllckl0ZXJhdG9ycyYKKyAgZ2V0SXRlcmF0b3JzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8qKiBcYnJpZWYgcHJpbnRzIDxsYXllciwgaXRlcmF0b3I+IHBhaXJzLgorICAgKi8KKyAgdm9pZAorICBwcmludEl0ZXJhdG9ycygpIGNvbnN0OworCitwcml2YXRlOgorICBMYXllckl0ZXJhdG9ycyBtX2xheWVySXRlcmF0b3JzOworfTsKKworaW5saW5lIGNvbnN0IEVudHJ5OjpMYXllckl0ZXJhdG9ycyYKK0VudHJ5OjpnZXRJdGVyYXRvcnMoKSBjb25zdAoreworICByZXR1cm4gbV9sYXllckl0ZXJhdG9yczsKK30KKworfSAvLyBuYW1lc3BhY2Ugc2tpcF9saXN0Cit9IC8vIG5hbWVzcGFjZSBjcworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX1RBQkxFX0NTX1NLSVBfTElTVF9FTlRSWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vdGFibGUvY3MuY3BwIGIvTkZEL2RhZW1vbi90YWJsZS9jcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3NmRlZgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvY3MuY3BwCkBAIC0wLDAgKzEsODQ3IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBcYXV0aG9yIElseWEgTW9pc2VlbmtvIDxodHRwOi8vaWx5YW1vaXNlZW5rby5jb20vPgorICogXGF1dGhvciBKdW54aWFvIFNoaSA8aHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS9wZW9wbGUvc2hpanVueGlhby8+CisgKiBcYXV0aG9yIEFsZXhhbmRlciBBZmFuYXN5ZXYgPGh0dHA6Ly9sYXNyLmNzLnVjbGEuZWR1L2FmYW5hc3lldi9pbmRleC5odG1sPgorICovCisKKyNpbmNsdWRlICJjcy5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvcmFuZG9tLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9jcnlwdG8uaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkvc2lnbmF0dXJlLXNoYTI1Ni13aXRoLXJzYS5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9yYW5kb20vYmVybm91bGxpX2Rpc3RyaWJ1dGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY29uY2VwdC9hc3NlcnQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvbmNlcHRfY2hlY2suaHBwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLy8gbWF4IHNraXAgbGlzdCBsYXllcnMKK3N0YXRpYyBjb25zdCBzaXplX3QgU0tJUExJU1RfTUFYX0xBWUVSUyA9IDMyOworLy8vIHByb2JhYmlsaXR5IGZvciBhbiBlbnRyeSBpbiBsYXllciBOIHRvIGFwcGVhciBhbHNvIGluIGxheWVyIE4rMQorc3RhdGljIGNvbnN0IGRvdWJsZSBTS0lQTElTVF9QUk9CQUJJTElUWSA9IDAuMjU7CisKK05GRF9MT0dfSU5JVCgiQ29udGVudFN0b3JlIik7CisKK25hbWVzcGFjZSBuZmQgeworCisvLyBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0ZvcndhcmRJdGVyYXRvcgorQk9PU1RfQ09OQ0VQVF9BU1NFUlQoKGJvb3N0OjpGb3J3YXJkSXRlcmF0b3I8Q3M6OmNvbnN0X2l0ZXJhdG9yPikpOworLy8gYm9vc3Q6OkZvcndhcmRJdGVyYXRvciBmb2xsb3dzIFNHSSBzdGFuZGFyZCBodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvRm9yd2FyZEl0ZXJhdG9yLmh0bWwsCisvLyB3aGljaCBkb2Vzbid0IHJlcXVpcmUgRGVmYXVsdENvbnN0cnVjdGlibGUKKyNpZmRlZiBIQVZFX0lTX0RFRkFVTFRfQ09OU1RSVUNUSUJMRQorc3RhdGljX2Fzc2VydChzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxDczo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIkNzOjpjb25zdF9pdGVyYXRvciBtdXN0IGJlIGRlZmF1bHQtY29uc3RydWN0aWJsZSIpOworI2Vsc2UKK0JPT1NUX0NPTkNFUFRfQVNTRVJUKChib29zdDo6RGVmYXVsdENvbnN0cnVjdGlibGU8Q3M6OmNvbnN0X2l0ZXJhdG9yPikpOworI2VuZGlmIC8vIEhBVkVfSVNfREVGQVVMVF9DT05TVFJVQ1RJQkxFCisKK0NzOjpDcyhzaXplX3Qgbk1heFBhY2tldHMpCisgIDogbV9uTWF4UGFja2V0cyhuTWF4UGFja2V0cykKKyAgLCBtX25QYWNrZXRzKDApCit7CisgIFNraXBMaXN0TGF5ZXIqIHplcm9MYXllciA9IG5ldyBTa2lwTGlzdExheWVyKCk7CisgIG1fc2tpcExpc3QucHVzaF9iYWNrKHplcm9MYXllcik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX25NYXhQYWNrZXRzOyBpKyspCisgICAgbV9mcmVlQ3NFbnRyaWVzLnB1c2gobmV3IGNzOjpza2lwX2xpc3Q6OkVudHJ5KCkpOworfQorCitDczo6fkNzKCkKK3sKKyAgLy8gZXZpY3QgYWxsIGl0ZW1zIGZyb20gQ1MKKyAgd2hpbGUgKGV2aWN0SXRlbSgpKQorICAgIDsKKworICBCT09TVF9BU1NFUlQobV9mcmVlQ3NFbnRyaWVzLnNpemUoKSA9PSBtX25NYXhQYWNrZXRzKTsKKworICB3aGlsZSAoIW1fZnJlZUNzRW50cmllcy5lbXB0eSgpKQorICAgIHsKKyAgICAgIGRlbGV0ZSBtX2ZyZWVDc0VudHJpZXMuZnJvbnQoKTsKKyAgICAgIG1fZnJlZUNzRW50cmllcy5wb3AoKTsKKyAgICB9Cit9CisKK3NpemVfdAorQ3M6OnNpemUoKSBjb25zdAoreworICByZXR1cm4gbV9uUGFja2V0czsgLy8gc2l6ZSBvZiB0aGUgZmlyc3QgbGF5ZXIgaW4gYSBza2lwIGxpc3QKK30KKwordm9pZAorQ3M6OnNldExpbWl0KHNpemVfdCBuTWF4UGFja2V0cykKK3sKKyAgc2l6ZV90IG9sZE5NYXhQYWNrZXRzID0gbV9uTWF4UGFja2V0czsKKyAgbV9uTWF4UGFja2V0cyA9IG5NYXhQYWNrZXRzOworCisgIHdoaWxlIChzaXplKCkgPiBtX25NYXhQYWNrZXRzKSB7CisgICAgZXZpY3RJdGVtKCk7CisgIH0KKworICBpZiAobV9uTWF4UGFja2V0cyA+PSBvbGROTWF4UGFja2V0cykgeworICAgIGZvciAoc2l6ZV90IGkgPSBvbGROTWF4UGFja2V0czsgaSA8IG1fbk1heFBhY2tldHM7IGkrKykgeworICAgICAgbV9mcmVlQ3NFbnRyaWVzLnB1c2gobmV3IGNzOjpza2lwX2xpc3Q6OkVudHJ5KCkpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmb3IgKHNpemVfdCBpID0gb2xkTk1heFBhY2tldHM7IGkgPiBtX25NYXhQYWNrZXRzOyBpLS0pIHsKKyAgICAgIGRlbGV0ZSBtX2ZyZWVDc0VudHJpZXMuZnJvbnQoKTsKKyAgICAgIG1fZnJlZUNzRW50cmllcy5wb3AoKTsKKyAgICB9CisgIH0KK30KKworc2l6ZV90CitDczo6Z2V0TGltaXQoKSBjb25zdAoreworICByZXR1cm4gbV9uTWF4UGFja2V0czsKK30KKworLy9SZWZlcmVuY2U6ICJTa2lwIExpc3RzOiBBIFByb2JhYmlsaXN0aWMgQWx0ZXJuYXRpdmUgdG8gQmFsYW5jZWQgVHJlZXMiIGJ5IFcuUHVnaAorc3RkOjpwYWlyPGNzOjpza2lwX2xpc3Q6OkVudHJ5KiwgYm9vbD4KK0NzOjppbnNlcnRUb1NraXBMaXN0KGNvbnN0IERhdGEmIGRhdGEsIGJvb2wgaXNVbnNvbGljaXRlZCkKK3sKKyAgTkZEX0xPR19UUkFDRSgiaW5zZXJ0VG9Ta2lwTGlzdCgpICIgPDwgZGF0YS5nZXRGdWxsTmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic2tpcExpc3Qgc2l6ZSAiIDw8IHNpemUoKSk7CisKKyAgQk9PU1RfQVNTRVJUKG1fY2xlYW51cEluZGV4LnNpemUoKSA8PSBzaXplKCkpOworICBCT09TVF9BU1NFUlQobV9mcmVlQ3NFbnRyaWVzLnNpemUoKSA+IDApOworCisgIC8vIHRha2UgZW50cnkgZm9yIHRoZSBtZW1vcnkgcG9vbAorICBjczo6c2tpcF9saXN0OjpFbnRyeSogZW50cnkgPSBtX2ZyZWVDc0VudHJpZXMuZnJvbnQoKTsKKyAgbV9mcmVlQ3NFbnRyaWVzLnBvcCgpOworICBtX25QYWNrZXRzKys7CisgIGVudHJ5LT5zZXREYXRhKGRhdGEsIGlzVW5zb2xpY2l0ZWQpOworCisgIGJvb2wgaW5zZXJ0SW5Gcm9udCA9IGZhbHNlOworICBib29sIGlzSXRlcmF0ZWQgPSBmYWxzZTsKKyAgU2tpcExpc3Q6OnJldmVyc2VfaXRlcmF0b3IgdG9wTGF5ZXIgPSBtX3NraXBMaXN0LnJiZWdpbigpOworICBTa2lwTGlzdExheWVyOjppdGVyYXRvciB1cGRhdGVUYWJsZVtTS0lQTElTVF9NQVhfTEFZRVJTXTsKKyAgU2tpcExpc3RMYXllcjo6aXRlcmF0b3IgaGVhZCA9ICgqdG9wTGF5ZXIpLT5iZWdpbigpOworCisgIGlmICghKCp0b3BMYXllciktPmVtcHR5KCkpCisgICAgeworICAgICAgLy9zdGFydCBmcm9tIHRoZSB1cHBlciBsYXllciB0b3dhcmRzIGJvdHRvbQorICAgICAgaW50IGxheWVyID0gbV9za2lwTGlzdC5zaXplKCkgLSAxOworICAgICAgZm9yIChTa2lwTGlzdDo6cmV2ZXJzZV9pdGVyYXRvciByaXQgPSB0b3BMYXllcjsgcml0ICE9IG1fc2tpcExpc3QucmVuZCgpOyArK3JpdCkKKyAgICAgICAgeworICAgICAgICAgIC8vaWYgd2UgZGlkbid0IGRvIGFueSBpdGVyYXRpb25zIG9uIHRoZSBoaWdoZXIgbGF5ZXJzLCBzdGFydCBmcm9tIHRoZSBiZWdpbigpIGFnYWluCisgICAgICAgICAgaWYgKCFpc0l0ZXJhdGVkKQorICAgICAgICAgICAgaGVhZCA9ICgqcml0KS0+YmVnaW4oKTsKKworICAgICAgICAgIHVwZGF0ZVRhYmxlW2xheWVyXSA9IGhlYWQ7CisKKyAgICAgICAgICBpZiAoaGVhZCAhPSAoKnJpdCktPmVuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBpdCBjYW4gaGFwcGVuIHdoZW4gYmVnaW4oKSBjb250YWlucyB0aGUgZWxlbWVudCBpbiBmcm9udCBvZiB3aGljaCB3ZSBuZWVkIHRvIGluc2VydAorICAgICAgICAgICAgICBpZiAoIWlzSXRlcmF0ZWQgJiYgKCgqaGVhZCktPmdldEZ1bGxOYW1lKCkgPj0gZW50cnktPmdldEZ1bGxOYW1lKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC0tdXBkYXRlVGFibGVbbGF5ZXJdOworICAgICAgICAgICAgICAgICAgaW5zZXJ0SW5Gcm9udCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgU2tpcExpc3RMYXllcjo6aXRlcmF0b3IgaXQgPSBoZWFkOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAoKCppdCktPmdldEZ1bGxOYW1lKCkgPCBlbnRyeS0+Z2V0RnVsbE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBpdDsKKyAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUYWJsZVtsYXllcl0gPSBpdDsKKyAgICAgICAgICAgICAgICAgICAgICBpc0l0ZXJhdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ID09ICgqcml0KS0+ZW5kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYXllciA+IDApCisgICAgICAgICAgICBoZWFkID0gKCpoZWFkKS0+Z2V0SXRlcmF0b3JzKCkuZmluZChsYXllciAtIDEpLT5zZWNvbmQ7IC8vIG1vdmUgSEVBRCB0byB0aGUgbG93ZXIgbGF5ZXIKKworICAgICAgICAgIGxheWVyLS07CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1cGRhdGVUYWJsZVswXSA9ICgqdG9wTGF5ZXIpLT5iZWdpbigpOyAvL2luaXRpYWxpemF0aW9uCisgICAgfQorCisgIGhlYWQgPSB1cGRhdGVUYWJsZVswXTsKKyAgKytoZWFkOyAvLyBsb29rIGF0IHRoZSBuZXh0IHNsb3QgdG8gY2hlY2sgaWYgaXQgY29udGFpbnMgYSBkdXBsaWNhdGUKKworICBib29sIGlzQ3NFbXB0eSA9IChzaXplKCkgPT0gMCk7CisgIGJvb2wgaXNJbkJvdW5kYXJpZXMgPSAoaGVhZCAhPSAoKm1fc2tpcExpc3QuYmVnaW4oKSktPmVuZCgpKTsKKyAgYm9vbCBpc05hbWVJZGVudGljYWwgPSBmYWxzZTsKKyAgaWYgKCFpc0NzRW1wdHkgJiYgaXNJbkJvdW5kYXJpZXMpCisgICAgeworICAgICAgaXNOYW1lSWRlbnRpY2FsID0gKCpoZWFkKS0+Z2V0RnVsbE5hbWUoKSA9PSBlbnRyeS0+Z2V0RnVsbE5hbWUoKTsKKyAgICB9CisKKyAgLy9jaGVjayBpZiB0aGlzIGlzIGEgZHVwbGljYXRlIHBhY2tldAorICBpZiAoaXNOYW1lSWRlbnRpY2FsKQorICAgIHsKKyAgICAgIE5GRF9MT0dfVFJBQ0UoIkR1cGxpY2F0ZSBuYW1lICh3aXRoIGRpZ2VzdCkiKTsKKworICAgICAgKCpoZWFkKS0+c2V0RGF0YShkYXRhLCBpc1Vuc29saWNpdGVkKTsgLy91cGRhdGVzIHN0YWxlIHRpbWUKKworICAgICAgLy8gbmV3IGVudHJ5IG5vdCBuZWVkZWQsIHJldHVybmluZyB0byB0aGUgcG9vbAorICAgICAgZW50cnktPnJlbGVhc2UoKTsKKyAgICAgIG1fZnJlZUNzRW50cmllcy5wdXNoKGVudHJ5KTsKKyAgICAgIG1fblBhY2tldHMtLTsKKworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCpoZWFkLCBmYWxzZSk7CisgICAgfQorCisgIE5GRF9MT0dfVFJBQ0UoIk5vdCBhIGR1cGxpY2F0ZSIpOworCisgIHNpemVfdCByYW5kb21MYXllciA9IHBpY2tSYW5kb21MYXllcigpOworCisgIHdoaWxlIChtX3NraXBMaXN0LnNpemUoKSA8IHJhbmRvbUxheWVyICsgMSkKKyAgICB7CisgICAgICBTa2lwTGlzdExheWVyKiBuZXdMYXllciA9IG5ldyBTa2lwTGlzdExheWVyKCk7CisgICAgICBtX3NraXBMaXN0LnB1c2hfYmFjayhuZXdMYXllcik7CisKKyAgICAgIHVwZGF0ZVRhYmxlWyhtX3NraXBMaXN0LnNpemUoKSAtIDEpXSA9IG5ld0xheWVyLT5iZWdpbigpOworICAgIH0KKworICBzaXplX3QgbGF5ZXIgPSAwOworICBmb3IgKFNraXBMaXN0OjppdGVyYXRvciBpID0gbV9za2lwTGlzdC5iZWdpbigpOworICAgICAgIGkgIT0gbV9za2lwTGlzdC5lbmQoKSAmJiBsYXllciA8PSByYW5kb21MYXllcjsgKytpKQorICAgIHsKKyAgICAgIGlmICh1cGRhdGVUYWJsZVtsYXllcl0gPT0gKCppKS0+ZW5kKCkgJiYgIWluc2VydEluRnJvbnQpCisgICAgICAgIHsKKyAgICAgICAgICAoKmkpLT5wdXNoX2JhY2soZW50cnkpOworICAgICAgICAgIFNraXBMaXN0TGF5ZXI6Oml0ZXJhdG9yIGxhc3QgPSAoKmkpLT5lbmQoKTsKKyAgICAgICAgICAtLWxhc3Q7CisgICAgICAgICAgZW50cnktPnNldEl0ZXJhdG9yKGxheWVyLCBsYXN0KTsKKworICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoInB1c2hiYWNrICIgPDwgJigqbGFzdCkpOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh1cGRhdGVUYWJsZVtsYXllcl0gPT0gKCppKS0+ZW5kKCkgJiYgaW5zZXJ0SW5Gcm9udCkKKyAgICAgICAgeworICAgICAgICAgICgqaSktPnB1c2hfZnJvbnQoZW50cnkpOworICAgICAgICAgIGVudHJ5LT5zZXRJdGVyYXRvcihsYXllciwgKCppKS0+YmVnaW4oKSk7CisKKyAgICAgICAgICBORkRfTE9HX1RSQUNFKCJwdXNoZnJvbnQgIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoImluc2VydGFmdGVyIik7CisgICAgICAgICAgKyt1cGRhdGVUYWJsZVtsYXllcl07IC8vIGluc2VydCBhZnRlcgorICAgICAgICAgIFNraXBMaXN0TGF5ZXI6Oml0ZXJhdG9yIHBvc2l0aW9uID0gKCppKS0+aW5zZXJ0KHVwZGF0ZVRhYmxlW2xheWVyXSwgZW50cnkpOworICAgICAgICAgIGVudHJ5LT5zZXRJdGVyYXRvcihsYXllciwgcG9zaXRpb24pOyAvLyBzYXZlIGl0ZXJhdG9yIHdoZXJlIGl0ZW0gd2FzIGluc2VydGVkCisgICAgICAgIH0KKyAgICAgIGxheWVyKys7CisgICAgfQorCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihlbnRyeSwgdHJ1ZSk7Cit9CisKK2Jvb2wKK0NzOjppbnNlcnQoY29uc3QgRGF0YSYgZGF0YSwgYm9vbCBpc1Vuc29saWNpdGVkKQoreworICBORkRfTE9HX1RSQUNFKCJpbnNlcnQoKSAiIDw8IGRhdGEuZ2V0RnVsbE5hbWUoKSk7CisKKyAgaWYgKGlzRnVsbCgpKQorICAgIHsKKyAgICAgIGV2aWN0SXRlbSgpOworICAgIH0KKworICAvL3BvaW50ZXIgYW5kIGluc2VydGlvbiBzdGF0dXMKKyAgc3RkOjpwYWlyPGNzOjpza2lwX2xpc3Q6OkVudHJ5KiwgYm9vbD4gZW50cnkgPSBpbnNlcnRUb1NraXBMaXN0KGRhdGEsIGlzVW5zb2xpY2l0ZWQpOworCisgIC8vbmV3IGVudHJ5CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihlbnRyeS5maXJzdCkgJiYgKGVudHJ5LnNlY29uZCA9PSB0cnVlKSkKKyAgICB7CisgICAgICBtX2NsZWFudXBJbmRleC5wdXNoX2JhY2soZW50cnkuZmlyc3QpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc2l6ZV90CitDczo6cGlja1JhbmRvbUxheWVyKCkgY29uc3QKK3sKKyAgc3RhdGljIGJvb3N0OjpyYW5kb206OmJlcm5vdWxsaV9kaXN0cmlidXRpb248PiBkaXN0KFNLSVBMSVNUX1BST0JBQklMSVRZKTsKKyAgLy8gVE9ETyByZXdyaXRlIHVzaW5nIGdlb21ldHJ5X2Rpc3RyaWJ1dGlvbgorICBzaXplX3QgbGF5ZXI7CisgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IFNLSVBMSVNUX01BWF9MQVlFUlM7ICsrbGF5ZXIpIHsKKyAgICBpZiAoIWRpc3QoZ2V0R2xvYmFsUm5nKCkpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGxheWVyOworfQorCitib29sCitDczo6aXNGdWxsKCkgY29uc3QKK3sKKyAgaWYgKHNpemUoKSA+PSBtX25NYXhQYWNrZXRzKSAvL3NpemUgb2YgdGhlIGZpcnN0IGxheWVyIHZzLiBtYXggc2l6ZQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbAorQ3M6OmVyYXNlRnJvbVNraXBMaXN0KGNzOjpza2lwX2xpc3Q6OkVudHJ5KiBlbnRyeSkKK3sKKyAgTkZEX0xPR19UUkFDRSgiZXJhc2VGcm9tU2tpcExpc3QoKSAiICA8PCBlbnRyeS0+Z2V0RnVsbE5hbWUoKSk7CisgIE5GRF9MT0dfVFJBQ0UoIlNraXBMaXN0IHNpemUgIiA8PCBzaXplKCkpOworCisgIGJvb2wgaXNFcmFzZWQgPSBmYWxzZTsKKworICBjb25zdCBzdGQ6Om1hcDxpbnQsIHN0ZDo6bGlzdDxjczo6c2tpcF9saXN0OjpFbnRyeSo+OjppdGVyYXRvcj4mIGl0ZXJhdG9ycyA9IGVudHJ5LT5nZXRJdGVyYXRvcnMoKTsKKworICBpZiAoIWl0ZXJhdG9ycy5lbXB0eSgpKQorICAgIHsKKyAgICAgIGludCBsYXllciA9IDA7CisKKyAgICAgIGZvciAoU2tpcExpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9za2lwTGlzdC5iZWdpbigpOyBpdCAhPSBtX3NraXBMaXN0LmVuZCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6Om1hcDxpbnQsIHN0ZDo6bGlzdDxjczo6c2tpcF9saXN0OjpFbnRyeSo+OjppdGVyYXRvcj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBpdGVyYXRvcnMuZmluZChsYXllcik7CisKKyAgICAgICAgICBpZiAoaSAhPSBpdGVyYXRvcnMuZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICgqaXQpLT5lcmFzZShpLT5zZWNvbmQpOworICAgICAgICAgICAgICBlbnRyeS0+cmVtb3ZlSXRlcmF0b3IobGF5ZXIpOworICAgICAgICAgICAgICBpc0VyYXNlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgLy9yZW1vdmUgbGF5ZXJzIHRoYXQgZG8gbm90IGNvbnRhaW4gYW55IGVsZW1lbnRzIChzdGFydGluZyBmcm9tIHRoZSBzZWNvbmQgbGF5ZXIpCisgICAgICAgICAgICAgIGlmICgobGF5ZXIgIT0gMCkgJiYgKCppdCktPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGVsZXRlICppdDsKKyAgICAgICAgICAgICAgICAgIGl0ID0gbV9za2lwTGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKytpdDsKKworICAgICAgICAgICAgICBsYXllcisrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAvL2RlbGV0ZSBlbnRyeTsKKyAgaWYgKGlzRXJhc2VkKQorICB7CisgICAgZW50cnktPnJlbGVhc2UoKTsKKyAgICBtX2ZyZWVDc0VudHJpZXMucHVzaChlbnRyeSk7CisgICAgbV9uUGFja2V0cy0tOworICB9CisKKyAgcmV0dXJuIGlzRXJhc2VkOworfQorCitib29sCitDczo6ZXZpY3RJdGVtKCkKK3sKKyAgTkZEX0xPR19UUkFDRSgiZXZpY3RJdGVtKCkiKTsKKworICBpZiAoIW1fY2xlYW51cEluZGV4LmdldDx1bnNvbGljaXRlZD4oKS5lbXB0eSgpKSB7CisgICAgQ2xlYW51cEluZGV4OjppbmRleDx1bnNvbGljaXRlZD46OnR5cGU6OmNvbnN0X2l0ZXJhdG9yIGZpcnN0U29saWNpdGVkID0KKyAgICAgIG1fY2xlYW51cEluZGV4LmdldDx1bnNvbGljaXRlZD4oKS51cHBlcl9ib3VuZChmYWxzZSk7CisKKyAgICBpZiAoZmlyc3RTb2xpY2l0ZWQgIT0gbV9jbGVhbnVwSW5kZXguZ2V0PHVuc29saWNpdGVkPigpLmJlZ2luKCkpIHsKKyAgICAgIC0tZmlyc3RTb2xpY2l0ZWQ7CisgICAgICBCT09TVF9BU1NFUlQoKCpmaXJzdFNvbGljaXRlZCktPmlzVW5zb2xpY2l0ZWQoKSk7CisgICAgICBORkRfTE9HX1RSQUNFKCJFdmljdCBmcm9tIHVuc29saWNpdGVkIHF1ZXVlIik7CisKKyAgICAgIGVyYXNlRnJvbVNraXBMaXN0KCpmaXJzdFNvbGljaXRlZCk7CisgICAgICBtX2NsZWFudXBJbmRleC5nZXQ8dW5zb2xpY2l0ZWQ+KCkuZXJhc2UoZmlyc3RTb2xpY2l0ZWQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQk9PU1RfQVNTRVJUKCEoKm1fY2xlYW51cEluZGV4LmdldDx1bnNvbGljaXRlZD4oKS5iZWdpbigpKS0+aXNVbnNvbGljaXRlZCgpKTsKKyAgICB9CisgIH0KKworICBpZiAoIW1fY2xlYW51cEluZGV4LmdldDxieVN0YWxlbmVzcz4oKS5lbXB0eSgpICYmCisgICAgICAoKm1fY2xlYW51cEluZGV4LmdldDxieVN0YWxlbmVzcz4oKS5iZWdpbigpKS0+Z2V0U3RhbGVUaW1lKCkgPCB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpKQorICB7CisgICAgTkZEX0xPR19UUkFDRSgiRXZpY3QgZnJvbSBzdGFsZW5lc3MgcXVldWUiKTsKKworICAgIGVyYXNlRnJvbVNraXBMaXN0KCptX2NsZWFudXBJbmRleC5nZXQ8YnlTdGFsZW5lc3M+KCkuYmVnaW4oKSk7CisgICAgbV9jbGVhbnVwSW5kZXguZ2V0PGJ5U3RhbGVuZXNzPigpLmVyYXNlKG1fY2xlYW51cEluZGV4LmdldDxieVN0YWxlbmVzcz4oKS5iZWdpbigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmICghbV9jbGVhbnVwSW5kZXguZ2V0PGJ5QXJyaXZhbD4oKS5lbXB0eSgpKQorICB7CisgICAgTkZEX0xPR19UUkFDRSgiRXZpY3QgZnJvbSBhcnJpdmFsIHF1ZXVlIik7CisKKyAgICBlcmFzZUZyb21Ta2lwTGlzdCgqbV9jbGVhbnVwSW5kZXguZ2V0PGJ5QXJyaXZhbD4oKS5iZWdpbigpKTsKKyAgICBtX2NsZWFudXBJbmRleC5nZXQ8YnlBcnJpdmFsPigpLmVyYXNlKG1fY2xlYW51cEluZGV4LmdldDxieUFycml2YWw+KCkuYmVnaW4oKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0IERhdGEqCitDczo6ZmluZChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpIGNvbnN0Cit7CisgIE5GRF9MT0dfVFJBQ0UoImZpbmQoKSAiIDw8IGludGVyZXN0LmdldE5hbWUoKSk7CisKKyAgYm9vbCBpc0l0ZXJhdGVkID0gZmFsc2U7CisgIFNraXBMaXN0Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHRvcExheWVyID0gbV9za2lwTGlzdC5yYmVnaW4oKTsKKyAgU2tpcExpc3RMYXllcjo6aXRlcmF0b3IgaGVhZCA9ICgqdG9wTGF5ZXIpLT5iZWdpbigpOworCisgIGlmICghKCp0b3BMYXllciktPmVtcHR5KCkpCisgICAgeworICAgICAgLy9zdGFydCBmcm9tIHRoZSB1cHBlciBsYXllciB0b3dhcmRzIGJvdHRvbQorICAgICAgaW50IGxheWVyID0gbV9za2lwTGlzdC5zaXplKCkgLSAxOworICAgICAgZm9yIChTa2lwTGlzdDo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciByaXQgPSB0b3BMYXllcjsgcml0ICE9IG1fc2tpcExpc3QucmVuZCgpOyArK3JpdCkKKyAgICAgICAgeworICAgICAgICAgIC8vaWYgd2UgZGlkbid0IGRvIGFueSBpdGVyYXRpb25zIG9uIHRoZSBoaWdoZXIgbGF5ZXJzLCBzdGFydCBmcm9tIHRoZSBiZWdpbigpIGFnYWluCisgICAgICAgICAgaWYgKCFpc0l0ZXJhdGVkKQorICAgICAgICAgICAgaGVhZCA9ICgqcml0KS0+YmVnaW4oKTsKKworICAgICAgICAgIGlmIChoZWFkICE9ICgqcml0KS0+ZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGl0IGhhcHBlbnMgd2hlbiBiZWdpbigpIGNvbnRhaW5zIHRoZSBlbGVtZW50IHdlIHdhbnQgdG8gZmluZAorICAgICAgICAgICAgICBpZiAoIWlzSXRlcmF0ZWQgJiYgKGludGVyZXN0LmdldE5hbWUoKS5pc1ByZWZpeE9mKCgqaGVhZCktPmdldEZ1bGxOYW1lKCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAobGF5ZXIgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItLTsKKyAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdHJ5IGxvd2VyIGxheWVyCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlzSXRlcmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgU2tpcExpc3RMYXllcjo6aXRlcmF0b3IgaXQgPSBoZWFkOworCisgICAgICAgICAgICAgICAgICB3aGlsZSAoKCppdCktPmdldEZ1bGxOYW1lKCkgPCBpbnRlcmVzdC5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBORkRfTE9HX1RSQUNFKCgqaXQpLT5nZXRGdWxsTmFtZSgpIDw8ICIgPCAiIDw8IGludGVyZXN0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGl0OworICAgICAgICAgICAgICAgICAgICAgIGlzSXRlcmF0ZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gKCpyaXQpLT5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxheWVyID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaGVhZCA9ICgqaGVhZCktPmdldEl0ZXJhdG9ycygpLmZpbmQobGF5ZXIgLSAxKS0+c2Vjb25kOyAvLyBtb3ZlIEhFQUQgdG8gdGhlIGxvd2VyIGxheWVyCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAvL2lmIHdlIHJlYWNoZWQgdGhlIGZpcnN0IGxheWVyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpc0l0ZXJhdGVkKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RDaGlsZChpbnRlcmVzdCwgaGVhZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBsYXllci0tOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAwOworfQorCitjb25zdCBEYXRhKgorQ3M6OnNlbGVjdENoaWxkKGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwgU2tpcExpc3RMYXllcjo6aXRlcmF0b3Igc3RhcnRpbmdQb2ludCkgY29uc3QKK3sKKyAgQk9PU1RfQVNTRVJUKHN0YXJ0aW5nUG9pbnQgIT0gKCptX3NraXBMaXN0LmJlZ2luKCkpLT5lbmQoKSk7CisKKyAgaWYgKHN0YXJ0aW5nUG9pbnQgIT0gKCptX3NraXBMaXN0LmJlZ2luKCkpLT5iZWdpbigpKQorICAgIHsKKyAgICAgIEJPT1NUX0FTU0VSVCgoKnN0YXJ0aW5nUG9pbnQpLT5nZXRGdWxsTmFtZSgpIDwgaW50ZXJlc3QuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgTkZEX0xPR19UUkFDRSgic2VsZWN0Q2hpbGQoKSAiIDw8IGludGVyZXN0LmdldENoaWxkU2VsZWN0b3IoKSA8PCAiICIKKyAgICAgICAgICAgICAgICA8PCAoKnN0YXJ0aW5nUG9pbnQpLT5nZXRGdWxsTmFtZSgpKTsKKworICBib29sIGhhc0xlZnRtb3N0U2VsZWN0b3IgPSAoaW50ZXJlc3QuZ2V0Q2hpbGRTZWxlY3RvcigpIDw9IDApOworICBib29sIGhhc1JpZ2h0bW9zdFNlbGVjdG9yID0gIWhhc0xlZnRtb3N0U2VsZWN0b3I7CisKKyAgaWYgKGhhc0xlZnRtb3N0U2VsZWN0b3IpCisgICAgeworICAgICAgYm9vbCBkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0ID0gcmVjb2duaXplSW50ZXJlc3RXaXRoRGlnZXN0KGludGVyZXN0LCAqc3RhcnRpbmdQb2ludCk7CisgICAgICBib29sIGlzSW5QcmVmaXggPSBmYWxzZTsKKworICAgICAgaWYgKGRvZXNJbnRlcmVzdENvbnRhaW5EaWdlc3QpCisgICAgICAgIHsKKyAgICAgICAgICBpc0luUHJlZml4ID0gaW50ZXJlc3QuZ2V0TmFtZSgpLmdldFByZWZpeCgtMSkuaXNQcmVmaXhPZigoKnN0YXJ0aW5nUG9pbnQpLT5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaXNJblByZWZpeCA9IGludGVyZXN0LmdldE5hbWUoKS5pc1ByZWZpeE9mKCgqc3RhcnRpbmdQb2ludCktPmdldEZ1bGxOYW1lKCkpOworICAgICAgICB9CisKKyAgICAgIGlmIChpc0luUHJlZml4KQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRvZXNDb21wbHlXaXRoU2VsZWN0b3JzKGludGVyZXN0LCAqc3RhcnRpbmdQb2ludCwgZG9lc0ludGVyZXN0Q29udGFpbkRpZ2VzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiAmKCpzdGFydGluZ1BvaW50KS0+Z2V0RGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIC8vaXRlcmF0ZSB0byB0aGUgcmlnaHQKKyAgU2tpcExpc3RMYXllcjo6aXRlcmF0b3IgcmlnaHRtb3N0ID0gc3RhcnRpbmdQb2ludDsKKyAgaWYgKHN0YXJ0aW5nUG9pbnQgIT0gKCptX3NraXBMaXN0LmJlZ2luKCkpLT5lbmQoKSkKKyAgICB7CisgICAgICBTa2lwTGlzdExheWVyOjppdGVyYXRvciByaWdodG1vc3RDYW5kaWRhdGUgPSBzdGFydGluZ1BvaW50OworICAgICAgTmFtZSBjdXJyZW50Q2hpbGRQcmVmaXgoIiIpOworCisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICsrcmlnaHRtb3N0Q2FuZGlkYXRlOworCisgICAgICAgICAgYm9vbCBpc0luQm91bmRhcmllcyA9IChyaWdodG1vc3RDYW5kaWRhdGUgIT0gKCptX3NraXBMaXN0LmJlZ2luKCkpLT5lbmQoKSk7CisgICAgICAgICAgYm9vbCBpc0luUHJlZml4ID0gZmFsc2U7CisgICAgICAgICAgYm9vbCBkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0ID0gZmFsc2U7CisgICAgICAgICAgaWYgKGlzSW5Cb3VuZGFyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0ID0gcmVjb2duaXplSW50ZXJlc3RXaXRoRGlnZXN0KGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyaWdodG1vc3RDYW5kaWRhdGUpOworCisgICAgICAgICAgICAgIGlmIChkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlzSW5QcmVmaXggPSBpbnRlcmVzdC5nZXROYW1lKCkuZ2V0UHJlZml4KC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzUHJlZml4T2YoKCpyaWdodG1vc3RDYW5kaWRhdGUpLT5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpc0luUHJlZml4ID0gaW50ZXJlc3QuZ2V0TmFtZSgpLmlzUHJlZml4T2YoKCpyaWdodG1vc3RDYW5kaWRhdGUpLT5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaXNJblByZWZpeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGRvZXNDb21wbHlXaXRoU2VsZWN0b3JzKGludGVyZXN0LCAqcmlnaHRtb3N0Q2FuZGlkYXRlLCBkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoaGFzTGVmdG1vc3RTZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAmKCpyaWdodG1vc3RDYW5kaWRhdGUpLT5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGhhc1JpZ2h0bW9zdFNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvZXNJbnRlcmVzdENvbnRhaW5EaWdlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBwcmVmaXggd2hpY2ggaXMgb25lIGNvbXBvbmVudCBsb25nZXIgdGhhbiBJbnRlcmVzdCBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aXRob3V0IGRpZ2VzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZSYgY2hpbGRQcmVmaXggPSAoKnJpZ2h0bW9zdENhbmRpZGF0ZSktPmdldEZ1bGxOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcmVmaXgoaW50ZXJlc3QuZ2V0TmFtZSgpLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoIkNoaWxkIHByZWZpeCIgPDwgY2hpbGRQcmVmaXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2hpbGRQcmVmaXguZW1wdHkoKSB8fCAoY2hpbGRQcmVmaXggIT0gY3VycmVudENoaWxkUHJlZml4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hpbGRQcmVmaXggPSBjaGlsZFByZWZpeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0bW9zdCA9IHJpZ2h0bW9zdENhbmRpZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgcHJlZml4IHdoaWNoIGlzIG9uZSBjb21wb25lbnQgbG9uZ2VyIHRoYW4gSW50ZXJlc3QgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBjaGlsZFByZWZpeCA9ICgqcmlnaHRtb3N0Q2FuZGlkYXRlKS0+Z2V0RnVsbE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByZWZpeChpbnRlcmVzdC5nZXROYW1lKCkuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoIkNoaWxkIHByZWZpeCIgPDwgY2hpbGRQcmVmaXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2hpbGRQcmVmaXguZW1wdHkoKSB8fCAoY2hpbGRQcmVmaXggIT0gY3VycmVudENoaWxkUHJlZml4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hpbGRQcmVmaXggPSBjaGlsZFByZWZpeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0bW9zdCA9IHJpZ2h0bW9zdENhbmRpZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHJpZ2h0bW9zdCAhPSBzdGFydGluZ1BvaW50KQorICAgIHsKKyAgICAgIHJldHVybiAmKCpyaWdodG1vc3QpLT5nZXREYXRhKCk7CisgICAgfQorCisgIGlmIChoYXNSaWdodG1vc3RTZWxlY3RvcikgLy8gaWYgcmlnaHRtb3N0IHdhcyBub3QgZm91bmQsIHRyeSBzdGFydGluZyBwb2ludAorICAgIHsKKyAgICAgIGJvb2wgZG9lc0ludGVyZXN0Q29udGFpbkRpZ2VzdCA9IHJlY29nbml6ZUludGVyZXN0V2l0aERpZ2VzdChpbnRlcmVzdCwgKnN0YXJ0aW5nUG9pbnQpOworICAgICAgYm9vbCBpc0luUHJlZml4ID0gZmFsc2U7CisKKyAgICAgIGlmIChkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0KQorICAgICAgICB7CisgICAgICAgICAgaXNJblByZWZpeCA9IGludGVyZXN0LmdldE5hbWUoKS5nZXRQcmVmaXgoLTEpLmlzUHJlZml4T2YoKCpzdGFydGluZ1BvaW50KS0+Z2V0RnVsbE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlzSW5QcmVmaXggPSBpbnRlcmVzdC5nZXROYW1lKCkuaXNQcmVmaXhPZigoKnN0YXJ0aW5nUG9pbnQpLT5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoaXNJblByZWZpeCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkb2VzQ29tcGx5V2l0aFNlbGVjdG9ycyhpbnRlcmVzdCwgKnN0YXJ0aW5nUG9pbnQsIGRvZXNJbnRlcmVzdENvbnRhaW5EaWdlc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gJigqc3RhcnRpbmdQb2ludCktPmdldERhdGEoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworYm9vbAorQ3M6OmRvZXNDb21wbHlXaXRoU2VsZWN0b3JzKGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczo6c2tpcF9saXN0OjpFbnRyeSogZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0KSBjb25zdAoreworICBORkRfTE9HX1RSQUNFKCJkb2VzQ29tcGx5V2l0aFNlbGVjdG9ycygpIik7CisKKyAgLy8vIFx0b2RvIFRoZSBmb2xsb3dpbmcgZGV0ZWN0aW9uIGlzIG5vdCBjb3JyZWN0CisgIC8vLyAgICAgICAxLiBJZiBJbnRlcmVzdCBuYW1lIGVuZHMgd2l0aCAzMi1vY3RldCBjb21wb25lbnQgZG9lc24ndCBtZWFuIHRoYXQgdGhpcyBjb21wb25lbnQgaXMKKyAgLy8vICAgICAgICAgIGRpZ2VzdAorICAvLy8gICAgICAgMi4gT25seSBtaW4vbWF4IHNlbGVjdG9ycyAoYm90aCAwKSBjYW4gYmUgc3BlY2lmaWVkLCBhbGwgb3RoZXIgc2VsZWN0b3JzIGRvIG5vdAorICAvLy8gICAgICAgICAgbWFrZSBzZW5zZSBmb3IgaW50ZXJlc3RzIHdpdGggZGlnZXN0ICh0aG91Z2ggbm90IHN1cmUgaWYgd2UgbmVlZCB0byBlbmZvcmNlIHRoaXMpCisKKyAgaWYgKGRvZXNJbnRlcmVzdENvbnRhaW5EaWdlc3QpCisgICAgeworICAgICAgaWYgKGludGVyZXN0LmdldE5hbWUoKS5nZXQoLTEpICE9IGVudHJ5LT5nZXRGdWxsTmFtZSgpLmdldCgtMSkpCisgICAgICAgIHsKKyAgICAgICAgICBORkRfTE9HX1RSQUNFKCJ2aW9sYXRlcyBpbXBsaWNpdCBkaWdlc3QiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0KQorICAgIHsKKyAgICAgIGlmIChpbnRlcmVzdC5nZXRNaW5TdWZmaXhDb21wb25lbnRzKCkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIHNpemVfdCBtaW5EYXRhTmFtZUxlbmd0aCA9IGludGVyZXN0LmdldE5hbWUoKS5zaXplKCkgKyBpbnRlcmVzdC5nZXRNaW5TdWZmaXhDb21wb25lbnRzKCk7CisKKyAgICAgICAgICBib29sIGlzU2F0aXNmaWVkID0gKG1pbkRhdGFOYW1lTGVuZ3RoIDw9IGVudHJ5LT5nZXRGdWxsTmFtZSgpLnNpemUoKSk7CisgICAgICAgICAgaWYgKCFpc1NhdGlzZmllZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgTkZEX0xPR19UUkFDRSgidmlvbGF0ZXMgbWluQ29tcG9uZW50cyIpOworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKGludGVyZXN0LmdldE1heFN1ZmZpeENvbXBvbmVudHMoKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IG1heERhdGFOYW1lTGVuZ3RoID0gaW50ZXJlc3QuZ2V0TmFtZSgpLnNpemUoKSArIGludGVyZXN0LmdldE1heFN1ZmZpeENvbXBvbmVudHMoKTsKKworICAgICAgICAgIGJvb2wgaXNTYXRpc2ZpZWQgPSAobWF4RGF0YU5hbWVMZW5ndGggPj0gZW50cnktPmdldEZ1bGxOYW1lKCkuc2l6ZSgpKTsKKyAgICAgICAgICBpZiAoIWlzU2F0aXNmaWVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBORkRfTE9HX1RSQUNFKCJ2aW9sYXRlcyBtYXhDb21wb25lbnRzIik7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpZiAoaW50ZXJlc3QuZ2V0TXVzdEJlRnJlc2goKSAmJiBlbnRyeS0+Z2V0U3RhbGVUaW1lKCkgPCB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpKQorICAgIHsKKyAgICAgIE5GRF9MT0dfVFJBQ0UoInZpb2xhdGVzIG11c3RCZUZyZXNoIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghaW50ZXJlc3QuZ2V0UHVibGlzaGVyUHVibGljS2V5TG9jYXRvcigpLmVtcHR5KCkpCisgICAgeworICAgICAgaWYgKGVudHJ5LT5nZXREYXRhKCkuZ2V0U2lnbmF0dXJlKCkuZ2V0VHlwZSgpID09IG5kbjo6U2lnbmF0dXJlOjpTaGEyNTZXaXRoUnNhKQorICAgICAgICB7CisgICAgICAgICAgbmRuOjpTaWduYXR1cmVTaGEyNTZXaXRoUnNhIHJzYVNpZ25hdHVyZShlbnRyeS0+Z2V0RGF0YSgpLmdldFNpZ25hdHVyZSgpKTsKKyAgICAgICAgICBpZiAocnNhU2lnbmF0dXJlLmdldEtleUxvY2F0b3IoKSAhPSBpbnRlcmVzdC5nZXRQdWJsaXNoZXJQdWJsaWNLZXlMb2NhdG9yKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoInZpb2xhdGVzIHB1Ymxpc2hlciBrZXkgc2VsZWN0b3IiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBORkRfTE9HX1RSQUNFKCJ2aW9sYXRlcyBwdWJsaXNoZXIga2V5IHNlbGVjdG9yIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgIGlmIChkb2VzSW50ZXJlc3RDb250YWluRGlnZXN0KQorICAgIHsKKyAgICAgIGNvbnN0IG5kbjo6bmFtZTo6Q29tcG9uZW50JiBsYXN0Q29tcG9uZW50ID0gZW50cnktPmdldEZ1bGxOYW1lKCkuZ2V0KC0xKTsKKworICAgICAgaWYgKCFsYXN0Q29tcG9uZW50LmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaW50ZXJlc3QuZ2V0RXhjbHVkZSgpLmlzRXhjbHVkZWQobGFzdENvbXBvbmVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoInZpb2xhdGVzIGV4Y2x1c2lvbiIpOworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZW50cnktPmdldEZ1bGxOYW1lKCkuc2l6ZSgpID49IGludGVyZXN0LmdldE5hbWUoKS5zaXplKCkgKyAxKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgbmRuOjpuYW1lOjpDb21wb25lbnQmIG5leHRDb21wb25lbnQgPSBlbnRyeS0+Z2V0RnVsbE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGludGVyZXN0LmdldE5hbWUoKS5zaXplKCkpOworICAgICAgICAgIGlmICghbmV4dENvbXBvbmVudC5lbXB0eSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaW50ZXJlc3QuZ2V0RXhjbHVkZSgpLmlzRXhjbHVkZWQobmV4dENvbXBvbmVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgTkZEX0xPR19UUkFDRSgidmlvbGF0ZXMgZXhjbHVzaW9uIik7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIE5GRF9MT0dfVFJBQ0UoImNvbXBsaWVzIik7CisgIHJldHVybiB0cnVlOworfQorCitib29sCitDczo6cmVjb2duaXplSW50ZXJlc3RXaXRoRGlnZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwgY3M6OnNraXBfbGlzdDo6RW50cnkqIGVudHJ5KSBjb25zdAoreworICAvLyBvbmx5IHdoZW4gbWluIHNlbGVjdG9yIGlzIG5vdCBzcGVjaWZpZWQgb3Igc3BlY2lmaWVkIHdpdGggdmFsdWUgb2YgMAorICAvLyBhbmQgSW50ZXJlc3QncyBuYW1lIGxlbmd0aCBpcyBleGFjdGx5IHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgb2YgQ1MgZW50cnkKKyAgaWYgKGludGVyZXN0LmdldE1pblN1ZmZpeENvbXBvbmVudHMoKSA8PSAwICYmCisgICAgICBpbnRlcmVzdC5nZXROYW1lKCkuc2l6ZSgpID09IChlbnRyeS0+Z2V0RnVsbE5hbWUoKS5zaXplKCkpKQorICAgIHsKKyAgICAgIGNvbnN0IG5kbjo6bmFtZTo6Q29tcG9uZW50JiBsYXN0ID0gaW50ZXJlc3QuZ2V0TmFtZSgpLmdldCgtMSk7CisgICAgICBpZiAobGFzdC52YWx1ZV9zaXplKCkgPT0gbmRuOjpjcnlwdG86OlNIQTI1Nl9ESUdFU1RfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoImRpZ2VzdCByZWNvZ25pemVkIik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkCitDczo6ZXJhc2UoY29uc3QgTmFtZSYgZXhhY3ROYW1lKQoreworICBORkRfTE9HX1RSQUNFKCJpbnNlcnQoKSAiIDw8IGV4YWN0TmFtZSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNraXBMaXN0IHNpemUgIiA8PCBzaXplKCkpOworCisgIGJvb2wgaXNJdGVyYXRlZCA9IGZhbHNlOworICBTa2lwTGlzdExheWVyOjppdGVyYXRvciB1cGRhdGVUYWJsZVtTS0lQTElTVF9NQVhfTEFZRVJTXTsKKyAgU2tpcExpc3Q6OnJldmVyc2VfaXRlcmF0b3IgdG9wTGF5ZXIgPSBtX3NraXBMaXN0LnJiZWdpbigpOworICBTa2lwTGlzdExheWVyOjppdGVyYXRvciBoZWFkID0gKCp0b3BMYXllciktPmJlZ2luKCk7CisKKyAgaWYgKCEoKnRvcExheWVyKS0+ZW1wdHkoKSkKKyAgICB7CisgICAgICAvL3N0YXJ0IGZyb20gdGhlIHVwcGVyIGxheWVyIHRvd2FyZHMgYm90dG9tCisgICAgICBpbnQgbGF5ZXIgPSBtX3NraXBMaXN0LnNpemUoKSAtIDE7CisgICAgICBmb3IgKFNraXBMaXN0OjpyZXZlcnNlX2l0ZXJhdG9yIHJpdCA9IHRvcExheWVyOyByaXQgIT0gbV9za2lwTGlzdC5yZW5kKCk7ICsrcml0KQorICAgICAgICB7CisgICAgICAgICAgLy9pZiB3ZSBkaWRuJ3QgZG8gYW55IGl0ZXJhdGlvbnMgb24gdGhlIGhpZ2hlciBsYXllcnMsIHN0YXJ0IGZyb20gdGhlIGJlZ2luKCkgYWdhaW4KKyAgICAgICAgICBpZiAoIWlzSXRlcmF0ZWQpCisgICAgICAgICAgICBoZWFkID0gKCpyaXQpLT5iZWdpbigpOworCisgICAgICAgICAgdXBkYXRlVGFibGVbbGF5ZXJdID0gaGVhZDsKKworICAgICAgICAgIGlmIChoZWFkICE9ICgqcml0KS0+ZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGl0IGNhbiBoYXBwZW4gd2hlbiBiZWdpbigpIGNvbnRhaW5zIHRoZSBlbGVtZW50IHdlIHdhbnQgdG8gcmVtb3ZlCisgICAgICAgICAgICAgIGlmICghaXNJdGVyYXRlZCAmJiAoKCpoZWFkKS0+Z2V0RnVsbE5hbWUoKSA9PSBleGFjdE5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNzOjpza2lwX2xpc3Q6OkVudHJ5KiBlbnRyeVRvRGVsZXRlID0gKmhlYWQ7CisgICAgICAgICAgICAgICAgICBORkRfTE9HX1RSQUNFKCJGb3VuZCB0YXJnZXQgIiA8PCBlbnRyeVRvRGVsZXRlLT5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIGVyYXNlRnJvbVNraXBMaXN0KGVudHJ5VG9EZWxldGUpOworICAgICAgICAgICAgICAgICAgLy8gaGVhZCBjYW4gYmVjb21lIGludmFsaWQgYWZ0ZXIgZXJhc2VGcm9tU2tpcExpc3QKKyAgICAgICAgICAgICAgICAgIG1fY2xlYW51cEluZGV4LnJlbW92ZShlbnRyeVRvRGVsZXRlKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBTa2lwTGlzdExheWVyOjppdGVyYXRvciBpdCA9IGhlYWQ7CisKKyAgICAgICAgICAgICAgICAgIHdoaWxlICgoKml0KS0+Z2V0RnVsbE5hbWUoKSA8IGV4YWN0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBpdDsKKyAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUYWJsZVtsYXllcl0gPSBpdDsKKyAgICAgICAgICAgICAgICAgICAgICBpc0l0ZXJhdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ID09ICgqcml0KS0+ZW5kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYXllciA+IDApCisgICAgICAgICAgICBoZWFkID0gKCpoZWFkKS0+Z2V0SXRlcmF0b3JzKCkuZmluZChsYXllciAtIDEpLT5zZWNvbmQ7IC8vIG1vdmUgSEVBRCB0byB0aGUgbG93ZXIgbGF5ZXIKKworICAgICAgICAgIGxheWVyLS07CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGhlYWQgPSB1cGRhdGVUYWJsZVswXTsKKyAgKytoZWFkOyAvLyBsb29rIGF0IHRoZSBuZXh0IHNsb3QgdG8gY2hlY2sgaWYgaXQgY29udGFpbnMgdGhlIGl0ZW0gd2Ugd2FudCB0byByZW1vdmUKKworICBib29sIGlzQ3NFbXB0eSA9IChzaXplKCkgPT0gMCk7CisgIGJvb2wgaXNJbkJvdW5kYXJpZXMgPSAoaGVhZCAhPSAoKm1fc2tpcExpc3QuYmVnaW4oKSktPmVuZCgpKTsKKyAgYm9vbCBpc05hbWVJZGVudGljYWwgPSBmYWxzZTsKKyAgaWYgKCFpc0NzRW1wdHkgJiYgaXNJbkJvdW5kYXJpZXMpCisgICAgeworICAgICAgTkZEX0xPR19UUkFDRSgiSWRlbnRpY2FsPyAiIDw8ICgqaGVhZCktPmdldEZ1bGxOYW1lKCkpOworICAgICAgaXNOYW1lSWRlbnRpY2FsID0gKCpoZWFkKS0+Z2V0RnVsbE5hbWUoKSA9PSBleGFjdE5hbWU7CisgICAgfQorCisgIGlmIChpc05hbWVJZGVudGljYWwpCisgICAgeworICAgICAgY3M6OnNraXBfbGlzdDo6RW50cnkqIGVudHJ5VG9EZWxldGUgPSAqaGVhZDsKKyAgICAgIE5GRF9MT0dfVFJBQ0UoIkZvdW5kIHRhcmdldCAiIDw8IGVudHJ5VG9EZWxldGUtPmdldEZ1bGxOYW1lKCkpOworICAgICAgZXJhc2VGcm9tU2tpcExpc3QoZW50cnlUb0RlbGV0ZSk7CisgICAgICAvLyBoZWFkIGNhbiBiZWNvbWUgaW52YWxpZCBhZnRlciBlcmFzZUZyb21Ta2lwTGlzdAorICAgICAgbV9jbGVhbnVwSW5kZXgucmVtb3ZlKGVudHJ5VG9EZWxldGUpOworICAgIH0KK30KKwordm9pZAorQ3M6OnByaW50U2tpcExpc3QoKSBjb25zdAoreworICBORkRfTE9HX1RSQUNFKCJwcmludCgpIik7CisgIC8vc3RhcnQgZnJvbSB0aGUgdXBwZXIgbGF5ZXIgdG93YXJkcyBib3R0b20KKyAgaW50IGxheWVyID0gbV9za2lwTGlzdC5zaXplKCkgLSAxOworICBmb3IgKFNraXBMaXN0Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJpdCA9IG1fc2tpcExpc3QucmJlZ2luKCk7IHJpdCAhPSBtX3NraXBMaXN0LnJlbmQoKTsgKytyaXQpCisgICAgeworICAgICAgZm9yIChTa2lwTGlzdExheWVyOjppdGVyYXRvciBpdCA9ICgqcml0KS0+YmVnaW4oKTsgaXQgIT0gKCpyaXQpLT5lbmQoKTsgKytpdCkKKyAgICAgICAgeworICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoIkxheWVyICIgPDwgbGF5ZXIgPDwgIiAiIDw8ICgqaXQpLT5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgbGF5ZXItLTsKKyAgICB9Cit9CisKK30gLy9uYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL2NzLmhwcCBiL05GRC9kYWVtb24vdGFibGUvY3MuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTg5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL2NzLmhwcApAQCAtMCwwICsxLDM0OCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogXGF1dGhvciBJbHlhIE1vaXNlZW5rbyA8aHR0cDovL2lseWFtb2lzZWVua28uY29tLz4KKyAqIFxhdXRob3IgSnVueGlhbyBTaGkgPGh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvcGVvcGxlL3NoaWp1bnhpYW8vPgorICogXGF1dGhvciBBbGV4YW5kZXIgQWZhbmFzeWV2IDxodHRwOi8vbGFzci5jcy51Y2xhLmVkdS9hZmFuYXN5ZXYvaW5kZXguaHRtbD4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fVEFCTEVfQ1NfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfQ1NfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgImNzLXNraXAtbGlzdC1lbnRyeS5ocHAiCisKKyNpbmNsdWRlIDxib29zdC9tdWx0aV9pbmRleC9tZW1iZXIuaHBwPgorI2luY2x1ZGUgPGJvb3N0L211bHRpX2luZGV4X2NvbnRhaW5lci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbXVsdGlfaW5kZXgvb3JkZXJlZF9pbmRleC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbXVsdGlfaW5kZXgvc2VxdWVuY2VkX2luZGV4LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tdWx0aV9pbmRleC9pZGVudGl0eS5ocHA+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKworbmFtZXNwYWNlIG5mZCB7CisKK3R5cGVkZWYgc3RkOjpsaXN0PGNzOjpza2lwX2xpc3Q6OkVudHJ5Kj4gU2tpcExpc3RMYXllcjsKK3R5cGVkZWYgc3RkOjpsaXN0PFNraXBMaXN0TGF5ZXIqPiBTa2lwTGlzdDsKKworY2xhc3MgU3RhbGVuZXNzQ29tcGFyYXRvcgoreworcHVibGljOgorICBib29sCisgIG9wZXJhdG9yKCkoY29uc3QgY3M6OnNraXBfbGlzdDo6RW50cnkqIGVudHJ5MSwgY29uc3QgY3M6OnNraXBfbGlzdDo6RW50cnkqIGVudHJ5MikgY29uc3QKKyAgeworICAgIHJldHVybiBlbnRyeTEtPmdldFN0YWxlVGltZSgpIDwgZW50cnkyLT5nZXRTdGFsZVRpbWUoKTsKKyAgfQorfTsKKworY2xhc3MgVW5zb2xpY2l0ZWRDb21wYXJhdG9yCit7CitwdWJsaWM6CisgIGJvb2wKKyAgb3BlcmF0b3IoKShjb25zdCBjczo6c2tpcF9saXN0OjpFbnRyeSogZW50cnkxLCBjb25zdCBjczo6c2tpcF9saXN0OjpFbnRyeSogZW50cnkyKSBjb25zdAorICB7CisgICAgcmV0dXJuIGVudHJ5MS0+aXNVbnNvbGljaXRlZCgpOworICB9CisKKyAgYm9vbAorICBvcGVyYXRvcigpKGJvb2wgaXNVbnNvbGljaXRlZCwgY29uc3QgY3M6OnNraXBfbGlzdDo6RW50cnkqIGVudHJ5KSBjb25zdAorICB7CisgICAgaWYgKGlzVW5zb2xpY2l0ZWQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gIWVudHJ5LT5pc1Vuc29saWNpdGVkKCk7CisgIH0KK307CisKKy8vIHRhZ3MKK2NsYXNzIHVuc29saWNpdGVkOworY2xhc3MgYnlTdGFsZW5lc3M7CitjbGFzcyBieUFycml2YWw7CisKK3R5cGVkZWYgYm9vc3Q6Om11bHRpX2luZGV4X2NvbnRhaW5lcjwKKyAgY3M6OnNraXBfbGlzdDo6RW50cnkqLAorICBib29zdDo6bXVsdGlfaW5kZXg6OmluZGV4ZWRfYnk8CisKKyAgICAvLyBieSBhcnJpdmFsIChGSUZPKQorICAgIGJvb3N0OjptdWx0aV9pbmRleDo6c2VxdWVuY2VkPAorICAgICAgYm9vc3Q6Om11bHRpX2luZGV4Ojp0YWc8YnlBcnJpdmFsPgorICAgID4sCisKKyAgICAvLyBpbmRleCBieSBzdGFsZW5lc3MgdGltZQorICAgIGJvb3N0OjptdWx0aV9pbmRleDo6b3JkZXJlZF9ub25fdW5pcXVlPAorICAgICAgYm9vc3Q6Om11bHRpX2luZGV4Ojp0YWc8YnlTdGFsZW5lc3M+LAorICAgICAgYm9vc3Q6Om11bHRpX2luZGV4OjppZGVudGl0eTxjczo6c2tpcF9saXN0OjpFbnRyeSo+LAorICAgICAgU3RhbGVuZXNzQ29tcGFyYXRvcgorICAgID4sCisKKyAgICAvLyB1bnNvbGljaXRlZCBEYXRhIGlzIGluIHRoZSBmcm9udAorICAgIGJvb3N0OjptdWx0aV9pbmRleDo6b3JkZXJlZF9ub25fdW5pcXVlPAorICAgICAgYm9vc3Q6Om11bHRpX2luZGV4Ojp0YWc8dW5zb2xpY2l0ZWQ+LAorICAgICAgYm9vc3Q6Om11bHRpX2luZGV4OjppZGVudGl0eTxjczo6c2tpcF9saXN0OjpFbnRyeSo+LAorICAgICAgVW5zb2xpY2l0ZWRDb21wYXJhdG9yCisgICAgPgorCisgID4KKz4gQ2xlYW51cEluZGV4OworCisvKiogXGJyaWVmIHJlcHJlc2VudHMgQ29udGVudCBTdG9yZQorICovCitjbGFzcyBDcyA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIGV4cGxpY2l0CisgIENzKHNpemVfdCBuTWF4UGFja2V0cyA9IDEwKTsKKworICB+Q3MoKTsKKworICAvKiogXGJyaWVmIGluc2VydHMgYSBEYXRhIHBhY2tldAorICAgKiAgVGhpcyBtZXRob2QgZG9lcyBub3QgY29uc2lkZXIgdGhlIHBheWxvYWQgb2YgdGhlIERhdGEgcGFja2V0LgorICAgKgorICAgKiAgUGFja2V0cyBhcmUgY29uc2lkZXJlZCBkdXBsaWNhdGUgaWYgdGhlIG5hbWUgbWF0Y2hlcy4KKyAgICogIFRoZSBuZXcgRGF0YSBwYWNrZXQgd2l0aCB0aGUgaWRlbnRpY2FsIG5hbWUsIGJ1dCBhIGRpZmZlcmVudCBwYXlsb2FkCisgICAqICBpcyBub3QgcGxhY2VkIGluIHRoZSBDb250ZW50IFN0b3JlCisgICAqICBccmV0dXJueyB3aGV0aGVyIHRoZSBEYXRhIGlzIGFkZGVkIH0KKyAgICovCisgIGJvb2wKKyAgaW5zZXJ0KGNvbnN0IERhdGEmIGRhdGEsIGJvb2wgaXNVbnNvbGljaXRlZCA9IGZhbHNlKTsKKworICAvKiogXGJyaWVmIGZpbmRzIHRoZSBiZXN0IG1hdGNoIERhdGEgZm9yIGFuIEludGVyZXN0CisgICAqICBccmV0dXJueyB0aGUgYmVzdCBtYXRjaCwgaWYgYW55OyBvdGhlcndpc2UgMCB9CisgICAqLworICBjb25zdCBEYXRhKgorICBmaW5kKGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBkZWxldGVzIENTIGVudHJ5IGJ5IHRoZSBleGFjdCBuYW1lCisgICAqLworICB2b2lkCisgIGVyYXNlKGNvbnN0IE5hbWUmIGV4YWN0TmFtZSk7CisKKyAgLyoqIFxicmllZiBzZXRzIG1heGltdW0gYWxsb3dlZCBzaXplIG9mIENvbnRlbnQgU3RvcmUgKGluIHBhY2tldHMpCisgICAqLworICB2b2lkCisgIHNldExpbWl0KHNpemVfdCBuTWF4UGFja2V0cyk7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIG1heGltdW0gYWxsb3dlZCBzaXplIG9mIENvbnRlbnQgU3RvcmUgKGluIHBhY2tldHMpCisgICAqICBccmV0dXJueyBudW1iZXIgb2YgcGFja2V0cyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gQ29udGVudCBTdG9yZSB9CisgICAqLworICBzaXplX3QKKyAgZ2V0TGltaXQoKSBjb25zdDsKKworICAvKiogXGJyaWVmIHJldHVybnMgY3VycmVudCBzaXplIG9mIENvbnRlbnQgU3RvcmUgbWVhc3VyZWQgaW4gcGFja2V0cworICAgKiAgXHJldHVybnsgbnVtYmVyIG9mIHBhY2tldHMgbG9jYXRlZCBpbiBDb250ZW50IFN0b3JlIH0KKyAgICovCisgIHNpemVfdAorICBzaXplKCkgY29uc3Q7CisKK3B1YmxpYzogLy8gZW51bWVyYXRpb24KKyAgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBDUyBlbnRyeQorICAgKiAgXG5vdGUgSXRlcmF0aW9uIG9yZGVyIGlzIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGFuZCBpcyB1bmRlZmluZWQKKyAgICogIFxub3RlIFRoZSByZXR1cm5lZCBpdGVyYXRvciBtYXkgZ2V0IGludmFsaWRhdGVkIGlmIENTIGlzIG1vZGlmaWVkCisgICAqLworICBjb25zdF9pdGVyYXRvcgorICBiZWdpbigpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgcmV0dXJucyBhbiBpdGVyYXRvciByZWZlcnJpbmcgdG8gdGhlIHBhc3QtdGhlLWVuZCBDUyBlbnRyeQorICAgKiAgXG5vdGUgVGhlIHJldHVybmVkIGl0ZXJhdG9yIG1heSBnZXQgaW52YWxpZGF0ZWQgaWYgQ1MgaXMgbW9kaWZpZWQKKyAgICovCisgIGNvbnN0X2l0ZXJhdG9yCisgIGVuZCgpIGNvbnN0OworCisgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgY29uc3QgY3M6OkVudHJ5PgorICB7CisgIHB1YmxpYzoKKyAgICBjb25zdF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIGNvbnN0X2l0ZXJhdG9yKFNraXBMaXN0TGF5ZXI6OmNvbnN0X2l0ZXJhdG9yIGl0KTsKKworICAgIH5jb25zdF9pdGVyYXRvcigpOworCisgICAgcmVmZXJlbmNlCisgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisKKyAgICBwb2ludGVyCisgICAgb3BlcmF0b3ItPigpIGNvbnN0OworCisgICAgY29uc3RfaXRlcmF0b3ImCisgICAgb3BlcmF0b3IrKygpOworCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBvcGVyYXRvcisrKGludCk7CisKKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0OworCisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIFNraXBMaXN0TGF5ZXI6OmNvbnN0X2l0ZXJhdG9yIG1fc2tpcExpc3RJdGVyYXRvcjsKKyAgfTsKKworcHJvdGVjdGVkOgorICAvKiogXGJyaWVmIHJlbW92ZXMgb25lIERhdGEgcGFja2V0IGZyb20gQ29udGVudCBTdG9yZSBiYXNlZCBvbiByZXBsYWNlbWVudCBwb2xpY3kKKyAgICogIFxyZXR1cm57IHdoZXRoZXIgdGhlIERhdGEgd2FzIHJlbW92ZWQgfQorICAgKi8KKyAgYm9vbAorICBldmljdEl0ZW0oKTsKKworcHJpdmF0ZToKKyAgLyoqIFxicmllZiByZXR1cm5zIFRydWUgaWYgdGhlIENvbnRlbnQgU3RvcmUgaXMgYXQgaXRzIG1heGltdW0gY2FwYWNpdHkKKyAgICogIFxyZXR1cm57IFRydWUgaWYgQ29udGVudCBTdG9yZSBpcyBmdWxsOyBvdGhlcndpc2UgRmFsc2V9CisgICAqLworICBib29sCisgIGlzRnVsbCgpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIGxheWVyIHdoZXJlIG5ldyBDb250ZW50IFN0b3JlIEVudHJ5IGlzIHBsYWNlZAorICAgKgorICAgKiAgUmVmZXJlbmNlOiAiU2tpcCBMaXN0czogQSBQcm9iYWJpbGlzdGljIEFsdGVybmF0aXZlIHRvIEJhbGFuY2VkIFRyZWVzIiBieSBXLlB1Z2gKKyAgICogIFxyZXR1cm57IHJldHVybnMgcmFuZG9tIGxheWVyIChudW1iZXIpIGluIGEgc2tpcCBsaXN0fQorICAgKi8KKyAgc2l6ZV90CisgIHBpY2tSYW5kb21MYXllcigpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgSW5zZXJ0cyBhIG5ldyBDb250ZW50IFN0b3JlIEVudHJ5IGluIGEgc2tpcCBsaXN0CisgICAqICBccmV0dXJueyByZXR1cm5zIGEgcGFpciBjb250YWluaW5nIGEgcG9pbnRlciB0byB0aGUgQ1MgRW50cnksCisgICAqICBhbmQgYSBmbGFnIGluZGljYXRpbmcgaWYgdGhlIGVudHJ5IHdhcyBuZXdseSBjcmVhdGVkIChUcnVlKSBvciByZWZyZXNoZWQgKEZhbHNlKSB9CisgICAqLworICBzdGQ6OnBhaXI8Y3M6OnNraXBfbGlzdDo6RW50cnkqLCBib29sPgorICBpbnNlcnRUb1NraXBMaXN0KGNvbnN0IERhdGEmIGRhdGEsIGJvb2wgaXNVbnNvbGljaXRlZCA9IGZhbHNlKTsKKworICAvKiogXGJyaWVmIFJlbW92ZXMgYSBzcGVjaWZpYyBDUyBFbnRyeSBmcm9tIGFsbCBsYXllcnMgb2YgYSBza2lwIGxpc3QKKyAgICogIFxyZXR1cm57IHJldHVybnMgVHJ1ZSBpZiBDUyBFbnRyeSB3YXMgc3VjY2VzZnVsbHkgcmVtb3ZlZCBhbmQgRmFsc2UgaWYgQ1MgRW50cnkgd2FzIG5vdCBmb3VuZH0KKyAgICovCisgIGJvb2wKKyAgZXJhc2VGcm9tU2tpcExpc3QoY3M6OnNraXBfbGlzdDo6RW50cnkqIGVudHJ5KTsKKworICAvKiogXGJyaWVmIFByaW50cyBjb250ZW50cyBvZiB0aGUgc2tpcCBsaXN0LCBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGF5ZXIKKyAgICovCisgIHZvaWQKKyAgcHJpbnRTa2lwTGlzdCgpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgSW1wbGVtZW50cyBjaGlsZCBzZWxlY3RvciAobGVmdG1vc3QsIHJpZ2h0bW9zdCwgdW5kZWNsYXJlZCkuCisgICAqICBPcGVyYXRlcyBvbiB0aGUgZmlyc3QgbGF5ZXIgb2YgYSBza2lwIGxpc3QuCisgICAqCisgICAqICBzdGFydGluZ1BvaW50IG11c3QgYmUgbGVzcyB0aGFuIEludGVyZXN0IE5hbWUuCisgICAqICBzdGFydGluZ1BvaW50IGNhbiBiZSBlcXVhbCB0byBJbnRlcmVzdCBOYW1lIG9ubHkgd2hlbiB0aGUgaXRlbSBpcyBpbiB0aGUgYmVnaW4oKSBwb3NpdGlvbi4KKyAgICoKKyAgICogIEl0ZXJhdGVzIHRvd2FyZCBncmVhdGVyIE5hbWVzLCB0ZXJtaW5hdGVzIHdoZW4gQ1MgZW50cnkgZmFsbHMgb3V0IG9mIEludGVyZXN0IHByZWZpeC4KKyAgICogIFdoZW4gY2hpbGRTZWxlY3RvciA9IGxlZnRtb3N0LCByZXR1cm5zIGZpcnN0IENTIGVudHJ5IHRoYXQgc2F0aXNmaWVzIG90aGVyIHNlbGVjdG9ycy4KKyAgICogIFdoZW4gY2hpbGRTZWxlY3RvciA9IHJpZ2h0bW9zdCwgaXQgZ29lcyB0aWxsIHRoZSBlbmQsIGFuZCByZXR1cm5zIENTIGVudHJ5IHRoYXQgc2F0aXNmaWVzCisgICAqICBvdGhlciBzZWxlY3RvcnMuIFJldHVybmVkIENTIGVudHJ5IGlzIHRoZSBsZWZ0bW9zdCBjaGlsZCBvZiB0aGUgcmlnaHRtb3N0IGNoaWxkLgorICAgKiAgXHJldHVybnsgdGhlIGJlc3QgbWF0Y2gsIGlmIGFueTsgb3RoZXJ3aXNlIDAgfQorICAgKi8KKyAgY29uc3QgRGF0YSoKKyAgc2VsZWN0Q2hpbGQoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LCBTa2lwTGlzdExheWVyOjppdGVyYXRvciBzdGFydGluZ1BvaW50KSBjb25zdDsKKworICAvKiogXGJyaWVmIGNoZWNrcyBpZiBDb250ZW50IFN0b3JlIGVudHJ5IHNhdGlzZmllcyBJbnRlcmVzdCBzZWxlY3RvcnMgKE1pblN1ZmZpeENvbXBvbmVudHMsCisgICAqICBNYXhTdWZmaXhDb21wb25lbnRzLCBJbXBsaWNpdCBEaWdlc3QsIE11c3RCZUZyZXNoKQorICAgKiAgXHJldHVybnsgdHJ1ZSBpZiBzYXRpc2ZpZXMgYWxsIHNlbGVjdG9yczsgZmFsc2Ugb3RoZXJ3aXNlIH0KKyAgICovCisgIGJvb2wKKyAgZG9lc0NvbXBseVdpdGhTZWxlY3RvcnMoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjczo6c2tpcF9saXN0OjpFbnRyeSogZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9lc0ludGVyZXN0Q29udGFpbkRpZ2VzdCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBpbnRlcnByZXRzIG1pblN1ZmZpeENvbXBvbmVudCBhbmQgbmFtZSBsZW5ndGhzIHRvIHVuZGVyc3RhbmQgaWYgSW50ZXJlc3QgY29udGFpbnMKKyAgICogIGltcGxpY2l0IGRpZ2VzdCBvZiB0aGUgZGF0YQorICAgKiAgXHJldHVybnsgVHJ1ZSBpZiBJbnRlcmVzdCBuYW1lIGNvbnRhaW5zIGRpZ2VzdDsgRmFsc2Ugb3RoZXJ3aXNlIH0KKyAgICovCisgIGJvb2wKKyAgcmVjb2duaXplSW50ZXJlc3RXaXRoRGlnZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwgY3M6OnNraXBfbGlzdDo6RW50cnkqIGVudHJ5KSBjb25zdDsKKworcHJpdmF0ZToKKyAgU2tpcExpc3QgbV9za2lwTGlzdDsKKyAgQ2xlYW51cEluZGV4IG1fY2xlYW51cEluZGV4OworICBzaXplX3QgbV9uTWF4UGFja2V0czsgLy8gdXNlciBkZWZpbmVkIG1heGltdW0gc2l6ZSBvZiB0aGUgQ29udGVudCBTdG9yZSBpbiBwYWNrZXRzCisgIHNpemVfdCBtX25QYWNrZXRzOyAgICAvLyBjdXJyZW50IG51bWJlciBvZiBwYWNrZXRzIGluIENvbnRlbnQgU3RvcmUKKyAgc3RkOjpxdWV1ZTxjczo6c2tpcF9saXN0OjpFbnRyeSo+IG1fZnJlZUNzRW50cmllczsgLy8gbWVtb3J5IHBvb2wKK307CisKK2lubGluZSBDczo6Y29uc3RfaXRlcmF0b3IKK0NzOjpiZWdpbigpIGNvbnN0Cit7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcihtX3NraXBMaXN0LmZyb250KCktPmJlZ2luKCkpOworfQorCitpbmxpbmUgQ3M6OmNvbnN0X2l0ZXJhdG9yCitDczo6ZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fc2tpcExpc3QuZnJvbnQoKS0+ZW5kKCkpOworfQorCitpbmxpbmUKK0NzOjpjb25zdF9pdGVyYXRvcjo6Y29uc3RfaXRlcmF0b3IoU2tpcExpc3RMYXllcjo6Y29uc3RfaXRlcmF0b3IgaXQpCisgIDogbV9za2lwTGlzdEl0ZXJhdG9yKGl0KQoreworfQorCitpbmxpbmUKK0NzOjpjb25zdF9pdGVyYXRvcjo6fmNvbnN0X2l0ZXJhdG9yKCkKK3sKK30KKworaW5saW5lIENzOjpjb25zdF9pdGVyYXRvciYKK0NzOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7CisgICsrbV9za2lwTGlzdEl0ZXJhdG9yOworICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBDczo6Y29uc3RfaXRlcmF0b3IKK0NzOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKyhpbnQpCit7CisgIENzOjpjb25zdF9pdGVyYXRvciB0ZW1wKCp0aGlzKTsKKyAgKysoKnRoaXMpOworICByZXR1cm4gdGVtcDsKK30KKworaW5saW5lIENzOjpjb25zdF9pdGVyYXRvcjo6cmVmZXJlbmNlCitDczo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7CisgIHJldHVybiAqKHRoaXMtPm9wZXJhdG9yLT4oKSk7Cit9CisKK2lubGluZSBDczo6Y29uc3RfaXRlcmF0b3I6OnBvaW50ZXIKK0NzOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0Cit7CisgIHJldHVybiAqbV9za2lwTGlzdEl0ZXJhdG9yOworfQorCitpbmxpbmUgYm9vbAorQ3M6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IENzOjpjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBtX3NraXBMaXN0SXRlcmF0b3IgPT0gb3RoZXIubV9za2lwTGlzdEl0ZXJhdG9yOworfQorCitpbmxpbmUgYm9vbAorQ3M6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IENzOjpjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX1RBQkxFX0NTX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9kZWFkLW5vbmNlLWxpc3QuY3BwIGIvTkZEL2RhZW1vbi90YWJsZS9kZWFkLW5vbmNlLWxpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNmFmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL2RlYWQtbm9uY2UtbGlzdC5jcHAKQEAgLTAsMCArMSwxNzEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJkZWFkLW5vbmNlLWxpc3QuaHBwIgorI2luY2x1ZGUgImNvcmUvY2l0eS1oYXNoLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKK05GRF9MT0dfSU5JVCgiRGVhZE5vbmNlTGlzdCIpOworCituYW1lc3BhY2UgbmZkIHsKKworY29uc3QgdGltZTo6bmFub3NlY29uZHMgRGVhZE5vbmNlTGlzdDo6REVGQVVMVF9MSUZFVElNRSA9IHRpbWU6OnNlY29uZHMoNik7Citjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBEZWFkTm9uY2VMaXN0OjpNSU5fTElGRVRJTUUgPSB0aW1lOjptaWxsaXNlY29uZHMoMSk7Citjb25zdCBzaXplX3QgRGVhZE5vbmNlTGlzdDo6SU5JVElBTF9DQVBBQ0lUWSA9ICgxIDw8IDcpOworY29uc3Qgc2l6ZV90IERlYWROb25jZUxpc3Q6Ok1JTl9DQVBBQ0lUWSA9ICgxIDw8IDMpOworY29uc3Qgc2l6ZV90IERlYWROb25jZUxpc3Q6Ok1BWF9DQVBBQ0lUWSA9ICgxIDw8IDI0KTsKK2NvbnN0IERlYWROb25jZUxpc3Q6OkVudHJ5IERlYWROb25jZUxpc3Q6Ok1BUksgPSAwOworY29uc3Qgc2l6ZV90IERlYWROb25jZUxpc3Q6OkVYUEVDVEVEX01BUktfQ09VTlQgPSA1OworY29uc3QgZG91YmxlIERlYWROb25jZUxpc3Q6OkNBUEFDSVRZX1VQID0gMS4yOworY29uc3QgZG91YmxlIERlYWROb25jZUxpc3Q6OkNBUEFDSVRZX0RPV04gPSAwLjk7Citjb25zdCBzaXplX3QgRGVhZE5vbmNlTGlzdDo6RVZJQ1RfTElNSVQgPSAoMSA8PCA2KTsKKworRGVhZE5vbmNlTGlzdDo6RGVhZE5vbmNlTGlzdChjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgbGlmZXRpbWUpCisgIDogbV9saWZldGltZShsaWZldGltZSkKKyAgLCBtX3F1ZXVlKG1faW5kZXguZ2V0PDA+KCkpCisgICwgbV9odChtX2luZGV4LmdldDwxPigpKQorICAsIG1fY2FwYWNpdHkoSU5JVElBTF9DQVBBQ0lUWSkKKyAgLCBtX21hcmtJbnRlcnZhbChtX2xpZmV0aW1lIC8gRVhQRUNURURfTUFSS19DT1VOVCkKKyAgLCBtX2FkanVzdENhcGFjaXR5SW50ZXJ2YWwobV9saWZldGltZSkKK3sKKyAgaWYgKG1fbGlmZXRpbWUgPCBNSU5fTElGRVRJTUUpIHsKKyAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoImxpZmV0aW1lIGlzIGxlc3MgdGhhbiBNSU5fTElGRVRJTUUiKTsKKyAgfQorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRVhQRUNURURfTUFSS19DT1VOVDsgKytpKSB7CisgICAgbV9xdWV1ZS5wdXNoX2JhY2soTUFSSyk7CisgIH0KKworICBtX21hcmtFdmVudCA9IHNjaGVkdWxlcjo6c2NoZWR1bGUobV9tYXJrSW50ZXJ2YWwsIGJpbmQoJkRlYWROb25jZUxpc3Q6Om1hcmssIHRoaXMpKTsKKyAgbV9hZGp1c3RDYXBhY2l0eUV2ZW50ID0gc2NoZWR1bGVyOjpzY2hlZHVsZShtX2FkanVzdENhcGFjaXR5SW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRGVhZE5vbmNlTGlzdDo6YWRqdXN0Q2FwYWNpdHksIHRoaXMpKTsKK30KKworRGVhZE5vbmNlTGlzdDo6fkRlYWROb25jZUxpc3QoKQoreworICBzY2hlZHVsZXI6OmNhbmNlbChtX21hcmtFdmVudCk7CisgIHNjaGVkdWxlcjo6Y2FuY2VsKG1fYWRqdXN0Q2FwYWNpdHlFdmVudCk7CisKKyAgQk9PU1RfQVNTRVJUX01TRyhERUZBVUxUX0xJRkVUSU1FID49IE1JTl9MSUZFVElNRSwgIkRFRkFVTFRfTElGRVRJTUUgaXMgdG9vIHNtYWxsIik7CisgIHN0YXRpY19hc3NlcnQoSU5JVElBTF9DQVBBQ0lUWSA+PSBNSU5fQ0FQQUNJVFksICJJTklUSUFMX0NBUEFDSVRZIGlzIHRvbyBzbWFsbCIpOworICBzdGF0aWNfYXNzZXJ0KElOSVRJQUxfQ0FQQUNJVFkgPD0gTUFYX0NBUEFDSVRZLCAiSU5JVElBTF9DQVBBQ0lUWSBpcyB0b28gbGFyZ2UiKTsKKyAgQk9PU1RfQVNTRVJUX01TRyhzdGF0aWNfY2FzdDxzaXplX3Q+KE1JTl9DQVBBQ0lUWSAqIENBUEFDSVRZX1VQKSA+IE1JTl9DQVBBQ0lUWSwKKyAgICAgICAgICAgICAgICAgICAiQ0FQQUNJVFlfVVAgbXVzdCBiZSBhYmxlIHRvIGluY3JlYXNlIGZyb20gTUlOX0NBUEFDSVRZIik7CisgIEJPT1NUX0FTU0VSVF9NU0coc3RhdGljX2Nhc3Q8c2l6ZV90PihNQVhfQ0FQQUNJVFkgKiBDQVBBQ0lUWV9ET1dOKSA8IE1BWF9DQVBBQ0lUWSwKKyAgICAgICAgICAgICAgICAgICAiQ0FQQUNJVFlfRE9XTiBtdXN0IGJlIGFibGUgdG8gZGVjcmVhc2UgZnJvbSBNQVhfQ0FQQUNJVFkiKTsKKyAgQk9PU1RfQVNTRVJUX01TRyhDQVBBQ0lUWV9VUCA+IDEuMCwgIkNBUEFDSVRZX1VQIG11c3QgYWRqdXN0IHVwIik7CisgIEJPT1NUX0FTU0VSVF9NU0coQ0FQQUNJVFlfRE9XTiA8IDEuMCwgIkNBUEFDSVRZX0RPV04gbXVzdCBhZGp1c3QgZG93biIpOworICBzdGF0aWNfYXNzZXJ0KEVWSUNUX0xJTUlUID49IDEsICJFVklDVF9MSU1JVCBtdXN0IGJlIGF0IGxlYXN0IDEiKTsKK30KKworc2l6ZV90CitEZWFkTm9uY2VMaXN0OjpzaXplKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fcXVldWUuc2l6ZSgpIC0gdGhpcy0+Y291bnRNYXJrcygpOworfQorCitib29sCitEZWFkTm9uY2VMaXN0OjpoYXMoY29uc3QgTmFtZSYgbmFtZSwgdWludDMyX3Qgbm9uY2UpIGNvbnN0Cit7CisgIEVudHJ5IGVudHJ5ID0gRGVhZE5vbmNlTGlzdDo6bWFrZUVudHJ5KG5hbWUsIG5vbmNlKTsKKyAgcmV0dXJuIG1faHQuZmluZChlbnRyeSkgIT0gbV9odC5lbmQoKTsKK30KKwordm9pZAorRGVhZE5vbmNlTGlzdDo6YWRkKGNvbnN0IE5hbWUmIG5hbWUsIHVpbnQzMl90IG5vbmNlKQoreworICBFbnRyeSBlbnRyeSA9IERlYWROb25jZUxpc3Q6Om1ha2VFbnRyeShuYW1lLCBub25jZSk7CisgIG1fcXVldWUucHVzaF9iYWNrKGVudHJ5KTsKKworICB0aGlzLT5ldmljdEVudHJpZXMoKTsKK30KKworRGVhZE5vbmNlTGlzdDo6RW50cnkKK0RlYWROb25jZUxpc3Q6Om1ha2VFbnRyeShjb25zdCBOYW1lJiBuYW1lLCB1aW50MzJfdCBub25jZSkKK3sKKyAgQmxvY2sgbmFtZVdpcmUgPSBuYW1lLndpcmVFbmNvZGUoKTsKKyAgcmV0dXJuIENpdHlIYXNoNjRXaXRoU2VlZChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihuYW1lV2lyZS53aXJlKCkpLCBuYW1lV2lyZS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5vbmNlKSk7Cit9CisKK3NpemVfdAorRGVhZE5vbmNlTGlzdDo6Y291bnRNYXJrcygpIGNvbnN0Cit7CisgIHJldHVybiBtX2h0LmNvdW50KE1BUkspOworfQorCit2b2lkCitEZWFkTm9uY2VMaXN0OjptYXJrKCkKK3sKKyAgbV9xdWV1ZS5wdXNoX2JhY2soTUFSSyk7CisgIHNpemVfdCBuTWFya3MgPSB0aGlzLT5jb3VudE1hcmtzKCk7CisgIG1fYWN0dWFsTWFya0NvdW50cy5pbnNlcnQobk1hcmtzKTsKKworICBORkRfTE9HX0RFQlVHKCJtYXJrIG5NYXJrcz0iIDw8IG5NYXJrcyk7CisKKyAgc2NoZWR1bGVyOjpzY2hlZHVsZShtX21hcmtJbnRlcnZhbCwgYmluZCgmRGVhZE5vbmNlTGlzdDo6bWFyaywgdGhpcykpOworfQorCit2b2lkCitEZWFkTm9uY2VMaXN0OjphZGp1c3RDYXBhY2l0eSgpCit7CisgIHN0ZDo6cGFpcjxzdGQ6Om11bHRpc2V0PHNpemVfdD46Oml0ZXJhdG9yLCBzdGQ6Om11bHRpc2V0PHNpemVfdD46Oml0ZXJhdG9yPiBlcXVhbFJhbmdlID0KKyAgICBtX2FjdHVhbE1hcmtDb3VudHMuZXF1YWxfcmFuZ2UoRVhQRUNURURfTUFSS19DT1VOVCk7CisKKyAgaWYgKGVxdWFsUmFuZ2Uuc2Vjb25kID09IG1fYWN0dWFsTWFya0NvdW50cy5iZWdpbigpKSB7CisgICAgLy8gYWxsIGNvdW50cyBhcmUgYWJvdmUgZXhwZWN0ZWQgY291bnQsIGFkanVzdCBkb3duCisgICAgbV9jYXBhY2l0eSA9IHN0ZDo6bWF4KE1JTl9DQVBBQ0lUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihtX2NhcGFjaXR5ICogQ0FQQUNJVFlfRE9XTikpOworICAgIE5GRF9MT0dfREVCVUcoImFkanVzdENhcGFjaXR5IERPV04gY2FwYWNpdHk9IiA8PCBtX2NhcGFjaXR5KTsKKyAgfQorICBlbHNlIGlmIChlcXVhbFJhbmdlLmZpcnN0ID09IG1fYWN0dWFsTWFya0NvdW50cy5lbmQoKSkgeworICAgIC8vIGFsbCBjb3VudHMgYXJlIGJlbG93IGV4cGVjdGVkIGNvdW50LCBhZGp1c3QgdXAKKyAgICBtX2NhcGFjaXR5ID0gc3RkOjptaW4oTUFYX0NBUEFDSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fY2FwYWNpdHkgKiBDQVBBQ0lUWV9VUCkpOworICAgIE5GRF9MT0dfREVCVUcoImFkanVzdENhcGFjaXR5IFVQIGNhcGFjaXR5PSIgPDwgbV9jYXBhY2l0eSk7CisgIH0KKworICBtX2FjdHVhbE1hcmtDb3VudHMuY2xlYXIoKTsKKworICB0aGlzLT5ldmljdEVudHJpZXMoKTsKKworICBtX2FkanVzdENhcGFjaXR5RXZlbnQgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKG1fYWRqdXN0Q2FwYWNpdHlJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZEZWFkTm9uY2VMaXN0OjphZGp1c3RDYXBhY2l0eSwgdGhpcykpOworfQorCit2b2lkCitEZWFkTm9uY2VMaXN0OjpldmljdEVudHJpZXMoKQoreworICBzc2l6ZV90IG5PdmVyQ2FwYWNpdHkgPSBtX3F1ZXVlLnNpemUoKSAtIG1fY2FwYWNpdHk7CisgIGlmIChuT3ZlckNhcGFjaXR5IDw9IDApIC8vIG5vdCBvdmVyIGNhcGFjaXR5CisgICAgcmV0dXJuOworCisgIGZvciAoc3NpemVfdCBuRXZpY3QgPSBzdGQ6Om1pbjxzc2l6ZV90PihuT3ZlckNhcGFjaXR5LCBFVklDVF9MSU1JVCk7IG5FdmljdCA+IDA7IC0tbkV2aWN0KSB7CisgICAgbV9xdWV1ZS5lcmFzZShtX3F1ZXVlLmJlZ2luKCkpOworICB9CisgIEJPT1NUX0FTU0VSVChtX3F1ZXVlLnNpemUoKSA+PSBtX2NhcGFjaXR5KTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL2RlYWQtbm9uY2UtbGlzdC5ocHAgYi9ORkQvZGFlbW9uL3RhYmxlL2RlYWQtbm9uY2UtbGlzdC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3ZjdjYwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvZGVhZC1ub25jZS1saXN0LmhwcApAQCAtMCwwICsxLDIyMiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX1RBQkxFX0RFQURfTk9OQ0VfTElTVF9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9UQUJMRV9ERUFEX05PTkNFX0xJU1RfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgPGJvb3N0L211bHRpX2luZGV4X2NvbnRhaW5lci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbXVsdGlfaW5kZXgvc2VxdWVuY2VkX2luZGV4LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tdWx0aV9pbmRleC9oYXNoZWRfaW5kZXguaHBwPgorI2luY2x1ZGUgImNvcmUvc2NoZWR1bGVyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyB0aGUgRGVhZCBOb25jZSBsaXN0CisgKgorICogIFRoZSBEZWFkIE5vbmNlIExpc3QgaXMgYSBnbG9iYWwgdGFibGUgdGhhdCBzdXBwbGVtZW50cyBQSVQgZm9yIGxvb3AgZGV0ZWN0aW9uLgorICogIFdoZW4gYSBOb25jZSBpcyBlcmFzZWQgKGRlYWQpIGZyb20gUElUIGVudHJ5LCB0aGUgTm9uY2UgYW5kIHRoZSBJbnRlcmVzdCBOYW1lIGlzIGFkZGVkIHRvCisgKiAgRGVhZCBOb25jZSBMaXN0LCBhbmQga2VwdCBmb3IgYSBkdXJhdGlvbiBpbiB3aGljaCBtb3N0IGxvb3BzIGFyZSBleHBlY3RlZCB0byBoYXZlIG9jY3VyZWQuCisgKgorICogIFRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UsIHRoZSBJbnRlcmVzdCBOYW1lIGFuZCBOb25jZSBhcmUgc3RvcmVkIGFzIGEgNjQtYml0IGhhc2guCisgKiAgVGhlcmUgY291bGQgYmUgZmFsc2UgcG9zaXRpdmVzIChub24tbG9vcGluZyBJbnRlcmVzdCBjb3VsZCBiZSBjb25zaWRlcmVkIGxvb3BpbmcpLAorICogIGJ1dCB0aGUgcHJvYmFiaWxpdHkgaXMgc21hbGwsIGFuZCB0aGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgd2hlbiBjb25zdW1lciByZXRyYW5zbWl0cworICogIHdpdGggYSBkaWZmZXJlbnQgTm9uY2UuCisgKgorICogIFRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UsIGVudHJpZXMgZG8gbm90IGhhdmUgYXNzb2NpYXRlZCB0aW1lc3RhbXBzLiBJbnN0ZWFkLAorICogIGxpZmV0aW1lIG9mIGVudHJpZXMgaXMgY29udHJvbGxlZCBieSBkeW5hbWljYWxseSBhZGp1c3RpbmcgdGhlIGNhcGFjaXR5IG9mIHRoZSBjb250YWluZXIuCisgKiAgQXQgZml4ZWQgaW50ZXJ2YWxzLCB0aGUgTUFSSywgYW4gZW50cnkgd2l0aCBhIHNwZWNpYWwgdmFsdWUsIGlzIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lci4KKyAqICBUaGUgbnVtYmVyIG9mIE1BUktzIHN0b3JlZCBpbiB0aGUgY29udGFpbmVyIHJlZmxlY3RzIHRoZSBsaWZldGltZSBvZiBlbnRyaWVzLAorICogIGJlY2F1c2UgTUFSS3MgYXJlIGluc2VydGVkIGF0IGZpeGVkIGludGVydmFscy4KKyAqLworY2xhc3MgRGVhZE5vbmNlTGlzdCA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIC8qKiBcYnJpZWYgY29uc3RydWN0cyB0aGUgRGVhZCBOb25jZSBMaXN0CisgICAqICBccGFyYW0gbGlmZXRpbWUgZHVyYXRpb24gb2YgdGhlIGV4cGVjdGVkIGxpZmV0aW1lIG9mIGVhY2ggbm9uY2UsCisgICAqICAgICAgICAgbXVzdCBiZSBubyBsZXNzIHRoYW4gTUlOX0xJRkVUSU1FLgorICAgKiAgICAgICAgIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgZHVyYXRpb24gaW4gd2hpY2ggbW9zdCBsb29wcyB3b3VsZCBoYXZlIG9jY3VyZWQuCisgICAqICAgICAgICAgQSBsb29wIGNhbm5vdCBiZSBkZXRlY3RlZCBpZiBkZWxheSBvZiB0aGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIGxpZmV0aW1lLgorICAgKiAgXHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCBpZiBsaWZldGltZSBpcyBsZXNzIHRoYW4gTUlOX0xJRkVUSU1FCisgICAqLworICBleHBsaWNpdAorICBEZWFkTm9uY2VMaXN0KGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzJiBsaWZldGltZSA9IERFRkFVTFRfTElGRVRJTUUpOworCisgIH5EZWFkTm9uY2VMaXN0KCk7CisKKyAgLyoqIFxicmllZiBkZXRlcm1pbmVzIGlmIG5hbWUrbm9uY2UgZXhpc3RzCisgICAqICBccmV0dXJuIHRydWUgaWYgbmFtZStub25jZSBleGlzdHMKKyAgICovCisgIGJvb2wKKyAgaGFzKGNvbnN0IE5hbWUmIG5hbWUsIHVpbnQzMl90IG5vbmNlKSBjb25zdDsKKworICAvKiogXGJyaWVmIHJlY29yZHMgbmFtZStub25jZQorICAgKi8KKyAgdm9pZAorICBhZGQoY29uc3QgTmFtZSYgbmFtZSwgdWludDMyX3Qgbm9uY2UpOworCisgIC8qKiBccmV0dXJuIG51bWJlciBvZiBzdG9yZWQgTm9uY2VzCisgICAqICBcbm90ZSBUaGUgcmV0dXJuIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gbm9uLU5vbmNlIGVudHJpZXMgaW4gdGhlIGluZGV4LCBpZiBhbnkuCisgICAqLworICBzaXplX3QKKyAgc2l6ZSgpIGNvbnN0OworCisgIC8qKiBccmV0dXJuIGV4cGVjdGVkIGxpZmV0aW1lCisgICAqLworICBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYKKyAgZ2V0TGlmZXRpbWUoKSBjb25zdDsKKworcHJpdmF0ZTogLy8gRW50cnkgYW5kIEluZGV4CisgIHR5cGVkZWYgdWludDY0X3QgRW50cnk7CisKKyAgc3RhdGljIEVudHJ5CisgIG1ha2VFbnRyeShjb25zdCBOYW1lJiBuYW1lLCB1aW50MzJfdCBub25jZSk7CisKKyAgdHlwZWRlZiBib29zdDo6bXVsdGlfaW5kZXhfY29udGFpbmVyPAorICAgIEVudHJ5LAorICAgIGJvb3N0OjptdWx0aV9pbmRleDo6aW5kZXhlZF9ieTwKKyAgICAgIGJvb3N0OjptdWx0aV9pbmRleDo6c2VxdWVuY2VkPD4sCisgICAgICBib29zdDo6bXVsdGlfaW5kZXg6Omhhc2hlZF9ub25fdW5pcXVlPAorICAgICAgICBib29zdDo6bXVsdGlfaW5kZXg6OmlkZW50aXR5PEVudHJ5PgorICAgICAgPgorICAgID4KKyAgPiBJbmRleDsKKworICB0eXBlZGVmIEluZGV4OjpudGhfaW5kZXg8MD46OnR5cGUgUXVldWU7CisgIHR5cGVkZWYgSW5kZXg6Om50aF9pbmRleDwxPjo6dHlwZSBIYXNodGFibGU7CisKK3ByaXZhdGU6IC8vIGFjdHVhbCBsaWZldGltZSBlc3RpbWF0aW9uIGFuZCBjYXBhY2l0eSBjb250cm9sCisgIC8qKiBccmV0dXJuIG51bWJlciBvZiBNQVJLcyBpbiB0aGUgaW5kZXgKKyAgICovCisgIHNpemVfdAorICBjb3VudE1hcmtzKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBhZGQgYSBNQVJLLCB0aGVuIHJlY29yZCBudW1iZXIgb2YgTUFSS3MgaW4gbV9hY3R1YWxNYXJrQ291bnRzCisgICAqLworICB2b2lkCisgIG1hcmsoKTsKKworICAvKiogXGJyaWVmIGFkanVzdCBjYXBhY2l0eSBhY2NvcmRpbmcgdG8gbV9hY3R1YWxNYXJrQ291bnRzCisgICAqCisgICAqICBJZiBhbGwgY291bnRzIGFyZSBhYm92ZSBFWFBFQ1RFRF9NQVJLX0NPVU5ULCByZWR1Y2UgY2FwYWNpdHkgdG8gbV9jYXBhY2l0eSAqIENBUEFDSVRZX0RPV04uCisgICAqICBJZiBhbGwgY291bnRzIGFyZSBiZWxvdyBFWFBFQ1RFRF9NQVJLX0NPVU5ULCBpbmNyZWFzZSBjYXBhY2l0eSB0byBtX2NhcGFjaXR5ICogQ0FQQUNJVFlfVVAuCisgICAqLworICB2b2lkCisgIGFkanVzdENhcGFjaXR5KCk7CisKKyAgLyoqIFxicmllZiBldmljdCBzb21lIGVudHJpZXMgaWYgaW5kZXggaXMgb3ZlciBjYXBhY2l0eQorICAgKi8KKyAgdm9pZAorICBldmljdEVudHJpZXMoKTsKKworcHVibGljOgorICAvLy8gZGVmYXVsdCBlbnRyeSBsaWZldGltZQorICBzdGF0aWMgY29uc3QgdGltZTo6bmFub3NlY29uZHMgREVGQVVMVF9MSUZFVElNRTsKKworICAvLy8gbWluaW11bSBlbnRyeSBsaWZldGltZQorICBzdGF0aWMgY29uc3QgdGltZTo6bmFub3NlY29uZHMgTUlOX0xJRkVUSU1FOworCitwcml2YXRlOgorICB0aW1lOjpuYW5vc2Vjb25kcyBtX2xpZmV0aW1lOworICBJbmRleCBtX2luZGV4OworICBRdWV1ZSYgbV9xdWV1ZTsKKyAgSGFzaHRhYmxlJiBtX2h0OworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BSSVZBVEU6IC8vIGFjdHVhbCBsaWZldGltZSBlc3RpbWF0aW9uIGFuZCBjYXBhY2l0eSBjb250cm9sCisKKyAgLy8gLS0tLSBjdXJyZW50IGNhcGFjaXR5IGFuZCBoYXJkIGxpbWl0cworCisgIC8qKiBcYnJpZWYgY3VycmVudCBjYXBhY2l0eSBvZiBpbmRleAorICAgKgorICAgKiAgVGhlIGluZGV4IHNpemUgaXMgbWFpbnRhaW5lZCB0byBiZSBuZWFyIHRoaXMgY2FwYWNpdHkuCisgICAqCisgICAqICBUaGUgY2FwYWNpdHkgaXMgYWRqdXN0ZWQgc28gdGhhdCBldmVyeSBFbnRyeSBpcyBleHBlY3RlZCB0byBiZSBrZXB0IGZvciBtX2xpZmV0aW1lLgorICAgKiAgVGhpcyBpcyBhY2hpZXZlZCBieSBtYXJrKCkgYW5kIGFkanVzdENhcGFjaXR5KCkuCisgICAqLworICBzaXplX3QgbV9jYXBhY2l0eTsKKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IElOSVRJQUxfQ0FQQUNJVFk7CisKKyAgLyoqIFxicmllZiBtaW5pbXVtIGNhcGFjaXR5CisgICAqCisgICAqICBUaGlzIGlzIHRvIGVuc3VyZSBjb3JyZWN0IGFsZ29yaXRobSBvcGVyYXRpb25zLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBNSU5fQ0FQQUNJVFk7CisKKyAgLyoqIFxicmllZiBtYXhpbXVtIGNhcGFjaXR5CisgICAqCisgICAqICBUaGlzIGlzIHRvIGxpbWl0IG1lbW9yeSB1c2FnZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX0NBUEFDSVRZOworCisgIC8vIC0tLS0gYWN0dWFsIGVudHJ5IGxpZmV0aW1lIGVzdGltYXRpb24KKworICAvKiogXGJyaWVmIHRoZSBNQVJLIGZvciBjYXBhY2l0eQorICAgKgorICAgKiAgVGhlIE1BUksgZG9lc24ndCBoYXZlIGEgZGlzdGluY3QgdHlwZS4KKyAgICogIEVudHJ5IGlzIGEgaGFzaC4gVGhlIGhhc2ggZnVuY3Rpb24gc2hvdWxkIGhhdmUgbm9uLWludmVydGlibGUgcHJvcGVydHksCisgICAqICBzbyBpdCdzIHVubGlrZWx5IGZvciBhIHVzdWFsIEVudHJ5IHRvIGhhdmUgY29sbGlzaW9uIHdpdGggdGhlIE1BUksuCisgICAqLworICBzdGF0aWMgY29uc3QgRW50cnkgTUFSSzsKKworICAvKiogXGJyaWVmIGV4cGVjdGVkIG51bWJlciBvZiBNQVJLcyBpbiB0aGUgaW5kZXgKKyAgICovCisgIHN0YXRpYyBjb25zdCBzaXplX3QgRVhQRUNURURfTUFSS19DT1VOVDsKKworICAvKiogXGJyaWVmIG51bWJlciBvZiBNQVJLcyBpbiB0aGUgaW5kZXggYWZ0ZXIgZWFjaCBNQVJLIGluc2VydGlvbgorICAgKgorICAgKiAgYWRqdXN0Q2FwYWNpdHkgdXNlcyB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuZCBob3cgdG8gYWRqdXN0IGNhcGNpdHksCisgICAqICBhbmQgdGhlbiBjbGVhcnMgdGhpcyBsaXN0LgorICAgKi8KKyAgc3RkOjptdWx0aXNldDxzaXplX3Q+IG1fYWN0dWFsTWFya0NvdW50czsKKworICB0aW1lOjpuYW5vc2Vjb25kcyBtX21hcmtJbnRlcnZhbDsKKworICBzY2hlZHVsZXI6OkV2ZW50SWQgbV9tYXJrRXZlbnQ7CisKKyAgLy8gLS0tLSBjYXBhY2l0eSBhZGp1c3RtZW50cworCisgIHN0YXRpYyBjb25zdCBkb3VibGUgQ0FQQUNJVFlfVVA7CisKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBDQVBBQ0lUWV9ET1dOOworCisgIHRpbWU6Om5hbm9zZWNvbmRzIG1fYWRqdXN0Q2FwYWNpdHlJbnRlcnZhbDsKKworICBzY2hlZHVsZXI6OkV2ZW50SWQgbV9hZGp1c3RDYXBhY2l0eUV2ZW50OworCisgIC8qKiBcYnJpZWYgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBldmljdCBhdCBlYWNoIG9wZXJhdGlvbiBpZiBpbmRleCBpcyBvdmVyIGNhcGFjaXR5CisgICAqLworICBzdGF0aWMgY29uc3Qgc2l6ZV90IEVWSUNUX0xJTUlUOworfTsKKworaW5saW5lIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzJgorRGVhZE5vbmNlTGlzdDo6Z2V0TGlmZXRpbWUoKSBjb25zdAoreworICByZXR1cm4gbV9saWZldGltZTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX1RBQkxFX0RFQURfTk9OQ0VfTElTVF9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vdGFibGUvZmliLWVudHJ5LmNwcCBiL05GRC9kYWVtb24vdGFibGUvZmliLWVudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVhNzZjCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi90YWJsZS9maWItZW50cnkuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJmaWItZW50cnkuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBmaWIgeworCitFbnRyeTo6RW50cnkoY29uc3QgTmFtZSYgcHJlZml4KQorICA6IG1fcHJlZml4KHByZWZpeCkKK3sKK30KKworTmV4dEhvcExpc3Q6Oml0ZXJhdG9yCitFbnRyeTo6ZmluZE5leHRIb3AoRmFjZSYgZmFjZSkKK3sKKyAgcmV0dXJuIHN0ZDo6ZmluZF9pZihtX25leHRIb3BzLmJlZ2luKCksIG1fbmV4dEhvcHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgWyZmYWNlXSAoY29uc3QgTmV4dEhvcCYgbmV4dGhvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRob3AuZ2V0RmFjZSgpLmdldCgpID09ICZmYWNlOworICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCitib29sCitFbnRyeTo6aGFzTmV4dEhvcChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpIGNvbnN0Cit7CisgIHJldHVybiBjb25zdF9jYXN0PEVudHJ5Kj4odGhpcyktPmZpbmROZXh0SG9wKCpmYWNlKSAhPSBtX25leHRIb3BzLmVuZCgpOworfQorCit2b2lkCitFbnRyeTo6YWRkTmV4dEhvcChzaGFyZWRfcHRyPEZhY2U+IGZhY2UsIHVpbnQ2NF90IGNvc3QpCit7CisgIGF1dG8gaXQgPSB0aGlzLT5maW5kTmV4dEhvcCgqZmFjZSk7CisgIGlmIChpdCA9PSBtX25leHRIb3BzLmVuZCgpKSB7CisgICAgbV9uZXh0SG9wcy5wdXNoX2JhY2soZmliOjpOZXh0SG9wKGZhY2UpKTsKKyAgICBpdCA9IG1fbmV4dEhvcHMuZW5kKCk7CisgICAgLS1pdDsKKyAgfQorICAvLyBub3cgaXQgcmVmZXJzIHRvIHRoZSBOZXh0SG9wIGZvciBmYWNlCisKKyAgaXQtPnNldENvc3QoY29zdCk7CisKKyAgdGhpcy0+c29ydE5leHRIb3BzKCk7Cit9CisKK3ZvaWQKK0VudHJ5OjpyZW1vdmVOZXh0SG9wKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSkKK3sKKyAgYXV0byBpdCA9IHRoaXMtPmZpbmROZXh0SG9wKCpmYWNlKTsKKyAgaWYgKGl0ICE9IG1fbmV4dEhvcHMuZW5kKCkpIHsKKyAgICBtX25leHRIb3BzLmVyYXNlKGl0KTsKKyAgfQorfQorCit2b2lkCitFbnRyeTo6c29ydE5leHRIb3BzKCkKK3sKKyAgc3RkOjpzb3J0KG1fbmV4dEhvcHMuYmVnaW4oKSwgbV9uZXh0SG9wcy5lbmQoKSwKKyAgICAgICAgICAgIFtdIChjb25zdCBOZXh0SG9wJiBhLCBjb25zdCBOZXh0SG9wJiBiKSB7IHJldHVybiBhLmdldENvc3QoKSA8IGIuZ2V0Q29zdCgpOyB9KTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBmaWIKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9maWItZW50cnkuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9maWItZW50cnkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjExNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL2ZpYi1lbnRyeS5ocHAKQEAgLTAsMCArMSwxMzUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9GSUJfRU5UUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfRklCX0VOVFJZX0hQUAorCisjaW5jbHVkZSAiZmliLW5leHRob3AuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgTmFtZVRyZWU7CituYW1lc3BhY2UgbmFtZV90cmVlIHsKK2NsYXNzIEVudHJ5OworfQorCituYW1lc3BhY2UgZmliIHsKKworLyoqIFxjbGFzcyBOZXh0SG9wTGlzdAorICogIFxicmllZiByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBuZXh0aG9wcworICoKKyAqICBUaGlzIHR5cGUgaGFzIHRoZXNlIG1ldGhvZHMgYXMgcHVibGljIEFQSToKKyAqICAgIGl0ZXJhdG9yPE5leHRIb3A+IGJlZ2luKCkKKyAqICAgIGl0ZXJhdG9yPE5leHRIb3A+IGVuZCgpCisgKiAgICBzaXplX3Qgc2l6ZSgpCisgKi8KK3R5cGVkZWYgc3RkOjp2ZWN0b3I8ZmliOjpOZXh0SG9wPiBOZXh0SG9wTGlzdDsKKworLyoqIFxjbGFzcyBFbnRyeQorICogIFxicmllZiByZXByZXNlbnRzIGEgRklCIGVudHJ5CisgKi8KK2NsYXNzIEVudHJ5IDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgRW50cnkoY29uc3QgTmFtZSYgcHJlZml4KTsKKworICBjb25zdCBOYW1lJgorICBnZXRQcmVmaXgoKSBjb25zdDsKKworICBjb25zdCBOZXh0SG9wTGlzdCYKKyAgZ2V0TmV4dEhvcHMoKSBjb25zdDsKKworICAvKiogXHJldHVybiB3aGV0aGVyIHRoaXMgRW50cnkgaGFzIGFueSBOZXh0SG9wIHJlY29yZAorICAgKi8KKyAgYm9vbAorICBoYXNOZXh0SG9wcygpIGNvbnN0OworCisgIC8qKiBccmV0dXJuIHdoZXRoZXIgdGhlcmUgaXMgYSBOZXh0SG9wIHJlY29yZCBmb3IgZmFjZQorICAgKgorICAgKiAgXHRvZG8gY2hhbmdlIHBhcmFtZXRlciB0eXBlIHRvIEZhY2UmCisgICAqLworICBib29sCisgIGhhc05leHRIb3Aoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKSBjb25zdDsKKworICAvKiogXGJyaWVmIGFkZHMgYSBOZXh0SG9wIHJlY29yZAorICAgKgorICAgKiAgSWYgYSBOZXh0SG9wIHJlY29yZCBmb3IgZmFjZSBhbHJlYWR5IGV4aXN0cywgaXRzIGNvc3QgaXMgdXBkYXRlZC4KKyAgICogIFxub3RlIHNoYXJlZF9wdHIgaXMgcGFzc2VkIGJ5IHZhbHVlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiB3aWxsIHRha2Ugc2hhcmVkIG93bmVyc2hpcAorICAgKi8KKyAgdm9pZAorICBhZGROZXh0SG9wKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSwgdWludDY0X3QgY29zdCk7CisKKyAgLyoqIFxicmllZiByZW1vdmVzIGEgTmV4dEhvcCByZWNvcmQKKyAgICoKKyAgICogIElmIG5vIE5leHRIb3AgcmVjb3JkIGZvciBmYWNlIGV4aXN0cywgZG8gbm90aGluZy4KKyAgICoKKyAgICogIFx0b2RvIGNoYW5nZSBwYXJhbWV0ZXIgdHlwZSB0byBGYWNlJgorICAgKi8KKyAgdm9pZAorICByZW1vdmVOZXh0SG9wKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSk7CisKK3ByaXZhdGU6CisgIC8qKiBAbm90ZSBUaGlzIG1ldGhvZCBpcyBub24tY29uc3QgYmVjYXVzZSBub3JtYWwgaXRlcmF0b3IgaXMgbmVlZGVkIGJ5IGNhbGxlcnMuCisgICAqLworICBOZXh0SG9wTGlzdDo6aXRlcmF0b3IKKyAgZmluZE5leHRIb3AoRmFjZSYgZmFjZSk7CisKKyAgLy8vIHNvcnRzIHRoZSBuZXh0aG9wIGxpc3QKKyAgdm9pZAorICBzb3J0TmV4dEhvcHMoKTsKKworcHJpdmF0ZToKKyAgTmFtZSBtX3ByZWZpeDsKKyAgTmV4dEhvcExpc3QgbV9uZXh0SG9wczsKKworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG1fbmFtZVRyZWVFbnRyeTsKKyAgZnJpZW5kIGNsYXNzIG5mZDo6TmFtZVRyZWU7CisgIGZyaWVuZCBjbGFzcyBuZmQ6Om5hbWVfdHJlZTo6RW50cnk7Cit9OworCisKK2lubGluZSBjb25zdCBOYW1lJgorRW50cnk6OmdldFByZWZpeCgpIGNvbnN0Cit7CisgIHJldHVybiBtX3ByZWZpeDsKK30KKworaW5saW5lIGNvbnN0IE5leHRIb3BMaXN0JgorRW50cnk6OmdldE5leHRIb3BzKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbmV4dEhvcHM7Cit9CisKK2lubGluZSBib29sCitFbnRyeTo6aGFzTmV4dEhvcHMoKSBjb25zdAoreworICByZXR1cm4gIW1fbmV4dEhvcHMuZW1wdHkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZmliCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fVEFCTEVfRklCX0VOVFJZX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9maWItbmV4dGhvcC5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL2ZpYi1uZXh0aG9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzVmYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi90YWJsZS9maWItbmV4dGhvcC5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZpYi1uZXh0aG9wLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgZmliIHsKKworTmV4dEhvcDo6TmV4dEhvcChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpCisgIDogbV9mYWNlKGZhY2UpCisgICwgbV9jb3N0KDApCit7Cit9CisKK2NvbnN0IHNoYXJlZF9wdHI8RmFjZT4mCitOZXh0SG9wOjpnZXRGYWNlKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fZmFjZTsKK30KKwordm9pZAorTmV4dEhvcDo6c2V0Q29zdCh1aW50NjRfdCBjb3N0KQoreworICBtX2Nvc3QgPSBjb3N0OworfQorCit1aW50NjRfdAorTmV4dEhvcDo6Z2V0Q29zdCgpIGNvbnN0Cit7CisgIHJldHVybiBtX2Nvc3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIGZpYgorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL2ZpYi1uZXh0aG9wLmhwcCBiL05GRC9kYWVtb24vdGFibGUvZmliLW5leHRob3AuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmN2VkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL2ZpYi1uZXh0aG9wLmhwcApAQCAtMCwwICsxLDYxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fVEFCTEVfRklCX05FWFRIT1BfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfRklCX05FWFRIT1BfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgImZhY2UvZmFjZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIGZpYiB7CisKKy8qKiBcY2xhc3MgTmV4dEhvcAorICogIFxicmllZiByZXByZXNlbnRzIGEgbmV4dGhvcCByZWNvcmQgaW4gRklCIGVudHJ5CisgKi8KK2NsYXNzIE5leHRIb3AKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgTmV4dEhvcChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpOworCisgIGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mCisgIGdldEZhY2UoKSBjb25zdDsKKworICB2b2lkCisgIHNldENvc3QodWludDY0X3QgY29zdCk7CisKKyAgdWludDY0X3QKKyAgZ2V0Q29zdCgpIGNvbnN0OworCitwcml2YXRlOgorICBzaGFyZWRfcHRyPEZhY2U+IG1fZmFjZTsKKyAgdWludDY0X3QgbV9jb3N0OworfTsKKworfSAvLyBuYW1lc3BhY2UgZmliCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fVEFCTEVfRklCX05FWFRIT1BfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL2ZpYi5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL2ZpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5ZTczMwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvZmliLmNwcApAQCAtMCwwICsxLDE4NSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZpYi5ocHAiCisjaW5jbHVkZSAicGl0LWVudHJ5LmhwcCIKKyNpbmNsdWRlICJtZWFzdXJlbWVudHMtZW50cnkuaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvY29uY2VwdC9hc3NlcnQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvbmNlcHRfY2hlY2suaHBwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbmZkIHsKKworY29uc3Qgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBGaWI6OnNfZW1wdHlFbnRyeSA9IG1ha2Vfc2hhcmVkPGZpYjo6RW50cnk+KE5hbWUoKSk7CisKKy8vIGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvRm9yd2FyZEl0ZXJhdG9yCitCT09TVF9DT05DRVBUX0FTU0VSVCgoYm9vc3Q6OkZvcndhcmRJdGVyYXRvcjxGaWI6OmNvbnN0X2l0ZXJhdG9yPikpOworLy8gYm9vc3Q6OkZvcndhcmRJdGVyYXRvciBmb2xsb3dzIFNHSSBzdGFuZGFyZCBodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvRm9yd2FyZEl0ZXJhdG9yLmh0bWwsCisvLyB3aGljaCBkb2Vzbid0IHJlcXVpcmUgRGVmYXVsdENvbnN0cnVjdGlibGUKKyNpZmRlZiBIQVZFX0lTX0RFRkFVTFRfQ09OU1RSVUNUSUJMRQorc3RhdGljX2Fzc2VydChzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxGaWI6OmNvbnN0X2l0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICAgICJGaWI6OmNvbnN0X2l0ZXJhdG9yIG11c3QgYmUgZGVmYXVsdC1jb25zdHJ1Y3RpYmxlIik7CisjZWxzZQorQk9PU1RfQ09OQ0VQVF9BU1NFUlQoKGJvb3N0OjpEZWZhdWx0Q29uc3RydWN0aWJsZTxGaWI6OmNvbnN0X2l0ZXJhdG9yPikpOworI2VuZGlmIC8vIEhBVkVfSVNfREVGQVVMVF9DT05TVFJVQ1RJQkxFCisKK0ZpYjo6RmliKE5hbWVUcmVlJiBuYW1lVHJlZSkKKyAgOiBtX25hbWVUcmVlKG5hbWVUcmVlKQorICAsIG1fbkl0ZW1zKDApCit7Cit9CisKK0ZpYjo6fkZpYigpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorcHJlZGljYXRlX05hbWVUcmVlRW50cnlfaGFzRmliRW50cnkoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgZW50cnkpCit7CisgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihlbnRyeS5nZXRGaWJFbnRyeSgpKTsKK30KKworc2hhcmVkX3B0cjxmaWI6OkVudHJ5PgorRmliOjpmaW5kTG9uZ2VzdFByZWZpeE1hdGNoKGNvbnN0IE5hbWUmIHByZWZpeCkgY29uc3QKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBuYW1lVHJlZUVudHJ5ID0KKyAgICBtX25hbWVUcmVlLmZpbmRMb25nZXN0UHJlZml4TWF0Y2gocHJlZml4LCAmcHJlZGljYXRlX05hbWVUcmVlRW50cnlfaGFzRmliRW50cnkpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obmFtZVRyZWVFbnRyeSkpIHsKKyAgICByZXR1cm4gbmFtZVRyZWVFbnRyeS0+Z2V0RmliRW50cnkoKTsKKyAgfQorICByZXR1cm4gc19lbXB0eUVudHJ5OworfQorCitzaGFyZWRfcHRyPGZpYjo6RW50cnk+CitGaWI6OmZpbmRMb25nZXN0UHJlZml4TWF0Y2goc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBuYW1lVHJlZUVudHJ5KSBjb25zdAoreworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gbmFtZVRyZWVFbnRyeS0+Z2V0RmliRW50cnkoKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICByZXR1cm4gZW50cnk7CisgIG5hbWVUcmVlRW50cnkgPSBtX25hbWVUcmVlLmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZVRyZWVFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZGljYXRlX05hbWVUcmVlRW50cnlfaGFzRmliRW50cnkpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obmFtZVRyZWVFbnRyeSkpIHsKKyAgICByZXR1cm4gbmFtZVRyZWVFbnRyeS0+Z2V0RmliRW50cnkoKTsKKyAgfQorICByZXR1cm4gc19lbXB0eUVudHJ5OworfQorCitzaGFyZWRfcHRyPGZpYjo6RW50cnk+CitGaWI6OmZpbmRMb25nZXN0UHJlZml4TWF0Y2goY29uc3QgcGl0OjpFbnRyeSYgcGl0RW50cnkpIGNvbnN0Cit7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbmFtZVRyZWVFbnRyeSA9IG1fbmFtZVRyZWUuZ2V0KHBpdEVudHJ5KTsKKworICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4obmFtZVRyZWVFbnRyeSkpOworCisgIHJldHVybiBmaW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVUcmVlRW50cnkpOworfQorCitzaGFyZWRfcHRyPGZpYjo6RW50cnk+CitGaWI6OmZpbmRMb25nZXN0UHJlZml4TWF0Y2goY29uc3QgbWVhc3VyZW1lbnRzOjpFbnRyeSYgbWVhc3VyZW1lbnRzRW50cnkpIGNvbnN0Cit7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbmFtZVRyZWVFbnRyeSA9IG1fbmFtZVRyZWUuZ2V0KG1lYXN1cmVtZW50c0VudHJ5KTsKKworICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4obmFtZVRyZWVFbnRyeSkpOworCisgIHJldHVybiBmaW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVUcmVlRW50cnkpOworfQorCitzaGFyZWRfcHRyPGZpYjo6RW50cnk+CitGaWI6OmZpbmRFeGFjdE1hdGNoKGNvbnN0IE5hbWUmIHByZWZpeCkgY29uc3QKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBuYW1lVHJlZUVudHJ5ID0gbV9uYW1lVHJlZS5maW5kRXhhY3RNYXRjaChwcmVmaXgpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obmFtZVRyZWVFbnRyeSkpCisgICAgcmV0dXJuIG5hbWVUcmVlRW50cnktPmdldEZpYkVudHJ5KCk7CisgIHJldHVybiBzaGFyZWRfcHRyPGZpYjo6RW50cnk+KCk7Cit9CisKK3N0ZDo6cGFpcjxzaGFyZWRfcHRyPGZpYjo6RW50cnk+LCBib29sPgorRmliOjppbnNlcnQoY29uc3QgTmFtZSYgcHJlZml4KQoreworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG5hbWVUcmVlRW50cnkgPSBtX25hbWVUcmVlLmxvb2t1cChwcmVmaXgpOworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gbmFtZVRyZWVFbnRyeS0+Z2V0RmliRW50cnkoKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW50cnksIGZhbHNlKTsKKyAgZW50cnkgPSBtYWtlX3NoYXJlZDxmaWI6OkVudHJ5PihwcmVmaXgpOworICBuYW1lVHJlZUVudHJ5LT5zZXRGaWJFbnRyeShlbnRyeSk7CisgICsrbV9uSXRlbXM7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihlbnRyeSwgdHJ1ZSk7Cit9CisKK3ZvaWQKK0ZpYjo6ZXJhc2Uoc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBuYW1lVHJlZUVudHJ5KQoreworICBuYW1lVHJlZUVudHJ5LT5zZXRGaWJFbnRyeShzaGFyZWRfcHRyPGZpYjo6RW50cnk+KCkpOworICBtX25hbWVUcmVlLmVyYXNlRW50cnlJZkVtcHR5KG5hbWVUcmVlRW50cnkpOworICAtLW1fbkl0ZW1zOworfQorCit2b2lkCitGaWI6OmVyYXNlKGNvbnN0IE5hbWUmIHByZWZpeCkKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBuYW1lVHJlZUVudHJ5ID0gbV9uYW1lVHJlZS5maW5kRXhhY3RNYXRjaChwcmVmaXgpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obmFtZVRyZWVFbnRyeSkpIHsKKyAgICB0aGlzLT5lcmFzZShuYW1lVHJlZUVudHJ5KTsKKyAgfQorfQorCit2b2lkCitGaWI6OmVyYXNlKGNvbnN0IGZpYjo6RW50cnkmIGVudHJ5KQoreworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG5hbWVUcmVlRW50cnkgPSBtX25hbWVUcmVlLmdldChlbnRyeSk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihuYW1lVHJlZUVudHJ5KSkgeworICAgIHRoaXMtPmVyYXNlKG5hbWVUcmVlRW50cnkpOworICB9Cit9CisKK3ZvaWQKK0ZpYjo6cmVtb3ZlTmV4dEhvcEZyb21BbGxFbnRyaWVzKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSkKK3sKKyAgc3RkOjpsaXN0PGZpYjo6RW50cnkqPiB0b0VyYXNlOworCisgIGF1dG8mJiBlbnVtZXJhYmxlID0gbV9uYW1lVHJlZS5mdWxsRW51bWVyYXRlKCZwcmVkaWNhdGVfTmFtZVRyZWVFbnRyeV9oYXNGaWJFbnRyeSk7CisgIGZvciAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgbnRlIDogZW51bWVyYWJsZSkgeworICAgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZW50cnkgPSBudGUuZ2V0RmliRW50cnkoKTsKKyAgICBlbnRyeS0+cmVtb3ZlTmV4dEhvcChmYWNlKTsKKyAgICBpZiAoIWVudHJ5LT5oYXNOZXh0SG9wcygpKSB7CisgICAgICB0b0VyYXNlLnB1c2hfYmFjayhlbnRyeS5nZXQoKSk7CisgICAgICAvLyBlbnRyeSBuZWVkcyB0byBiZSBlcmFzZWQsIGJ1dCB3ZSBtdXN0IHdhaXQgdW50aWwgdGhlIGVudW1lcmF0aW9uIGVuZHMsCisgICAgICAvLyBiZWNhdXNlIG90aGVyd2lzZSBOYW1lVHJlZSBpdGVyYXRvciB3b3VsZCBiZSBpbnZhbGlkYXRlZAorICAgIH0KKyAgfQorCisgIGZvciAoZmliOjpFbnRyeSogZW50cnkgOiB0b0VyYXNlKSB7CisgICAgdGhpcy0+ZXJhc2UoKmVudHJ5KTsKKyAgfQorfQorCitGaWI6OmNvbnN0X2l0ZXJhdG9yCitGaWI6OmJlZ2luKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fbmFtZVRyZWUuZnVsbEVudW1lcmF0ZSgmcHJlZGljYXRlX05hbWVUcmVlRW50cnlfaGFzRmliRW50cnkpLmJlZ2luKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vdGFibGUvZmliLmhwcCBiL05GRC9kYWVtb24vdGFibGUvZmliLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGEyMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi90YWJsZS9maWIuaHBwCkBAIC0wLDAgKzEsMjMwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fVEFCTEVfRklCX0hQUAorI2RlZmluZSBORkRfREFFTU9OX1RBQkxFX0ZJQl9IUFAKKworI2luY2x1ZGUgImZpYi1lbnRyeS5ocHAiCisjaW5jbHVkZSAibmFtZS10cmVlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK25hbWVzcGFjZSBtZWFzdXJlbWVudHMgeworY2xhc3MgRW50cnk7Cit9CituYW1lc3BhY2UgcGl0IHsKK2NsYXNzIEVudHJ5OworfQorCisvKiogXGNsYXNzIEZpYgorICogIFxicmllZiByZXByZXNlbnRzIHRoZSBGSUIKKyAqLworY2xhc3MgRmliIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgRmliKE5hbWVUcmVlJiBuYW1lVHJlZSk7CisKKyAgfkZpYigpOworCisgIHNpemVfdAorICBzaXplKCkgY29uc3Q7CisKK3B1YmxpYzogLy8gbG9va3VwCisgIC8vLyBwZXJmb3JtcyBhIGxvbmdlc3QgcHJlZml4IG1hdGNoCisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4KKyAgZmluZExvbmdlc3RQcmVmaXhNYXRjaChjb25zdCBOYW1lJiBwcmVmaXgpIGNvbnN0OworCisgIC8vLyBwZXJmb3JtcyBhIGxvbmdlc3QgcHJlZml4IG1hdGNoCisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4KKyAgZmluZExvbmdlc3RQcmVmaXhNYXRjaChjb25zdCBwaXQ6OkVudHJ5JiBwaXRFbnRyeSkgY29uc3Q7CisKKyAgLy8vIHBlcmZvcm1zIGEgbG9uZ2VzdCBwcmVmaXggbWF0Y2gKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PgorICBmaW5kTG9uZ2VzdFByZWZpeE1hdGNoKGNvbnN0IG1lYXN1cmVtZW50czo6RW50cnkmIG1lYXN1cmVtZW50c0VudHJ5KSBjb25zdDsKKworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+CisgIGZpbmRFeGFjdE1hdGNoKGNvbnN0IE5hbWUmIHByZWZpeCkgY29uc3Q7CisKK3B1YmxpYzogLy8gbXV0YXRpb24KKyAgLyoqIFxicmllZiBpbnNlcnRzIGEgRklCIGVudHJ5IGZvciBwcmVmaXgKKyAgICogIElmIGFuIGVudHJ5IGZvciBleGFjdCBzYW1lIHByZWZpeCBleGlzdHMsIHRoYXQgZW50cnkgaXMgcmV0dXJuZWQuCisgICAqICBccmV0dXJueyB0aGUgZW50cnksIGFuZCB0cnVlIGZvciBuZXcgZW50cnksIGZhbHNlIGZvciBleGlzdGluZyBlbnRyeSB9CisgICAqLworICBzdGQ6OnBhaXI8c2hhcmVkX3B0cjxmaWI6OkVudHJ5PiwgYm9vbD4KKyAgaW5zZXJ0KGNvbnN0IE5hbWUmIHByZWZpeCk7CisKKyAgdm9pZAorICBlcmFzZShjb25zdCBOYW1lJiBwcmVmaXgpOworCisgIHZvaWQKKyAgZXJhc2UoY29uc3QgZmliOjpFbnRyeSYgZW50cnkpOworCisgIC8qKiBcYnJpZWYgcmVtb3ZlcyB0aGUgTmV4dEhvcCByZWNvcmQgZm9yIGZhY2UgaW4gYWxsIGVudHJpdGVzCisgICAqCisgICAqICBUaGlzIGlzIHVzdWFsbHkgaW52b2tlZCB3aGVuIGZhY2UgZ29lcyBhd2F5LgorICAgKiAgUmVtb3ZpbmcgdGhlIGxhc3QgTmV4dEhvcCBpbiBhIEZJQiBlbnRyeSB3aWxsIGVyYXNlIHRoZSBGSUIgZW50cnkuCisgICAqCisgICAqICBcdG9kbyBjaGFuZ2UgcGFyYW1ldGVyIHR5cGUgdG8gRmFjZSYKKyAgICovCisgIHZvaWQKKyAgcmVtb3ZlTmV4dEhvcEZyb21BbGxFbnRyaWVzKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSk7CisKK3B1YmxpYzogLy8gZW51bWVyYXRpb24KKyAgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBGSUIgZW50cnkKKyAgICogIFxub3RlIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhbmQgaXMgdW5kZWZpbmVkCisgICAqICBcbm90ZSBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgbWF5IGdldCBpbnZhbGlkYXRlZCBpZiBGSUIgb3IgYW5vdGhlciBOYW1lVHJlZS1iYXNlZAorICAgKiAgICAgICAgdGFibGUgaXMgbW9kaWZpZWQKKyAgICovCisgIGNvbnN0X2l0ZXJhdG9yCisgIGJlZ2luKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHJlZmVycmluZyB0byB0aGUgcGFzdC10aGUtZW5kIEZJQiBlbnRyeQorICAgKiAgXG5vdGUgVGhlIHJldHVybmVkIGl0ZXJhdG9yIG1heSBnZXQgaW52YWxpZGF0ZWQgaWYgRklCIG9yIGFub3RoZXIgTmFtZVRyZWUtYmFzZWQKKyAgICogICAgICAgIHRhYmxlIGlzIG1vZGlmaWVkCisgICAqLworICBjb25zdF9pdGVyYXRvcgorICBlbmQoKSBjb25zdDsKKworICBjbGFzcyBjb25zdF9pdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIGNvbnN0IGZpYjo6RW50cnk+CisgIHsKKyAgcHVibGljOgorICAgIGNvbnN0X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgZXhwbGljaXQKKyAgICBjb25zdF9pdGVyYXRvcihjb25zdCBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3ImIGl0KTsKKworICAgIH5jb25zdF9pdGVyYXRvcigpOworCisgICAgY29uc3QgZmliOjpFbnRyeSYKKyAgICBvcGVyYXRvciooKSBjb25zdDsKKworICAgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4KKyAgICBvcGVyYXRvci0+KCkgY29uc3Q7CisKKyAgICBjb25zdF9pdGVyYXRvciYKKyAgICBvcGVyYXRvcisrKCk7CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIG9wZXJhdG9yKysoaW50KTsKKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7CisKKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgTmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yIG1fbmFtZVRyZWVJdGVyYXRvcjsKKyAgfTsKKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PgorICBmaW5kTG9uZ2VzdFByZWZpeE1hdGNoKHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbmFtZVRyZWVFbnRyeSkgY29uc3Q7CisKKyAgdm9pZAorICBlcmFzZShzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG5hbWVUcmVlRW50cnkpOworCitwcml2YXRlOgorICBOYW1lVHJlZSYgbV9uYW1lVHJlZTsKKyAgc2l6ZV90IG1fbkl0ZW1zOworCisgIC8qKiBcYnJpZWYgVGhlIGVtcHR5IEZJQiBlbnRyeS4KKyAgICoKKyAgICogIFRoaXMgZW50cnkgaGFzIG5vIG5leHRob3BzLgorICAgKiAgSXQgaXMgcmV0dXJuZWQgYnkgZmluZExvbmdlc3RQcmVmaXhNYXRjaCBpZiBub3RoaW5nIGlzIG1hdGNoZWQuCisgICAqICBSZXR1cm5pbmcgZW1wdHkgZW50cnkgaW5zdGVhZCBvZiBudWxscHRyIG1ha2VzIGZvcndhcmRpbmcgYW5kIHN0cmF0ZWd5IGltcGxlbWVudGF0aW9uIGVhc2llci4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IHNfZW1wdHlFbnRyeTsKK307CisKK2lubGluZSBzaXplX3QKK0ZpYjo6c2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX25JdGVtczsKK30KKworaW5saW5lIEZpYjo6Y29uc3RfaXRlcmF0b3IKK0ZpYjo6ZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fbmFtZVRyZWUuZW5kKCkpOworfQorCitpbmxpbmUKK0ZpYjo6Y29uc3RfaXRlcmF0b3I6OmNvbnN0X2l0ZXJhdG9yKGNvbnN0IE5hbWVUcmVlOjpjb25zdF9pdGVyYXRvciYgaXQpCisgIDogbV9uYW1lVHJlZUl0ZXJhdG9yKGl0KQoreworfQorCitpbmxpbmUKK0ZpYjo6Y29uc3RfaXRlcmF0b3I6On5jb25zdF9pdGVyYXRvcigpCit7Cit9CisKK2lubGluZQorRmliOjpjb25zdF9pdGVyYXRvcgorRmliOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKyhpbnQpCit7CisgIEZpYjo6Y29uc3RfaXRlcmF0b3IgdGVtcCgqdGhpcyk7CisgICsrKCp0aGlzKTsKKyAgcmV0dXJuIHRlbXA7Cit9CisKK2lubGluZSBGaWI6OmNvbnN0X2l0ZXJhdG9yJgorRmliOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7CisgICsrbV9uYW1lVHJlZUl0ZXJhdG9yOworICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBjb25zdCBmaWI6OkVudHJ5JgorRmliOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sKKyAgcmV0dXJuICp0aGlzLT5vcGVyYXRvci0+KCk7Cit9CisKK2lubGluZSBzaGFyZWRfcHRyPGZpYjo6RW50cnk+CitGaWI6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbmFtZVRyZWVJdGVyYXRvci0+Z2V0RmliRW50cnkoKTsKK30KKworaW5saW5lIGJvb2wKK0ZpYjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgRmliOjpjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBtX25hbWVUcmVlSXRlcmF0b3IgPT0gb3RoZXIubV9uYW1lVHJlZUl0ZXJhdG9yOworfQorCitpbmxpbmUgYm9vbAorRmliOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBGaWI6OmNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIG1fbmFtZVRyZWVJdGVyYXRvciAhPSBvdGhlci5tX25hbWVUcmVlSXRlcmF0b3I7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9UQUJMRV9GSUJfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy1hY2Nlc3Nvci5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy1hY2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiMTQzMgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvbWVhc3VyZW1lbnRzLWFjY2Vzc29yLmNwcApAQCAtMCwwICsxLDU5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAibWVhc3VyZW1lbnRzLWFjY2Vzc29yLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK3VzaW5nIGZ3OjpTdHJhdGVneTsKKworTWVhc3VyZW1lbnRzQWNjZXNzb3I6Ok1lYXN1cmVtZW50c0FjY2Vzc29yKE1lYXN1cmVtZW50cyYgbWVhc3VyZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmF0ZWd5Q2hvaWNlJiBzdHJhdGVneUNob2ljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJhdGVneSogc3RyYXRlZ3kpCisgIDogbV9tZWFzdXJlbWVudHMobWVhc3VyZW1lbnRzKQorICAsIG1fc3RyYXRlZ3lDaG9pY2Uoc3RyYXRlZ3lDaG9pY2UpCisgICwgbV9zdHJhdGVneShzdHJhdGVneSkKK3sKK30KKworTWVhc3VyZW1lbnRzQWNjZXNzb3I6On5NZWFzdXJlbWVudHNBY2Nlc3NvcigpCit7Cit9CisKK3NoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KK01lYXN1cmVtZW50c0FjY2Vzc29yOjpmaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiYgZW50cnkpCit7CisgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKSB7CisgICAgcmV0dXJuIGVudHJ5OworICB9CisKKyAgU3RyYXRlZ3kmIGVmZmVjdGl2ZVN0cmF0ZWd5ID0gbV9zdHJhdGVneUNob2ljZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koKmVudHJ5KTsKKyAgaWYgKCZlZmZlY3RpdmVTdHJhdGVneSA9PSBtX3N0cmF0ZWd5KSB7CisgICAgcmV0dXJuIGVudHJ5OworICB9CisgIHJldHVybiBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9tZWFzdXJlbWVudHMtYWNjZXNzb3IuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9tZWFzdXJlbWVudHMtYWNjZXNzb3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MmNmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy1hY2Nlc3Nvci5ocHAKQEAgLTAsMCArMSwxMjIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9NRUFTVVJFTUVOVFNfQUNDRVNTT1JfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfTUVBU1VSRU1FTlRTX0FDQ0VTU09SX0hQUAorCisjaW5jbHVkZSAibWVhc3VyZW1lbnRzLmhwcCIKKyNpbmNsdWRlICJzdHJhdGVneS1jaG9pY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworbmFtZXNwYWNlIGZ3IHsKK2NsYXNzIFN0cmF0ZWd5OworfQorCisvKiogXGJyaWVmIGFsbG93cyBTdHJhdGVneSB0byBhY2Nlc3MgcG9ydGlvbiBvZiBNZWFzdXJlbWVudHMgdGFibGUgdW5kZXIgaXRzIG5hbWVzcGFjZQorICovCitjbGFzcyBNZWFzdXJlbWVudHNBY2Nlc3NvciA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIE1lYXN1cmVtZW50c0FjY2Vzc29yKE1lYXN1cmVtZW50cyYgbWVhc3VyZW1lbnRzLCBTdHJhdGVneUNob2ljZSYgc3RyYXRlZ3lDaG9pY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZ3OjpTdHJhdGVneSogc3RyYXRlZ3kpOworCisgIH5NZWFzdXJlbWVudHNBY2Nlc3NvcigpOworCisgIC8qKiBcYnJpZWYgZmluZCBvciBpbnNlcnQgYSBNZWFzdXJlbWVudHMgZW50cnkgZm9yIG5hbWUKKyAgICovCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KKyAgZ2V0KGNvbnN0IE5hbWUmIG5hbWUpOworCisgIC8qKiBcYnJpZWYgZmluZCBvciBpbnNlcnQgYSBNZWFzdXJlbWVudHMgZW50cnkgZm9yIGZpYkVudHJ5LT5nZXRQcmVmaXgoKQorICAgKi8KKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PgorICBnZXQoY29uc3QgZmliOjpFbnRyeSYgZmliRW50cnkpOworCisgIC8qKiBcYnJpZWYgZmluZCBvciBpbnNlcnQgYSBNZWFzdXJlbWVudHMgZW50cnkgZm9yIHBpdEVudHJ5LT5nZXROYW1lKCkKKyAgICovCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KKyAgZ2V0KGNvbnN0IHBpdDo6RW50cnkmIHBpdEVudHJ5KTsKKworICAvKiogXGJyaWVmIGZpbmQgb3IgaW5zZXJ0IGEgTWVhc3VyZW1lbnRzIGVudHJ5IGZvciBjaGlsZCdzIHBhcmVudAorICAgKiAgXHJldHZhbCBudWxscHRyIGlmIGNoaWxkIGlzIHRoZSByb290IGVudHJ5CisgICAqLworICBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CisgIGdldFBhcmVudChjb25zdCBtZWFzdXJlbWVudHM6OkVudHJ5JiBjaGlsZCk7CisKKyAgLyoqIFxicmllZiBleHRlbmQgbGlmZXRpbWUgb2YgYW4gZW50cnkKKyAgICoKKyAgICogIFRoZSBlbnRyeSB3aWxsIGJlIGtlcHQgdW50aWwgYXQgbGVhc3Qgbm93KCkrbGlmZXRpbWUuCisgICAqLworICB2b2lkCisgIGV4dGVuZExpZmV0aW1lKG1lYXN1cmVtZW50czo6RW50cnkmIGVudHJ5LCBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgbGlmZXRpbWUpOworCitwcml2YXRlOgorICAvKiogXGJyaWVmIHBlcmZvcm0gYWNjZXNzIGNvbnRyb2wgdG8gTWVhc3VyZW1lbnRzIGVudHJ5CisgICAqICBccmV0dXJuIGVudHJ5IGlmIHN0cmF0ZWd5IGhhcyBhY2Nlc3MgdG8gbmFtZXNwYWNlLCBvdGhlcndpc2UgbnVsbHB0cgorICAgKi8KKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PgorICBmaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiYgZW50cnkpOworCitwcml2YXRlOgorICBNZWFzdXJlbWVudHMmIG1fbWVhc3VyZW1lbnRzOworICBTdHJhdGVneUNob2ljZSYgbV9zdHJhdGVneUNob2ljZTsKKyAgZnc6OlN0cmF0ZWd5KiBtX3N0cmF0ZWd5OworfTsKKworaW5saW5lIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KK01lYXN1cmVtZW50c0FjY2Vzc29yOjpnZXQoY29uc3QgTmFtZSYgbmFtZSkKK3sKKyAgcmV0dXJuIHRoaXMtPmZpbHRlcihtX21lYXN1cmVtZW50cy5nZXQobmFtZSkpOworfQorCitpbmxpbmUgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PgorTWVhc3VyZW1lbnRzQWNjZXNzb3I6OmdldChjb25zdCBmaWI6OkVudHJ5JiBmaWJFbnRyeSkKK3sKKyAgcmV0dXJuIHRoaXMtPmZpbHRlcihtX21lYXN1cmVtZW50cy5nZXQoZmliRW50cnkpKTsKK30KKworaW5saW5lIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KK01lYXN1cmVtZW50c0FjY2Vzc29yOjpnZXQoY29uc3QgcGl0OjpFbnRyeSYgcGl0RW50cnkpCit7CisgIHJldHVybiB0aGlzLT5maWx0ZXIobV9tZWFzdXJlbWVudHMuZ2V0KHBpdEVudHJ5KSk7Cit9CisKK2lubGluZSBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CitNZWFzdXJlbWVudHNBY2Nlc3Nvcjo6Z2V0UGFyZW50KGNvbnN0IG1lYXN1cmVtZW50czo6RW50cnkmIGNoaWxkKQoreworICByZXR1cm4gdGhpcy0+ZmlsdGVyKG1fbWVhc3VyZW1lbnRzLmdldFBhcmVudChjaGlsZCkpOworfQorCitpbmxpbmUgdm9pZAorTWVhc3VyZW1lbnRzQWNjZXNzb3I6OmV4dGVuZExpZmV0aW1lKG1lYXN1cmVtZW50czo6RW50cnkmIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzJiBsaWZldGltZSkKK3sKKyAgbV9tZWFzdXJlbWVudHMuZXh0ZW5kTGlmZXRpbWUoZW50cnksIGxpZmV0aW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX1RBQkxFX01FQVNVUkVNRU5UU19BQ0NFU1NPUl9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vdGFibGUvbWVhc3VyZW1lbnRzLWVudHJ5LmNwcCBiL05GRC9kYWVtb24vdGFibGUvbWVhc3VyZW1lbnRzLWVudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU4Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi90YWJsZS9tZWFzdXJlbWVudHMtZW50cnkuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJtZWFzdXJlbWVudHMtZW50cnkuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBtZWFzdXJlbWVudHMgeworCitFbnRyeTo6RW50cnkoY29uc3QgTmFtZSYgbmFtZSkKKyAgOiBtX25hbWUobmFtZSkKKyAgLCBtX2V4cGlyeSh0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludDo6bWluKCkpCit7Cit9CisKK30gLy8gbmFtZXNwYWNlIG1lYXN1cmVtZW50cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy1lbnRyeS5ocHAgYi9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy1lbnRyeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5M2VlOQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvbWVhc3VyZW1lbnRzLWVudHJ5LmhwcApAQCAtMCwwICsxLDc4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9EQUVNT05fVEFCTEVfTUVBU1VSRU1FTlRTX0VOVFJZX0hQUAorI2RlZmluZSBORkRfREFFTU9OX1RBQkxFX01FQVNVUkVNRU5UU19FTlRSWV9IUFAKKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisjaW5jbHVkZSAic3RyYXRlZ3ktaW5mby1ob3N0LmhwcCIKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBOYW1lVHJlZTsKKworbmFtZXNwYWNlIG5hbWVfdHJlZSB7CitjbGFzcyBFbnRyeTsKK30KKworY2xhc3MgTWVhc3VyZW1lbnRzOworCituYW1lc3BhY2UgbWVhc3VyZW1lbnRzIHsKKworLyoqIFxjbGFzcyBFbnRyeQorICogIFxicmllZiByZXByZXNlbnRzIGEgTWVhc3VyZW1lbnRzIGVudHJ5CisgKi8KK2NsYXNzIEVudHJ5IDogcHVibGljIFN0cmF0ZWd5SW5mb0hvc3QsIG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIGV4cGxpY2l0CisgIEVudHJ5KGNvbnN0IE5hbWUmIG5hbWUpOworCisgIGNvbnN0IE5hbWUmCisgIGdldE5hbWUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgTmFtZSBtX25hbWU7CisKK3ByaXZhdGU6IC8vIGxpZmV0aW1lCisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IG1fZXhwaXJ5OworICBFdmVudElkIG1fY2xlYW51cDsKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBtX25hbWVUcmVlRW50cnk7CisKKyAgZnJpZW5kIGNsYXNzIG5mZDo6TmFtZVRyZWU7CisgIGZyaWVuZCBjbGFzcyBuZmQ6Om5hbWVfdHJlZTo6RW50cnk7CisgIGZyaWVuZCBjbGFzcyBuZmQ6Ok1lYXN1cmVtZW50czsKK307CisKK2lubGluZSBjb25zdCBOYW1lJgorRW50cnk6OmdldE5hbWUoKSBjb25zdAoreworICByZXR1cm4gbV9uYW1lOworfQorCit9IC8vIG5hbWVzcGFjZSBtZWFzdXJlbWVudHMKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9UQUJMRV9NRUFTVVJFTUVOVFNfRU5UUllfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyNDMwNgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvbWVhc3VyZW1lbnRzLmNwcApAQCAtMCwwICsxLDE0NCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm1lYXN1cmVtZW50cy5ocHAiCisjaW5jbHVkZSAibmFtZS10cmVlLmhwcCIKKyNpbmNsdWRlICJwaXQtZW50cnkuaHBwIgorI2luY2x1ZGUgImZpYi1lbnRyeS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitNZWFzdXJlbWVudHM6Ok1lYXN1cmVtZW50cyhOYW1lVHJlZSYgbmFtZVRyZWUpCisgIDogbV9uYW1lVHJlZShuYW1lVHJlZSkKKyAgLCBtX25JdGVtcygwKQoreworfQorCitzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CitNZWFzdXJlbWVudHM6OmdldChuYW1lX3RyZWU6OkVudHJ5JiBudGUpCit7CisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4gZW50cnkgPSBudGUuZ2V0TWVhc3VyZW1lbnRzRW50cnkoKTsKKyAgaWYgKGVudHJ5ICE9IG51bGxwdHIpCisgICAgcmV0dXJuIGVudHJ5OworCisgIGVudHJ5ID0gbWFrZV9zaGFyZWQ8bWVhc3VyZW1lbnRzOjpFbnRyeT4obnRlLmdldFByZWZpeCgpKTsKKyAgbnRlLnNldE1lYXN1cmVtZW50c0VudHJ5KGVudHJ5KTsKKyAgKyttX25JdGVtczsKKworICBlbnRyeS0+bV9leHBpcnkgPSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgZ2V0SW5pdGlhbExpZmV0aW1lKCk7CisgIGVudHJ5LT5tX2NsZWFudXAgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKGdldEluaXRpYWxMaWZldGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZNZWFzdXJlbWVudHM6OmNsZWFudXAsIHRoaXMsIHJlZigqZW50cnkpKSk7CisKKyAgcmV0dXJuIGVudHJ5OworfQorCitzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CitNZWFzdXJlbWVudHM6OmdldChjb25zdCBOYW1lJiBuYW1lKQoreworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG50ZSA9IG1fbmFtZVRyZWUubG9va3VwKG5hbWUpOworICByZXR1cm4gdGhpcy0+Z2V0KCpudGUpOworfQorCitzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CitNZWFzdXJlbWVudHM6OmdldChjb25zdCBmaWI6OkVudHJ5JiBmaWJFbnRyeSkKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBudGUgPSBtX25hbWVUcmVlLmdldChmaWJFbnRyeSk7CisgIHJldHVybiB0aGlzLT5nZXQoKm50ZSk7Cit9CisKK3NoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KK01lYXN1cmVtZW50czo6Z2V0KGNvbnN0IHBpdDo6RW50cnkmIHBpdEVudHJ5KQoreworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG50ZSA9IG1fbmFtZVRyZWUuZ2V0KHBpdEVudHJ5KTsKKyAgcmV0dXJuIHRoaXMtPmdldCgqbnRlKTsKK30KKworc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PgorTWVhc3VyZW1lbnRzOjpnZXRQYXJlbnQoY29uc3QgbWVhc3VyZW1lbnRzOjpFbnRyeSYgY2hpbGQpCit7CisgIGlmIChjaGlsZC5nZXROYW1lKCkuc2l6ZSgpID09IDApIHsgLy8gdGhlIHJvb3QgZW50cnkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlQ2hpbGQgPSBtX25hbWVUcmVlLmdldChjaGlsZCk7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlID0gbnRlQ2hpbGQtPmdldFBhcmVudCgpOworICBCT09TVF9BU1NFUlQobnRlICE9IG51bGxwdHIpOworICByZXR1cm4gdGhpcy0+Z2V0KCpudGUpOworfQorCitzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CitNZWFzdXJlbWVudHM6OmZpbmRMb25nZXN0UHJlZml4TWF0Y2goY29uc3QgTmFtZSYgbmFtZSkgY29uc3QKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBudGUgPSBtX25hbWVUcmVlLmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZSwKKyAgICAgIFtdIChjb25zdCBuYW1lX3RyZWU6OkVudHJ5JiBudGUpIHsgcmV0dXJuIG50ZS5nZXRNZWFzdXJlbWVudHNFbnRyeSgpICE9IG51bGxwdHI7IH0pOworICBpZiAobnRlICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnRlLT5nZXRNZWFzdXJlbWVudHNFbnRyeSgpOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CitNZWFzdXJlbWVudHM6OmZpbmRFeGFjdE1hdGNoKGNvbnN0IE5hbWUmIG5hbWUpIGNvbnN0Cit7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlID0gbV9uYW1lVHJlZS5sb29rdXAobmFtZSk7CisgIGlmIChudGUgIT0gbnVsbHB0cikKKyAgICByZXR1cm4gbnRlLT5nZXRNZWFzdXJlbWVudHNFbnRyeSgpOworICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZAorTWVhc3VyZW1lbnRzOjpleHRlbmRMaWZldGltZShtZWFzdXJlbWVudHM6OkVudHJ5JiBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZTo6bmFub3NlY29uZHMmIGxpZmV0aW1lKQoreworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG50ZSA9IG1fbmFtZVRyZWUuZ2V0KGVudHJ5KTsKKyAgaWYgKG50ZSA9PSBudWxscHRyIHx8CisgICAgICBudGUtPmdldE1lYXN1cmVtZW50c0VudHJ5KCkuZ2V0KCkgIT0gJmVudHJ5KSB7CisgICAgLy8gZW50cnkgaXMgYWxyZWFkeSBnb25lOyBpdCBpcyBhIGRhbmdsaW5nIHJlZmVyZW5jZQorICAgIHJldHVybjsKKyAgfQorCisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IGV4cGlyeSA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBsaWZldGltZTsKKyAgaWYgKGVudHJ5Lm1fZXhwaXJ5ID49IGV4cGlyeSkgeworICAgIC8vIGhhcyBsb25nZXIgbGlmZXRpbWUsIG5vdCBleHRlbmRpbmcKKyAgICByZXR1cm47CisgIH0KKworICBzY2hlZHVsZXI6OmNhbmNlbChlbnRyeS5tX2NsZWFudXApOworICBlbnRyeS5tX2V4cGlyeSA9IGV4cGlyeTsKKyAgZW50cnkubV9jbGVhbnVwID0gc2NoZWR1bGVyOjpzY2hlZHVsZShsaWZldGltZSwgYmluZCgmTWVhc3VyZW1lbnRzOjpjbGVhbnVwLCB0aGlzLCByZWYoZW50cnkpKSk7Cit9CisKK3ZvaWQKK01lYXN1cmVtZW50czo6Y2xlYW51cChtZWFzdXJlbWVudHM6OkVudHJ5JiBlbnRyeSkKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBudGUgPSBtX25hbWVUcmVlLmdldChlbnRyeSk7CisgIGlmIChudGUgIT0gbnVsbHB0cikgeworICAgIG50ZS0+c2V0TWVhc3VyZW1lbnRzRW50cnkobnVsbHB0cik7CisgICAgbV9uYW1lVHJlZS5lcmFzZUVudHJ5SWZFbXB0eShudGUpOworICAgIG1fbkl0ZW1zLS07CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy5ocHAgYi9ORkQvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkOGRiNQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvbWVhc3VyZW1lbnRzLmhwcApAQCAtMCwwICsxLDEyMyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX1RBQkxFX01FQVNVUkVNRU5UU19IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9UQUJMRV9NRUFTVVJFTUVOVFNfSFBQCisKKyNpbmNsdWRlICJtZWFzdXJlbWVudHMtZW50cnkuaHBwIgorI2luY2x1ZGUgIm5hbWUtdHJlZS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCituYW1lc3BhY2UgZmliIHsKK2NsYXNzIEVudHJ5OworfQorCituYW1lc3BhY2UgcGl0IHsKK2NsYXNzIEVudHJ5OworfQorCisKKy8qKiBcY2xhc3MgTWVhc3VyZW1lbnQKKyAqICBcYnJpZWYgcmVwcmVzZW50cyB0aGUgTWVhc3VyZW1lbnRzIHRhYmxlCisgKi8KK2NsYXNzIE1lYXN1cmVtZW50cyA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIGV4cGxpY2l0CisgIE1lYXN1cmVtZW50cyhOYW1lVHJlZSYgbmFtZXRyZWUpOworCisgIC8qKiBcYnJpZWYgZmluZCBvciBpbnNlcnQgYSBNZWFzdXJlbWVudHMgZW50cnkgZm9yIG5hbWUKKyAgICovCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KKyAgZ2V0KGNvbnN0IE5hbWUmIG5hbWUpOworCisgIC8qKiBcYnJpZWYgZmluZCBvciBpbnNlcnQgYSBNZWFzdXJlbWVudHMgZW50cnkgZm9yIGZpYkVudHJ5LT5nZXRQcmVmaXgoKQorICAgKi8KKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PgorICBnZXQoY29uc3QgZmliOjpFbnRyeSYgZmliRW50cnkpOworCisgIC8qKiBcYnJpZWYgZmluZCBvciBpbnNlcnQgYSBNZWFzdXJlbWVudHMgZW50cnkgZm9yIHBpdEVudHJ5LT5nZXROYW1lKCkKKyAgICovCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KKyAgZ2V0KGNvbnN0IHBpdDo6RW50cnkmIHBpdEVudHJ5KTsKKworICAvKiogXGJyaWVmIGZpbmQgb3IgaW5zZXJ0IGEgTWVhc3VyZW1lbnRzIGVudHJ5IGZvciBjaGlsZCdzIHBhcmVudAorICAgKiAgXHJldHZhbCBudWxscHRyIGlmIGNoaWxkIGlzIHRoZSByb290IGVudHJ5CisgICAqLworICBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+CisgIGdldFBhcmVudChjb25zdCBtZWFzdXJlbWVudHM6OkVudHJ5JiBjaGlsZCk7CisKKyAgLyoqIFxicmllZiBwZXJmb3JtIGEgbG9uZ2VzdCBwcmVmaXggbWF0Y2gKKyAgICovCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KKyAgZmluZExvbmdlc3RQcmVmaXhNYXRjaChjb25zdCBOYW1lJiBuYW1lKSBjb25zdDsKKworICAvKiogXGJyaWVmIHBlcmZvcm0gYW4gZXhhY3QgbWF0Y2gKKyAgICovCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KKyAgZmluZEV4YWN0TWF0Y2goY29uc3QgTmFtZSYgbmFtZSkgY29uc3Q7CisKKyAgc3RhdGljIHRpbWU6Om5hbm9zZWNvbmRzCisgIGdldEluaXRpYWxMaWZldGltZSgpOworCisgIC8qKiBcYnJpZWYgZXh0ZW5kIGxpZmV0aW1lIG9mIGFuIGVudHJ5CisgICAqCisgICAqICBUaGUgZW50cnkgd2lsbCBiZSBrZXB0IHVudGlsIGF0IGxlYXN0IG5vdygpK2xpZmV0aW1lLgorICAgKi8KKyAgdm9pZAorICBleHRlbmRMaWZldGltZShtZWFzdXJlbWVudHM6OkVudHJ5JiBlbnRyeSwgY29uc3QgdGltZTo6bmFub3NlY29uZHMmIGxpZmV0aW1lKTsKKworICBzaXplX3QKKyAgc2l6ZSgpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkCisgIGNsZWFudXAobWVhc3VyZW1lbnRzOjpFbnRyeSYgZW50cnkpOworCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KKyAgZ2V0KG5hbWVfdHJlZTo6RW50cnkmIG50ZSk7CisKK3ByaXZhdGU6CisgIE5hbWVUcmVlJiBtX25hbWVUcmVlOworICBzaXplX3QgbV9uSXRlbXM7CisgIHN0YXRpYyBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBzX2RlZmF1bHRMaWZldGltZTsKK307CisKK2lubGluZSB0aW1lOjpuYW5vc2Vjb25kcworTWVhc3VyZW1lbnRzOjpnZXRJbml0aWFsTGlmZXRpbWUoKQoreworICByZXR1cm4gdGltZTo6c2Vjb25kcyg0KTsKK30KKworaW5saW5lIHNpemVfdAorTWVhc3VyZW1lbnRzOjpzaXplKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbkl0ZW1zOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fVEFCTEVfTUVBU1VSRU1FTlRTX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9uYW1lLXRyZWUtZW50cnkuY3BwIGIvTkZEL2RhZW1vbi90YWJsZS9uYW1lLXRyZWUtZW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxN2RiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL25hbWUtdHJlZS1lbnRyeS5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJuYW1lLXRyZWUtZW50cnkuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBuYW1lX3RyZWUgeworCitOb2RlOjpOb2RlKCkKKyAgOiBtX3ByZXYoMCkKKyAgLCBtX25leHQoMCkKK3sKK30KKworTm9kZTo6fk5vZGUoKQoreworICAvLyBlcmFzZSB0aGUgTmFtZSBUcmVlIE5vZGVzIHRoYXQgd2VyZSBjcmVhdGVkIHRvCisgIC8vIHJlc29sdmUgaGFzaCBjb2xsaXNpb25zCisgIC8vIFNvIGJlZm9yZSBlcmFzaW5nIGEgc2luZ2xlIG5vZGUsIG1ha2Ugc3VyZSBpdHMgbV9uZXh0ID09IDAKKyAgLy8gU2VlIGVyYXNlRW50cnlJZkVtcHR5IGluIG5hbWUtdHJlZS5jcHAKKyAgaWYgKG1fbmV4dCAhPSAwKQorICAgIGRlbGV0ZSBtX25leHQ7Cit9CisKK0VudHJ5OjpFbnRyeShjb25zdCBOYW1lJiBuYW1lKQorICA6IG1faGFzaCgwKQorICAsIG1fcHJlZml4KG5hbWUpCit7Cit9CisKK0VudHJ5Ojp+RW50cnkoKQoreworfQorCitib29sCitFbnRyeTo6aXNFbXB0eSgpIGNvbnN0Cit7CisgIHJldHVybiBtX2NoaWxkcmVuLmVtcHR5KCkgJiYKKyAgICAgICAgICFzdGF0aWNfY2FzdDxib29sPihtX2ZpYkVudHJ5KSAmJgorICAgICAgICAgbV9waXRFbnRyaWVzLmVtcHR5KCkgJiYKKyAgICAgICAgICFzdGF0aWNfY2FzdDxib29sPihtX21lYXN1cmVtZW50c0VudHJ5KSAmJgorICAgICAgICAgIXN0YXRpY19jYXN0PGJvb2w+KG1fc3RyYXRlZ3lDaG9pY2VFbnRyeSk7Cit9CisKK3ZvaWQKK0VudHJ5OjpzZXRGaWJFbnRyeShzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5KQoreworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oZmliRW50cnkpKSB7CisgICAgQk9PU1RfQVNTRVJUKCFzdGF0aWNfY2FzdDxib29sPihmaWJFbnRyeS0+bV9uYW1lVHJlZUVudHJ5KSk7CisgIH0KKworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obV9maWJFbnRyeSkpIHsKKyAgICBtX2ZpYkVudHJ5LT5tX25hbWVUcmVlRW50cnkucmVzZXQoKTsKKyAgfQorICBtX2ZpYkVudHJ5ID0gZmliRW50cnk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihtX2ZpYkVudHJ5KSkgeworICAgIG1fZmliRW50cnktPm1fbmFtZVRyZWVFbnRyeSA9IHRoaXMtPnNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgfQorfQorCit2b2lkCitFbnRyeTo6aW5zZXJ0UGl0RW50cnkoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkKK3sKKyAgQk9PU1RfQVNTRVJUKHN0YXRpY19jYXN0PGJvb2w+KHBpdEVudHJ5KSk7CisgIEJPT1NUX0FTU0VSVCghc3RhdGljX2Nhc3Q8Ym9vbD4ocGl0RW50cnktPm1fbmFtZVRyZWVFbnRyeSkpOworCisgIG1fcGl0RW50cmllcy5wdXNoX2JhY2socGl0RW50cnkpOworICBwaXRFbnRyeS0+bV9uYW1lVHJlZUVudHJ5ID0gdGhpcy0+c2hhcmVkX2Zyb21fdGhpcygpOworfQorCit2b2lkCitFbnRyeTo6ZXJhc2VQaXRFbnRyeShzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5KQoreworICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4ocGl0RW50cnkpKTsKKyAgQk9PU1RfQVNTRVJUKHBpdEVudHJ5LT5tX25hbWVUcmVlRW50cnkuZ2V0KCkgPT0gdGhpcyk7CisKKyAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiA+OjppdGVyYXRvciBpdCA9CisgICAgc3RkOjpmaW5kKG1fcGl0RW50cmllcy5iZWdpbigpLCBtX3BpdEVudHJpZXMuZW5kKCksIHBpdEVudHJ5KTsKKyAgQk9PU1RfQVNTRVJUKGl0ICE9IG1fcGl0RW50cmllcy5lbmQoKSk7CisKKyAgKml0ID0gbV9waXRFbnRyaWVzLmJhY2soKTsKKyAgbV9waXRFbnRyaWVzLnBvcF9iYWNrKCk7CisgIHBpdEVudHJ5LT5tX25hbWVUcmVlRW50cnkucmVzZXQoKTsKK30KKwordm9pZAorRW50cnk6OnNldE1lYXN1cmVtZW50c0VudHJ5KHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4gbWVhc3VyZW1lbnRzRW50cnkpCit7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihtZWFzdXJlbWVudHNFbnRyeSkpIHsKKyAgICBCT09TVF9BU1NFUlQoIXN0YXRpY19jYXN0PGJvb2w+KG1lYXN1cmVtZW50c0VudHJ5LT5tX25hbWVUcmVlRW50cnkpKTsKKyAgfQorCisgIGlmIChzdGF0aWNfY2FzdDxib29sPihtX21lYXN1cmVtZW50c0VudHJ5KSkgeworICAgIG1fbWVhc3VyZW1lbnRzRW50cnktPm1fbmFtZVRyZWVFbnRyeS5yZXNldCgpOworICB9CisgIG1fbWVhc3VyZW1lbnRzRW50cnkgPSBtZWFzdXJlbWVudHNFbnRyeTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KG1fbWVhc3VyZW1lbnRzRW50cnkpKSB7CisgICAgbV9tZWFzdXJlbWVudHNFbnRyeS0+bV9uYW1lVHJlZUVudHJ5ID0gdGhpcy0+c2hhcmVkX2Zyb21fdGhpcygpOworICB9Cit9CisKK3ZvaWQKK0VudHJ5OjpzZXRTdHJhdGVneUNob2ljZUVudHJ5KHNoYXJlZF9wdHI8c3RyYXRlZ3lfY2hvaWNlOjpFbnRyeT4gc3RyYXRlZ3lDaG9pY2VFbnRyeSkKK3sKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHN0cmF0ZWd5Q2hvaWNlRW50cnkpKSB7CisgICAgQk9PU1RfQVNTRVJUKCFzdGF0aWNfY2FzdDxib29sPihzdHJhdGVneUNob2ljZUVudHJ5LT5tX25hbWVUcmVlRW50cnkpKTsKKyAgfQorCisgIGlmIChzdGF0aWNfY2FzdDxib29sPihtX3N0cmF0ZWd5Q2hvaWNlRW50cnkpKSB7CisgICAgbV9zdHJhdGVneUNob2ljZUVudHJ5LT5tX25hbWVUcmVlRW50cnkucmVzZXQoKTsKKyAgfQorICBtX3N0cmF0ZWd5Q2hvaWNlRW50cnkgPSBzdHJhdGVneUNob2ljZUVudHJ5OworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obV9zdHJhdGVneUNob2ljZUVudHJ5KSkgeworICAgIG1fc3RyYXRlZ3lDaG9pY2VFbnRyeS0+bV9uYW1lVHJlZUVudHJ5ID0gdGhpcy0+c2hhcmVkX2Zyb21fdGhpcygpOworICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIG5hbWVfdHJlZQorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL25hbWUtdHJlZS1lbnRyeS5ocHAgYi9ORkQvZGFlbW9uL3RhYmxlL25hbWUtdHJlZS1lbnRyeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMzU4NwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvbmFtZS10cmVlLWVudHJ5LmhwcApAQCAtMCwwICsxLDIyMyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX1RBQkxFX05BTUVfVFJFRV9FTlRSWV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9UQUJMRV9OQU1FX1RSRUVfRU5UUllfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgInRhYmxlL2ZpYi1lbnRyeS5ocHAiCisjaW5jbHVkZSAidGFibGUvcGl0LWVudHJ5LmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9tZWFzdXJlbWVudHMtZW50cnkuaHBwIgorI2luY2x1ZGUgInRhYmxlL3N0cmF0ZWd5LWNob2ljZS1lbnRyeS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCitjbGFzcyBOYW1lVHJlZTsKKworbmFtZXNwYWNlIG5hbWVfdHJlZSB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zCitjbGFzcyBOb2RlOworY2xhc3MgRW50cnk7CisKKy8qKgorICogXGJyaWVmIE5hbWUgVHJlZSBOb2RlIENsYXNzCisgKi8KK2NsYXNzIE5vZGUKK3sKK3B1YmxpYzoKKyAgTm9kZSgpOworCisgIH5Ob2RlKCk7CisKK3B1YmxpYzoKKyAgLy8gdmFyaWFibGVzIGFyZSBpbiBwdWJsaWMgYXMgdGhpcyBpcyBqdXN0IGEgZGF0YSBzdHJ1Y3R1cmUKKyAgc2hhcmVkX3B0cjxFbnRyeT4gbV9lbnRyeTsgLy8gTmFtZSBUcmVlIEVudHJ5IChpLmUuLCBOYW1lIFByZWZpeCBFbnRyeSkKKyAgTm9kZSogbV9wcmV2OyAvLyBQcmV2aW91cyBOYW1lIFRyZWUgTm9kZSAodG8gcmVzb2x2ZSBoYXNoIGNvbGxpc2lvbikKKyAgTm9kZSogbV9uZXh0OyAvLyBOZXh0IE5hbWUgVHJlZSBOb2RlICh0byByZXNvbHZlIGhhc2ggY29sbGlzaW9uKQorfTsKKworLyoqCisgKiBcYnJpZWYgTmFtZSBUcmVlIEVudHJ5IENsYXNzCisgKi8KK2NsYXNzIEVudHJ5IDogcHVibGljIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEVudHJ5Piwgbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgRW50cnkoY29uc3QgTmFtZSYgcHJlZml4KTsKKworICB+RW50cnkoKTsKKworICBjb25zdCBOYW1lJgorICBnZXRQcmVmaXgoKSBjb25zdDsKKworICB2b2lkCisgIHNldEhhc2goc2l6ZV90IGhhc2gpOworCisgIHNpemVfdAorICBnZXRIYXNoKCkgY29uc3Q7CisKKyAgdm9pZAorICBzZXRQYXJlbnQoc2hhcmVkX3B0cjxFbnRyeT4gcGFyZW50KTsKKworICBzaGFyZWRfcHRyPEVudHJ5PgorICBnZXRQYXJlbnQoKSBjb25zdDsKKworICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPEVudHJ5PiA+JgorICBnZXRDaGlsZHJlbigpOworCisgIGJvb2wKKyAgaGFzQ2hpbGRyZW4oKSBjb25zdDsKKworICBib29sCisgIGlzRW1wdHkoKSBjb25zdDsKKworcHVibGljOiAvLyBhdHRhY2hlZCB0YWJsZSBlbnRyaWVzCisgIHZvaWQKKyAgc2V0RmliRW50cnkoc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSk7CisKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PgorICBnZXRGaWJFbnRyeSgpIGNvbnN0OworCisgIHZvaWQKKyAgaW5zZXJ0UGl0RW50cnkoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSk7CisKKyAgdm9pZAorICBlcmFzZVBpdEVudHJ5KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpOworCisgIGJvb2wKKyAgaGFzUGl0RW50cmllcygpIGNvbnN0OworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gPiYKKyAgZ2V0UGl0RW50cmllcygpIGNvbnN0OworCisgIHZvaWQKKyAgc2V0TWVhc3VyZW1lbnRzRW50cnkoc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiBtZWFzdXJlbWVudHNFbnRyeSk7CisKKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PgorICBnZXRNZWFzdXJlbWVudHNFbnRyeSgpIGNvbnN0OworCisgIHZvaWQKKyAgc2V0U3RyYXRlZ3lDaG9pY2VFbnRyeShzaGFyZWRfcHRyPHN0cmF0ZWd5X2Nob2ljZTo6RW50cnk+IHN0cmF0ZWd5Q2hvaWNlRW50cnkpOworCisgIHNoYXJlZF9wdHI8c3RyYXRlZ3lfY2hvaWNlOjpFbnRyeT4KKyAgZ2V0U3RyYXRlZ3lDaG9pY2VFbnRyeSgpIGNvbnN0OworCitwcml2YXRlOgorICAvLyBCZW5lZml0cyBvZiBzdG9yaW5nIG1faGFzaAorICAvLyAxLiBtX2hhc2ggaXMgY29tcGFyZWQgYmVmb3JlIG1fcHJlZml4IGlzIGNvbXBhcmVkCisgIC8vIDIuIGZhc3QgaGFzaCB0YWJsZSByZXNpemUgc3VwcG9ydAorICBzaXplX3QgbV9oYXNoOworICBOYW1lIG1fcHJlZml4OworICBzaGFyZWRfcHRyPEVudHJ5PiBtX3BhcmVudDsgICAgIC8vIFBvaW50aW5nIHRvIHRoZSBwYXJlbnQgZW50cnkuCisgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8RW50cnk+ID4gbV9jaGlsZHJlbjsgLy8gQ2hpbGRyZW4gcG9pbnRlcnMuCisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gbV9maWJFbnRyeTsKKyAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiA+IG1fcGl0RW50cmllczsKKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiBtX21lYXN1cmVtZW50c0VudHJ5OworICBzaGFyZWRfcHRyPHN0cmF0ZWd5X2Nob2ljZTo6RW50cnk+IG1fc3RyYXRlZ3lDaG9pY2VFbnRyeTsKKworICAvLyBnZXQgdGhlIE5hbWUgVHJlZSBOb2RlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTmFtZSBUcmVlIEVudHJ5CisgIE5vZGUqIG1fbm9kZTsKKworICAvLyBNYWtlIHByaXZhdGUgbWVtYmVycyBhY2Nlc3NpYmxlIGJ5IE5hbWUgVHJlZQorICBmcmllbmQgY2xhc3MgbmZkOjpOYW1lVHJlZTsKK307CisKK2lubGluZSBjb25zdCBOYW1lJgorRW50cnk6OmdldFByZWZpeCgpIGNvbnN0Cit7CisgIHJldHVybiBtX3ByZWZpeDsKK30KKworaW5saW5lIHNpemVfdAorRW50cnk6OmdldEhhc2goKSBjb25zdAoreworICByZXR1cm4gbV9oYXNoOworfQorCitpbmxpbmUgdm9pZAorRW50cnk6OnNldEhhc2goc2l6ZV90IGhhc2gpCit7CisgIG1faGFzaCA9IGhhc2g7Cit9CisKK2lubGluZSBzaGFyZWRfcHRyPEVudHJ5PgorRW50cnk6OmdldFBhcmVudCgpIGNvbnN0Cit7CisgIHJldHVybiBtX3BhcmVudDsKK30KKworaW5saW5lIHZvaWQKK0VudHJ5OjpzZXRQYXJlbnQoc2hhcmVkX3B0cjxFbnRyeT4gcGFyZW50KQoreworICBtX3BhcmVudCA9IHBhcmVudDsKK30KKworaW5saW5lIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gPiYKK0VudHJ5OjpnZXRDaGlsZHJlbigpCit7CisgIHJldHVybiBtX2NoaWxkcmVuOworfQorCitpbmxpbmUgYm9vbAorRW50cnk6Omhhc0NoaWxkcmVuKCkgY29uc3QKK3sKKyAgcmV0dXJuICFtX2NoaWxkcmVuLmVtcHR5KCk7Cit9CisKK2lubGluZSBzaGFyZWRfcHRyPGZpYjo6RW50cnk+CitFbnRyeTo6Z2V0RmliRW50cnkoKSBjb25zdAoreworICByZXR1cm4gbV9maWJFbnRyeTsKK30KKworaW5saW5lIGJvb2wKK0VudHJ5OjpoYXNQaXRFbnRyaWVzKCkgY29uc3QKK3sKKyAgcmV0dXJuICFtX3BpdEVudHJpZXMuZW1wdHkoKTsKK30KKworaW5saW5lIGNvbnN0IHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gPiYKK0VudHJ5OjpnZXRQaXRFbnRyaWVzKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fcGl0RW50cmllczsKK30KKworaW5saW5lIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4KK0VudHJ5OjpnZXRNZWFzdXJlbWVudHNFbnRyeSgpIGNvbnN0Cit7CisgIHJldHVybiBtX21lYXN1cmVtZW50c0VudHJ5OworfQorCitpbmxpbmUgc2hhcmVkX3B0cjxzdHJhdGVneV9jaG9pY2U6OkVudHJ5PgorRW50cnk6OmdldFN0cmF0ZWd5Q2hvaWNlRW50cnkoKSBjb25zdAoreworICByZXR1cm4gbV9zdHJhdGVneUNob2ljZUVudHJ5OworfQorCit9IC8vIG5hbWVzcGFjZSBuYW1lX3RyZWUKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9UQUJMRV9OQU1FX1RSRUVfRU5UUllfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL25hbWUtdHJlZS5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL25hbWUtdHJlZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvbmFtZS10cmVlLmNwcApAQCAtMCwwICsxLDc3NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm5hbWUtdHJlZS5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvY2l0eS1oYXNoLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L2NvbmNlcHQvYXNzZXJ0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9jb25jZXB0X2NoZWNrLmhwcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIG5mZCB7CisKK05GRF9MT0dfSU5JVCgiTmFtZVRyZWUiKTsKKworLy8gaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Gb3J3YXJkSXRlcmF0b3IKK0JPT1NUX0NPTkNFUFRfQVNTRVJUKChib29zdDo6Rm9yd2FyZEl0ZXJhdG9yPE5hbWVUcmVlOjpjb25zdF9pdGVyYXRvcj4pKTsKKy8vIGJvb3N0OjpGb3J3YXJkSXRlcmF0b3IgZm9sbG93cyBTR0kgc3RhbmRhcmQgaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0ZvcndhcmRJdGVyYXRvci5odG1sLAorLy8gd2hpY2ggZG9lc24ndCByZXF1aXJlIERlZmF1bHRDb25zdHJ1Y3RpYmxlCisjaWZkZWYgSEFWRV9JU19ERUZBVUxUX0NPTlNUUlVDVElCTEUKK3N0YXRpY19hc3NlcnQoc3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8TmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICAgICJOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3IgbXVzdCBiZSBkZWZhdWx0LWNvbnN0cnVjdGlibGUiKTsKKyNlbHNlCitCT09TVF9DT05DRVBUX0FTU0VSVCgoYm9vc3Q6OkRlZmF1bHRDb25zdHJ1Y3RpYmxlPE5hbWVUcmVlOjpjb25zdF9pdGVyYXRvcj4pKTsKKyNlbmRpZiAvLyBIQVZFX0lTX0RFRkFVTFRfQ09OU1RSVUNUSUJMRQorCituYW1lc3BhY2UgbmFtZV90cmVlIHsKKworY2xhc3MgSGFzaDMyCit7CitwdWJsaWM6CisgIHN0YXRpYyBzaXplX3QKKyAgY29tcHV0ZShjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihDaXR5SGFzaDMyKGJ1ZmZlciwgbGVuZ3RoKSk7CisgIH0KK307CisKK2NsYXNzIEhhc2g2NAoreworcHVibGljOgorICBzdGF0aWMgc2l6ZV90CisgIGNvbXB1dGUoY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oQ2l0eUhhc2g2NChidWZmZXIsIGxlbmd0aCkpOworICB9Cit9OworCit0eXBlZGVmIGJvb3N0OjptcGw6OmlmX2M8c2l6ZW9mKHNpemVfdCkgPj0gOCwgSGFzaDY0LCBIYXNoMzI+Ojp0eXBlIENpdHlIYXNoOworCisvLyBJbnRlcmZhY2Ugb2YgZGlmZmVyZW50IGhhc2ggZnVuY3Rpb25zCitzaXplX3QKK2NvbXB1dGVIYXNoKGNvbnN0IE5hbWUmIHByZWZpeCkKK3sKKyAgcHJlZml4LndpcmVFbmNvZGUoKTsgIC8vIGd1YXJhbnRlZXMgcHJlZml4J3Mgd2lyZSBidWZmZXIgaXMgbm90IGVtcHR5CisKKyAgc2l6ZV90IGhhc2hWYWx1ZSA9IDA7CisgIHNpemVfdCBoYXNoVXBkYXRlID0gMDsKKworICBmb3IgKE5hbWU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcHJlZml4LmJlZ2luKCk7IGl0ICE9IHByZWZpeC5lbmQoKTsgaXQrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyKiB3aXJlRm9ybWF0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oIGl0LT53aXJlKCkgKTsKKyAgICAgIGhhc2hVcGRhdGUgPSBDaXR5SGFzaDo6Y29tcHV0ZSh3aXJlRm9ybWF0LCBpdC0+c2l6ZSgpKTsKKyAgICAgIGhhc2hWYWx1ZSBePSBoYXNoVXBkYXRlOworICAgIH0KKworICByZXR1cm4gaGFzaFZhbHVlOworfQorCitzdGQ6OnZlY3RvcjxzaXplX3Q+Citjb21wdXRlSGFzaFNldChjb25zdCBOYW1lJiBwcmVmaXgpCit7CisgIHByZWZpeC53aXJlRW5jb2RlKCk7ICAvLyBndWFyYW50ZWVzIHByZWZpeCdzIHdpcmUgYnVmZmVyIGlzIG5vdCBlbXB0eQorCisgIHNpemVfdCBoYXNoVmFsdWUgPSAwOworICBzaXplX3QgaGFzaFVwZGF0ZSA9IDA7CisKKyAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBoYXNoVmFsdWVTZXQ7CisgIGhhc2hWYWx1ZVNldC5wdXNoX2JhY2soaGFzaFZhbHVlKTsKKworICBmb3IgKE5hbWU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcHJlZml4LmJlZ2luKCk7IGl0ICE9IHByZWZpeC5lbmQoKTsgaXQrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyKiB3aXJlRm9ybWF0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oIGl0LT53aXJlKCkgKTsKKyAgICAgIGhhc2hVcGRhdGUgPSBDaXR5SGFzaDo6Y29tcHV0ZSh3aXJlRm9ybWF0LCBpdC0+c2l6ZSgpKTsKKyAgICAgIGhhc2hWYWx1ZSBePSBoYXNoVXBkYXRlOworICAgICAgaGFzaFZhbHVlU2V0LnB1c2hfYmFjayhoYXNoVmFsdWUpOworICAgIH0KKworICByZXR1cm4gaGFzaFZhbHVlU2V0OworfQorCit9IC8vIG5hbWVzcGFjZSBuYW1lX3RyZWUKKworTmFtZVRyZWU6Ok5hbWVUcmVlKHNpemVfdCBuQnVja2V0cykKKyAgOiBtX25JdGVtcygwKQorICAsIG1fbkJ1Y2tldHMobkJ1Y2tldHMpCisgICwgbV9taW5OQnVja2V0cyhuQnVja2V0cykKKyAgLCBtX2VubGFyZ2VMb2FkRmFjdG9yKDAuNSkgICAgICAgLy8gbW9yZSB0aGFuIDUwJSBidWNrZXRzIGxvYWRlZAorICAsIG1fZW5sYXJnZUZhY3RvcigyKSAgICAgICAvLyBkb3VibGUgdGhlIGhhc2ggdGFibGUgc2l6ZQorICAsIG1fc2hyaW5rTG9hZEZhY3RvcigwLjEpIC8vIGxlc3MgdGhhbiAxMCUgYnVja2V0cyBsb2FkZWQKKyAgLCBtX3Nocmlua0ZhY3RvcigwLjUpICAgICAvLyByZWR1Y2UgdGhlIG51bWJlciBvZiBidWNrZXRzIGJ5IGhhbGYKKyAgLCBtX2VuZEl0ZXJhdG9yKEZVTExfRU5VTUVSQVRFX1RZUEUsICp0aGlzLCBtX2VuZCkKK3sKKyAgbV9lbmxhcmdlVGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtX2VubGFyZ2VMb2FkRmFjdG9yICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4obV9uQnVja2V0cykpOworCisgIG1fc2hyaW5rVGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtX3Nocmlua0xvYWRGYWN0b3IgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihtX25CdWNrZXRzKSk7CisKKyAgLy8gYXJyYXkgb2Ygbm9kZSBwb2ludGVycworICBtX2J1Y2tldHMgPSBuZXcgbmFtZV90cmVlOjpOb2RlKlttX25CdWNrZXRzXTsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgcG9pbnRlciBhcnJheQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fbkJ1Y2tldHM7IGkrKykKKyAgICBtX2J1Y2tldHNbaV0gPSAwOworfQorCitOYW1lVHJlZTo6fk5hbWVUcmVlKCkKK3sKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX25CdWNrZXRzOyBpKyspCisgICAgeworICAgICAgaWYgKG1fYnVja2V0c1tpXSAhPSAwKSB7CisgICAgICAgIGRlbGV0ZSBtX2J1Y2tldHNbaV07CisgICAgICB9CisgICAgfQorCisgIGRlbGV0ZSBbXSBtX2J1Y2tldHM7Cit9CisKKy8vIGluc2VydCgpIGlzIGEgcHJpdmF0ZSBmdW5jdGlvbiwgYW5kIGNhbGxlZCBieSBvbmx5IGxvb2t1cCgpCitzdGQ6OnBhaXI8c2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiwgYm9vbD4KK05hbWVUcmVlOjppbnNlcnQoY29uc3QgTmFtZSYgcHJlZml4KQoreworICBORkRfTE9HX1RSQUNFKCJpbnNlcnQgIiA8PCBwcmVmaXgpOworCisgIHNpemVfdCBoYXNoVmFsdWUgPSBuYW1lX3RyZWU6OmNvbXB1dGVIYXNoKHByZWZpeCk7CisgIHNpemVfdCBsb2MgPSBoYXNoVmFsdWUgJSBtX25CdWNrZXRzOworCisgIE5GRF9MT0dfVFJBQ0UoIk5hbWUgIiA8PCBwcmVmaXggPDwgIiBoYXNoIHZhbHVlID0gIiA8PCBoYXNoVmFsdWUgPDwgIiAgbG9jYXRpb24gPSAiIDw8IGxvYyk7CisKKyAgLy8gQ2hlY2sgaWYgdGhpcyBOYW1lIGhhcyBiZWVuIHN0b3JlZAorICBuYW1lX3RyZWU6Ok5vZGUqIG5vZGUgPSBtX2J1Y2tldHNbbG9jXTsKKyAgbmFtZV90cmVlOjpOb2RlKiBub2RlUHJldiA9IG5vZGU7ICAvLyBpbml0aWFsaXplIG5vZGVQcmV2IHRvIG5vZGUKKworICBmb3IgKG5vZGUgPSBtX2J1Y2tldHNbbG9jXTsgbm9kZSAhPSAwOyBub2RlID0gbm9kZS0+bV9uZXh0KQorICAgIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihub2RlLT5tX2VudHJ5KSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChwcmVmaXggPT0gbm9kZS0+bV9lbnRyeS0+bV9wcmVmaXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihub2RlLT5tX2VudHJ5LCBmYWxzZSk7IC8vIGZhbHNlOiBvbGQgZW50cnkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgbm9kZVByZXYgPSBub2RlOworICAgIH0KKworICBORkRfTE9HX1RSQUNFKCJEaWQgbm90IGZpbmQgIiA8PCBwcmVmaXggPDwgIiwgbmVlZCB0byBpbnNlcnQgaXQgdG8gdGhlIHRhYmxlIik7CisKKyAgLy8gSWYgbm8gYnVja2V0IGlzIGVtcHR5IG9jY3VwaWVkLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBub2RlLCBhbmQgaXQgaXMKKyAgLy8gbGlua2VkIGZyb20gbm9kZVByZXYKKyAgbm9kZSA9IG5ldyBuYW1lX3RyZWU6Ok5vZGUoKTsKKyAgbm9kZS0+bV9wcmV2ID0gbm9kZVByZXY7CisKKyAgaWYgKG5vZGVQcmV2ID09IDApCisgICAgeworICAgICAgbV9idWNrZXRzW2xvY10gPSBub2RlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5vZGVQcmV2LT5tX25leHQgPSBub2RlOworICAgIH0KKworICAvLyBDcmVhdGUgYSBuZXcgRW50cnkKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeShtYWtlX3NoYXJlZDxuYW1lX3RyZWU6OkVudHJ5PihwcmVmaXgpKTsKKyAgZW50cnktPnNldEhhc2goaGFzaFZhbHVlKTsKKyAgbm9kZS0+bV9lbnRyeSA9IGVudHJ5OyAvLyBsaW5rIHRoZSBFbnRyeSB0byBpdHMgTm9kZQorICBlbnRyeS0+bV9ub2RlID0gbm9kZTsgLy8gbGluayB0aGUgbm9kZSB0byBFbnRyeS4gVXNlZCBpbiBlcmFzZUVudHJ5SWZFbXB0eS4KKworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW50cnksIHRydWUpOyAvLyB0cnVlOiBuZXcgZW50cnkKK30KKworLy8gTmFtZSBQcmVmaXggTG9va3VwLiBDcmVhdGUgTmFtZSBUcmVlIEVudHJ5IGlmIG5vdCBmb3VuZAorc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PgorTmFtZVRyZWU6Omxvb2t1cChjb25zdCBOYW1lJiBwcmVmaXgpCit7CisgIE5GRF9MT0dfVFJBQ0UoImxvb2t1cCAiIDw8IHByZWZpeCk7CisKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeTsKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBwYXJlbnQ7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gcHJlZml4LnNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgIE5hbWUgdGVtcCA9IHByZWZpeC5nZXRQcmVmaXgoaSk7CisKKyAgICAgIC8vIGluc2VydCgpIHdpbGwgY3JlYXRlIHRoZSBlbnRyeSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgIHN0ZDo6cGFpcjxzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+LCBib29sPiByZXQgPSBpbnNlcnQodGVtcCk7CisgICAgICBlbnRyeSA9IHJldC5maXJzdDsKKworICAgICAgaWYgKHJldC5zZWNvbmQgPT0gdHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgIG1fbkl0ZW1zKys7IC8vIEluY3JlYXNlIHRoZSBjb3VudGVyCisgICAgICAgICAgZW50cnktPm1fcGFyZW50ID0gcGFyZW50OworCisgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHBhcmVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBhcmVudC0+bV9jaGlsZHJlbi5wdXNoX2JhY2soZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChtX25JdGVtcyA+IG1fZW5sYXJnZVRocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgIHJlc2l6ZShtX2VubGFyZ2VGYWN0b3IgKiBtX25CdWNrZXRzKTsKKyAgICAgICAgfQorCisgICAgICBwYXJlbnQgPSBlbnRyeTsKKyAgICB9CisgIHJldHVybiBlbnRyeTsKK30KKworLy8gRXhhY3QgTWF0Y2gKK3NoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4KK05hbWVUcmVlOjpmaW5kRXhhY3RNYXRjaChjb25zdCBOYW1lJiBwcmVmaXgpIGNvbnN0Cit7CisgIE5GRF9MT0dfVFJBQ0UoImZpbmRFeGFjdE1hdGNoICIgPDwgcHJlZml4KTsKKworICBzaXplX3QgaGFzaFZhbHVlID0gbmFtZV90cmVlOjpjb21wdXRlSGFzaChwcmVmaXgpOworICBzaXplX3QgbG9jID0gaGFzaFZhbHVlICUgbV9uQnVja2V0czsKKworICBORkRfTE9HX1RSQUNFKCJOYW1lICIgPDwgcHJlZml4IDw8ICIgaGFzaCB2YWx1ZSA9ICIgPDwgaGFzaFZhbHVlIDw8CisgICAgICAgICAgICAgICAgIiAgbG9jYXRpb24gPSAiIDw8IGxvYyk7CisKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeTsKKyAgbmFtZV90cmVlOjpOb2RlKiBub2RlID0gMDsKKworICBmb3IgKG5vZGUgPSBtX2J1Y2tldHNbbG9jXTsgbm9kZSAhPSAwOyBub2RlID0gbm9kZS0+bV9uZXh0KQorICAgIHsKKyAgICAgIGVudHJ5ID0gbm9kZS0+bV9lbnRyeTsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaGFzaFZhbHVlID09IGVudHJ5LT5nZXRIYXNoKCkgJiYgcHJlZml4ID09IGVudHJ5LT5nZXRQcmVmaXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGlmIGVudHJ5CisgICAgfSAvLyBmb3Igbm9kZQorCisgIC8vIGlmIG5vdCBmb3VuZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgZW50cnkgKG51bGwgcG9pbnRlcikgd2lsbCBiZSByZXR1cm5lZAorICBlbnRyeS5yZXNldCgpOworICByZXR1cm4gZW50cnk7Cit9CisKKy8vIExvbmdlc3QgUHJlZml4IE1hdGNoCitzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+CitOYW1lVHJlZTo6ZmluZExvbmdlc3RQcmVmaXhNYXRjaChjb25zdCBOYW1lJiBwcmVmaXgsIGNvbnN0IG5hbWVfdHJlZTo6RW50cnlTZWxlY3RvciYgZW50cnlTZWxlY3RvcikgY29uc3QKK3sKKyAgTkZEX0xPR19UUkFDRSgiZmluZExvbmdlc3RQcmVmaXhNYXRjaCAiIDw8IHByZWZpeCk7CisKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeTsKKyAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBoYXNoVmFsdWVTZXQgPSBuYW1lX3RyZWU6OmNvbXB1dGVIYXNoU2V0KHByZWZpeCk7CisKKyAgc2l6ZV90IGhhc2hWYWx1ZSA9IDA7CisgIHNpemVfdCBsb2MgPSAwOworCisgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KHByZWZpeC5zaXplKCkpOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBoYXNoVmFsdWUgPSBoYXNoVmFsdWVTZXRbaV07CisgICAgICBsb2MgPSBoYXNoVmFsdWUgJSBtX25CdWNrZXRzOworCisgICAgICBuYW1lX3RyZWU6Ok5vZGUqIG5vZGUgPSAwOworICAgICAgZm9yIChub2RlID0gbV9idWNrZXRzW2xvY107IG5vZGUgIT0gMDsgbm9kZSA9IG5vZGUtPm1fbmV4dCkKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5ID0gbm9kZS0+bV9lbnRyeTsKKyAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBpc1ByZWZpeE9mKCkgaXMgdXNlZCB0byBhdm9pZCBtYWtpbmcgYSBjb3B5IG9mIHRoZSBuYW1lCisgICAgICAgICAgICAgIGlmIChoYXNoVmFsdWUgPT0gZW50cnktPmdldEhhc2goKSAmJgorICAgICAgICAgICAgICAgICAgZW50cnktPmdldFByZWZpeCgpLmlzUHJlZml4T2YocHJlZml4KSAmJgorICAgICAgICAgICAgICAgICAgZW50cnlTZWxlY3RvcigqZW50cnkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmIGVudHJ5CisgICAgICAgIH0gLy8gZm9yIG5vZGUKKyAgICB9CisKKyAgLy8gaWYgbm90IGZvdW5kLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBlbnRyeSAobnVsbCBwb2ludGVyKSB3aWxsIGJlIHJldHVybmVkCisgIGVudHJ5LnJlc2V0KCk7CisgIHJldHVybiBlbnRyeTsKK30KKworc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PgorTmFtZVRyZWU6OmZpbmRMb25nZXN0UHJlZml4TWF0Y2goc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVfdHJlZTo6RW50cnlTZWxlY3RvciYgZW50cnlTZWxlY3RvcikgY29uc3QKK3sKKyAgd2hpbGUgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICB7CisgICAgICBpZiAoZW50cnlTZWxlY3RvcigqZW50cnkpKQorICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICBlbnRyeSA9IGVudHJ5LT5nZXRQYXJlbnQoKTsKKyAgICB9CisgIHJldHVybiBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+KCk7Cit9CisKKy8vIHJldHVybiB7ZmFsc2U6IHRoaXMgZW50cnkgaXMgbm90IGVtcHR5LCB0cnVlOiB0aGlzIGVudHJ5IGlzIGVtcHR5IGFuZCBlcmFzZWR9Citib29sCitOYW1lVHJlZTo6ZXJhc2VFbnRyeUlmRW1wdHkoc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeSkKK3sKKyAgQk9PU1RfQVNTRVJUKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSk7CisKKyAgTkZEX0xPR19UUkFDRSgiZXJhc2VFbnRyeUlmRW1wdHkgIiA8PCBlbnRyeS0+Z2V0UHJlZml4KCkpOworCisgIC8vIGZpcnN0IGNoZWNrIGlmIHRoaXMgRW50cnkgY2FuIGJlIGVyYXNlZAorICBpZiAoZW50cnktPmlzRW1wdHkoKSkKKyAgICB7CisgICAgICAvLyB1cGRhdGUgY2hpbGQtcmVsYXRlZCBpbmZvIGluIHRoZSBwYXJlbnQKKyAgICAgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gcGFyZW50ID0gZW50cnktPmdldFBhcmVudCgpOworCisgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyZW50KSkKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gPiYgcGFyZW50Q2hpbGRyZW5MaXN0ID0KKyAgICAgICAgICAgIHBhcmVudC0+Z2V0Q2hpbGRyZW4oKTsKKworICAgICAgICAgIGJvb2wgaXNGb3VuZCA9IGZhbHNlOworICAgICAgICAgIHNpemVfdCBzaXplID0gcGFyZW50Q2hpbGRyZW5MaXN0LnNpemUoKTsKKyAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHBhcmVudENoaWxkcmVuTGlzdFtpXSA9PSBlbnRyeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwYXJlbnRDaGlsZHJlbkxpc3RbaV0gPSBwYXJlbnRDaGlsZHJlbkxpc3Rbc2l6ZSAtIDFdOworICAgICAgICAgICAgICAgICAgcGFyZW50Q2hpbGRyZW5MaXN0LnBvcF9iYWNrKCk7CisgICAgICAgICAgICAgICAgICBpc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIEJPT1NUX1ZFUklGWShpc0ZvdW5kID09IHRydWUpOworICAgICAgICB9CisKKyAgICAgIC8vIHJlbW92ZSB0aGlzIEVudHJ5IGFuZCBpdHMgTmFtZSBUcmVlIE5vZGUKKyAgICAgIG5hbWVfdHJlZTo6Tm9kZSogbm9kZSA9IGVudHJ5LT5tX25vZGU7CisgICAgICBuYW1lX3RyZWU6Ok5vZGUqIG5vZGVQcmV2ID0gbm9kZS0+bV9wcmV2OworCisgICAgICAvLyBjb25maWd1cmUgdGhlIHByZXZpb3VzIG5vZGUKKyAgICAgIGlmIChub2RlUHJldiAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgLy8gbGluayB0aGUgcHJldmlvdXMgbm9kZSB0byB0aGUgbmV4dCBub2RlCisgICAgICAgICAgbm9kZVByZXYtPm1fbmV4dCA9IG5vZGUtPm1fbmV4dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbV9idWNrZXRzW2VudHJ5LT5nZXRIYXNoKCkgJSBtX25CdWNrZXRzXSA9IG5vZGUtPm1fbmV4dDsKKyAgICAgICAgfQorCisgICAgICAvLyBsaW5rIHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIG5leHQgbm9kZSAoc2tpcCB0aGUgZXJhc2VkIG9uZSkKKyAgICAgIGlmIChub2RlLT5tX25leHQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIG5vZGUtPm1fbmV4dC0+bV9wcmV2ID0gbm9kZVByZXY7CisgICAgICAgICAgbm9kZS0+bV9uZXh0ID0gMDsKKyAgICAgICAgfQorCisgICAgICBCT09TVF9BU1NFUlQobm9kZS0+bV9uZXh0ID09IDApOworCisgICAgICBtX25JdGVtcy0tOworICAgICAgZGVsZXRlIG5vZGU7CisKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihwYXJlbnQpKQorICAgICAgICBlcmFzZUVudHJ5SWZFbXB0eShwYXJlbnQpOworCisgICAgICBzaXplX3QgbmV3TkJ1Y2tldHMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fc2hyaW5rRmFjdG9yICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KG1fbkJ1Y2tldHMpKTsKKworICAgICAgaWYgKG5ld05CdWNrZXRzID49IG1fbWluTkJ1Y2tldHMgJiYgbV9uSXRlbXMgPCBtX3Nocmlua1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgIHJlc2l6ZShuZXdOQnVja2V0cyk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9IC8vIGlmIHRoaXMgZW50cnkgaXMgZW1wdHkKKworICByZXR1cm4gZmFsc2U7IC8vIGlmIHRoaXMgZW50cnkgaXMgbm90IGVtcHR5Cit9CisKK2Jvb3N0OjppdGVyYXRvcl9yYW5nZTxOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I+CitOYW1lVHJlZTo6ZnVsbEVudW1lcmF0ZShjb25zdCBuYW1lX3RyZWU6OkVudHJ5U2VsZWN0b3ImIGVudHJ5U2VsZWN0b3IpIGNvbnN0Cit7CisgIE5GRF9MT0dfVFJBQ0UoImZ1bGxFbnVtZXJhdGUiKTsKKworICAvLyBmaW5kIHRoZSBmaXJzdCBlbGlnaWJsZSBlbnRyeQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fbkJ1Y2tldHM7IGkrKykgeworICAgIGZvciAobmFtZV90cmVlOjpOb2RlKiBub2RlID0gbV9idWNrZXRzW2ldOyBub2RlICE9IDA7IG5vZGUgPSBub2RlLT5tX25leHQpIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihub2RlLT5tX2VudHJ5KSAmJiBlbnRyeVNlbGVjdG9yKCpub2RlLT5tX2VudHJ5KSkgeworICAgICAgICBjb25zdF9pdGVyYXRvciBpdChGVUxMX0VOVU1FUkFURV9UWVBFLCAqdGhpcywgbm9kZS0+bV9lbnRyeSwgZW50cnlTZWxlY3Rvcik7CisgICAgICAgIHJldHVybiB7aXQsIGVuZCgpfTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBJZiBub25lIG9mIHRoZSBlbnRyeSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cywgdGhlbiByZXR1cm4gdGhlIGVuZCgpIGl0ZXJhdG9yLgorICByZXR1cm4ge2VuZCgpLCBlbmQoKX07Cit9CisKK2Jvb3N0OjppdGVyYXRvcl9yYW5nZTxOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I+CitOYW1lVHJlZTo6cGFydGlhbEVudW1lcmF0ZShjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lX3RyZWU6OkVudHJ5U3ViVHJlZVNlbGVjdG9yJiBlbnRyeVN1YlRyZWVTZWxlY3RvcikgY29uc3QKK3sKKyAgLy8gdGhlIGZpcnN0IHN0ZXAgaXMgdG8gcHJvY2VzcyB0aGUgcm9vdCBub2RlCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gZW50cnkgPSBmaW5kRXhhY3RNYXRjaChwcmVmaXgpOworICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkgeworICAgIHJldHVybiB7ZW5kKCksIGVuZCgpfTsKKyAgfQorCisgIHN0ZDo6cGFpcjxib29sLCBib29sPnJlc3VsdCA9IGVudHJ5U3ViVHJlZVNlbGVjdG9yKCplbnRyeSk7CisgIGNvbnN0X2l0ZXJhdG9yIGl0KFBBUlRJQUxfRU5VTUVSQVRFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICp0aGlzLAorICAgICAgICAgICAgICAgICAgICBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZV90cmVlOjpBbnlFbnRyeSgpLAorICAgICAgICAgICAgICAgICAgICBlbnRyeVN1YlRyZWVTZWxlY3Rvcik7CisKKyAgaXQubV9zaG91bGRWaXNpdENoaWxkcmVuID0gKHJlc3VsdC5zZWNvbmQgJiYgZW50cnktPmhhc0NoaWxkcmVuKCkpOworCisgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAvLyByb290IG5vZGUgaXMgYWNjZXB0YWJsZQorICB9CisgIGVsc2UgeworICAgIC8vIGxldCB0aGUgKysgb3BlcmF0b3IgaGFuZGxlIGl0CisgICAgKytpdDsKKyAgfQorICByZXR1cm4ge2l0LCBlbmQoKX07Cit9CisKK2Jvb3N0OjppdGVyYXRvcl9yYW5nZTxOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I+CitOYW1lVHJlZTo6ZmluZEFsbE1hdGNoZXMoY29uc3QgTmFtZSYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVfdHJlZTo6RW50cnlTZWxlY3RvciYgZW50cnlTZWxlY3RvcikgY29uc3QKK3sKKyAgTkZEX0xPR19UUkFDRSgiTmFtZVRyZWU6OmZpbmRBbGxNYXRjaGVzIiA8PCBwcmVmaXgpOworCisgIC8vIEFzIHdlIGFyZSB1c2luZyBOYW1lIFByZWZpeCBIYXNoIFRhYmxlLCBhbmQgdGhlIGN1cnJlbnQgTFBNKCkgaXMKKyAgLy8gaW1wbGVtZW50ZWQgYXMgc3RhcnRpbmcgZnJvbSBmdWxsIG5hbWUsIGFuZCByZWR1Y2UgdGhlIG51bWJlciBvZgorICAvLyBjb21wb25lbnRzIGJ5IDEgZWFjaCB0aW1lLCB3ZSBjb3VsZCB1c2UgaXQgaGVyZS4KKyAgLy8gRm9yIHRyaWUtbGlrZSBkZXNpZ24sIGl0IGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGJ5IHdhbGtpbmcgZG93biB0aGUKKyAgLy8gdHJpZSBmcm9tIHRoZSByb290IG5vZGUuCisKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeSA9IGZpbmRMb25nZXN0UHJlZml4TWF0Y2gocHJlZml4LCBlbnRyeVNlbGVjdG9yKTsKKworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKSB7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oRklORF9BTExfTUFUQ0hFU19UWVBFLCAqdGhpcywgZW50cnksIGVudHJ5U2VsZWN0b3IpOworICAgIHJldHVybiB7YmVnaW4sIGVuZCgpfTsKKyAgfQorICAvLyBJZiBub25lIG9mIHRoZSBlbnRyeSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cywgdGhlbiByZXR1cm4gdGhlIGVuZCgpIGl0ZXJhdG9yLgorICByZXR1cm4ge2VuZCgpLCBlbmQoKX07Cit9CisKKy8vIEhhc2ggVGFibGUgUmVzaXplCit2b2lkCitOYW1lVHJlZTo6cmVzaXplKHNpemVfdCBuZXdOQnVja2V0cykKK3sKKyAgTkZEX0xPR19UUkFDRSgicmVzaXplIik7CisKKyAgbmFtZV90cmVlOjpOb2RlKiogbmV3QnVja2V0cyA9IG5ldyBuYW1lX3RyZWU6Ok5vZGUqW25ld05CdWNrZXRzXTsKKyAgc2l6ZV90IGNvdW50ID0gMDsKKworICAvLyByZWZlcmVuY2VkIGNjbnggaGFzaHRiLmMgaGFzaHRiX3JlaGFzaCgpCisgIG5hbWVfdHJlZTo6Tm9kZSoqIHBwID0gMDsKKyAgbmFtZV90cmVlOjpOb2RlKiBwID0gMDsKKyAgbmFtZV90cmVlOjpOb2RlKiBwcmUgPSAwOworICBuYW1lX3RyZWU6Ok5vZGUqIHEgPSAwOyAvLyByZWNvcmQgcC0+bV9uZXh0CisgIHNpemVfdCBpOworICB1aW50MzJfdCBoOworICB1aW50MzJfdCBiOworCisgIGZvciAoaSA9IDA7IGkgPCBuZXdOQnVja2V0czsgaSsrKQorICAgIHsKKyAgICAgIG5ld0J1Y2tldHNbaV0gPSAwOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbV9uQnVja2V0czsgaSsrKQorICAgIHsKKyAgICAgIGZvciAocCA9IG1fYnVja2V0c1tpXTsgcCAhPSAwOyBwID0gcSkKKyAgICAgICAgeworICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgcSA9IHAtPm1fbmV4dDsKKyAgICAgICAgICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4ocC0+bV9lbnRyeSkpOworICAgICAgICAgIGggPSBwLT5tX2VudHJ5LT5tX2hhc2g7CisgICAgICAgICAgYiA9IGggJSBuZXdOQnVja2V0czsKKyAgICAgICAgICBwcmUgPSAwOworICAgICAgICAgIGZvciAocHAgPSAmbmV3QnVja2V0c1tiXTsgKnBwICE9IDA7IHBwID0gJigoKnBwKS0+bV9uZXh0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJlID0gKnBwOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBwLT5tX3ByZXYgPSBwcmU7CisgICAgICAgICAgcC0+bV9uZXh0ID0gKnBwOyAvLyBBY3R1YWxseSAqcHAgYWx3YXlzID09IDAgaW4gdGhpcyBjYXNlCisgICAgICAgICAgKnBwID0gcDsKKyAgICAgICAgfQorICAgIH0KKworICBCT09TVF9BU1NFUlQoY291bnQgPT0gbV9uSXRlbXMpOworCisgIG5hbWVfdHJlZTo6Tm9kZSoqIG9sZEJ1Y2tldHMgPSBtX2J1Y2tldHM7CisgIG1fYnVja2V0cyA9IG5ld0J1Y2tldHM7CisgIGRlbGV0ZSBbXSBvbGRCdWNrZXRzOworCisgIG1fbkJ1Y2tldHMgPSBuZXdOQnVja2V0czsKKworICBtX2VubGFyZ2VUaHJlc2hvbGQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fZW5sYXJnZUxvYWRGYWN0b3IgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4obV9uQnVja2V0cykpOworICBtX3Nocmlua1RocmVzaG9sZCA9IHN0YXRpY19jYXN0PHNpemVfdD4obV9zaHJpbmtMb2FkRmFjdG9yICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KG1fbkJ1Y2tldHMpKTsKK30KKworLy8gRm9yIGRlYnVnZ2luZwordm9pZAorTmFtZVRyZWU6OmR1bXAoc3RkOjpvc3RyZWFtJiBvdXRwdXQpIGNvbnN0Cit7CisgIE5GRF9MT0dfVFJBQ0UoImR1bXAoKSIpOworCisgIG5hbWVfdHJlZTo6Tm9kZSogbm9kZSA9IDA7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gZW50cnk7CisKKyAgdXNpbmcgc3RkOjplbmRsOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9uQnVja2V0czsgaSsrKQorICAgIHsKKyAgICAgIGZvciAobm9kZSA9IG1fYnVja2V0c1tpXTsgbm9kZSAhPSAwOyBub2RlID0gbm9kZS0+bV9uZXh0KQorICAgICAgICB7CisgICAgICAgICAgZW50cnkgPSBub2RlLT5tX2VudHJ5OworCisgICAgICAgICAgLy8gaWYgdGhlIEVudHJ5IGV4aXN0LCBkdW1wIGl0cyBpbmZvcm1hdGlvbgorICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG91dHB1dCA8PCAiQnVja2V0IiA8PCBpIDw8ICJcdCIgPDwgZW50cnktPm1fcHJlZml4LnRvVXJpKCkgPDwgZW5kbDsKKyAgICAgICAgICAgICAgb3V0cHV0IDw8ICJcdFx0SGFzaCAiIDw8IGVudHJ5LT5tX2hhc2ggPDwgZW5kbDsKKworICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnktPm1fcGFyZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBvdXRwdXQgPDwgIlx0XHRwYXJlbnQtPiIgPDwgZW50cnktPm1fcGFyZW50LT5tX3ByZWZpeC50b1VyaSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG91dHB1dCA8PCAiXHRcdFJPT1QiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgb3V0cHV0IDw8IGVuZGw7CisKKyAgICAgICAgICAgICAgaWYgKGVudHJ5LT5tX2NoaWxkcmVuLnNpemUoKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG91dHB1dCA8PCAiXHRcdGNoaWxkcmVuID0gIiA8PCBlbnRyeS0+bV9jaGlsZHJlbi5zaXplKCkgPDwgZW5kbDsKKworICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBlbnRyeS0+bV9jaGlsZHJlbi5zaXplKCk7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA8PCAiXHRcdFx0Q2hpbGQgIiA8PCBqIDw8ICIgIiA8PAorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPm1fY2hpbGRyZW5bal0tPmdldFByZWZpeCgpIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gLy8gaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKworICAgICAgICB9IC8vIGZvciBub2RlCisgICAgfSAvLyBmb3IgaW50IGkKKworICBvdXRwdXQgPDwgIkJ1Y2tldCBjb3VudCA9ICIgPDwgbV9uQnVja2V0cyA8PCBlbmRsOworICBvdXRwdXQgPDwgIlN0b3JlZCBpdGVtID0gIiA8PCBtX25JdGVtcyA8PCBlbmRsOworICBvdXRwdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworfQorCitOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I6OmNvbnN0X2l0ZXJhdG9yKCkKKyAgOiBtX25hbWVUcmVlKG51bGxwdHIpCit7Cit9CisKK05hbWVUcmVlOjpjb25zdF9pdGVyYXRvcjo6Y29uc3RfaXRlcmF0b3IoTmFtZVRyZWU6Okl0ZXJhdG9yVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVUcmVlJiBuYW1lVHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVfdHJlZTo6RW50cnlTZWxlY3RvciYgZW50cnlTZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lX3RyZWU6OkVudHJ5U3ViVHJlZVNlbGVjdG9yJiBlbnRyeVN1YlRyZWVTZWxlY3RvcikKKyAgOiBtX25hbWVUcmVlKCZuYW1lVHJlZSkKKyAgLCBtX2VudHJ5KGVudHJ5KQorICAsIG1fc3ViVHJlZVJvb3QoZW50cnkpCisgICwgbV9lbnRyeVNlbGVjdG9yKG1ha2Vfc2hhcmVkPG5hbWVfdHJlZTo6RW50cnlTZWxlY3Rvcj4oZW50cnlTZWxlY3RvcikpCisgICwgbV9lbnRyeVN1YlRyZWVTZWxlY3RvcihtYWtlX3NoYXJlZDxuYW1lX3RyZWU6OkVudHJ5U3ViVHJlZVNlbGVjdG9yPihlbnRyeVN1YlRyZWVTZWxlY3RvcikpCisgICwgbV90eXBlKHR5cGUpCisgICwgbV9zaG91bGRWaXNpdENoaWxkcmVuKHRydWUpCit7Cit9CisKKy8vIG9wZXJhdG9yKysoKQorTmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yCitOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreworICBORkRfTE9HX1RSQUNFKCJjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpIik7CisKKyAgQk9PU1RfQVNTRVJUKG1fZW50cnkgIT0gbV9uYW1lVHJlZS0+bV9lbmQpOworCisgIGlmIChtX3R5cGUgPT0gRlVMTF9FTlVNRVJBVEVfVFlQRSkgLy8gZnVsbEVudW1lcmF0ZQorICAgIHsKKyAgICAgIGJvb2wgaXNGb3VuZCA9IGZhbHNlOworICAgICAgLy8gcHJvY2VzcyB0aGUgZW50cmllcyBpbiB0aGUgc2FtZSBidWNrZXQgZmlyc3QKKyAgICAgIHdoaWxlIChtX2VudHJ5LT5tX25vZGUtPm1fbmV4dCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgbV9lbnRyeSA9IG1fZW50cnktPm1fbm9kZS0+bV9uZXh0LT5tX2VudHJ5OworICAgICAgICAgIGlmICgoKm1fZW50cnlTZWxlY3RvcikoKm1fZW50cnkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8vIHByb2Nlc3Mgb3RoZXIgYnVja2V0cworCisgICAgICBmb3IgKGludCBuZXdMb2NhdGlvbiA9IG1fZW50cnktPm1faGFzaCAlIG1fbmFtZVRyZWUtPm1fbkJ1Y2tldHMgKyAxOworICAgICAgICAgICBuZXdMb2NhdGlvbiA8IHN0YXRpY19jYXN0PGludD4obV9uYW1lVHJlZS0+bV9uQnVja2V0cyk7CisgICAgICAgICAgICsrbmV3TG9jYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAvLyBwcm9jZXNzIGVhY2ggYnVja2V0CisgICAgICAgICAgbmFtZV90cmVlOjpOb2RlKiBub2RlID0gbV9uYW1lVHJlZS0+bV9idWNrZXRzW25ld0xvY2F0aW9uXTsKKyAgICAgICAgICB3aGlsZSAobm9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtX2VudHJ5ID0gbm9kZS0+bV9lbnRyeTsKKyAgICAgICAgICAgICAgaWYgKCgqbV9lbnRyeVNlbGVjdG9yKSgqbV9lbnRyeSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaXNGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBub2RlID0gbm9kZS0+bV9uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBCT09TVF9WRVJJRlkoaXNGb3VuZCA9PSBmYWxzZSk7CisgICAgICAvLyBSZWFjaCB0byB0aGUgZW5kKCkKKyAgICAgIG1fZW50cnkgPSBtX25hbWVUcmVlLT5tX2VuZDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgaWYgKG1fdHlwZSA9PSBQQVJUSUFMX0VOVU1FUkFURV9UWVBFKSAvLyBwYXJ0aWFsRW51bWVyYXRlCisgICAgeworICAgICAgLy8gV2UgdXNlIHByZS1vcmRlciB0cmF2ZXJzYWwuCisgICAgICAvLyBpZiBhdCB0aGUgcm9vdCwgaXQgY291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gYWNjZXB0ZWQsIG9yIHRoaXMKKyAgICAgIC8vIGl0ZXJhdG9yIHdhcyBqdXN0IGRlY2xhcmVkLCBhbmQgcm9vdCBkb2Vzbid0IHNhdGlzZnkgdGhlCisgICAgICAvLyByZXF1aXJlbWVudAorICAgICAgLy8gVGhlIGlmKCkgc2VjdGlvbiBoYW5kbGVzIHRoaXMgc3BlY2lhbCBjYXNlCisgICAgICAvLyBFc3NlbnRpYWxseSwgd2UgbmVlZCB0byBjaGVjayByb290J3MgZmlzdCBjaGlsZCwgYW5kIHRoZSByZXN0IHdpbGwKKyAgICAgIC8vIGJlIHRoZSBzYW1lIGFzIG5vcm1hbCBwcm9jZXNzCisgICAgICBpZiAobV9lbnRyeSA9PSBtX3N1YlRyZWVSb290KQorICAgICAgICB7CisgICAgICAgICAgaWYgKG1fc2hvdWxkVmlzaXRDaGlsZHJlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbV9lbnRyeSA9IG1fZW50cnktPmdldENoaWxkcmVuKClbMF07CisgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBib29sPiByZXN1bHQgPSAoKCptX2VudHJ5U3ViVHJlZVNlbGVjdG9yKSgqbV9lbnRyeSkpOworICAgICAgICAgICAgICBtX3Nob3VsZFZpc2l0Q2hpbGRyZW4gPSAocmVzdWx0LnNlY29uZCAmJiBtX2VudHJ5LT5oYXNDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgaWYocmVzdWx0LmZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgY2hpbGQgZGlkIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudAorICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3MgY2FuIGp1c3QgZmFsbCB0aHJvdWdoIHRoZSB3aGlsZSBsb29wCisgICAgICAgICAgICAgICAgICAvLyBhcyBub3JtYWwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBubyBjaGlsZHJlbiwgc2hvdWxkIHJldHVybiBlbmQoKTsKKyAgICAgICAgICAgICAgLy8ganVzdCBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvLyBUaGUgZmlyc3QgdGhpbmcgdG8gZG8gaXMgdG8gdmlzaXQgaXRzIGNoaWxkLCBvciBnbyB0byBmaW5kIGl0cyBwb3NzaWJsZQorICAgICAgLy8gc2libGluZ3MKKyAgICAgIHdoaWxlIChtX2VudHJ5ICE9IG1fc3ViVHJlZVJvb3QpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAobV9zaG91bGRWaXNpdENoaWxkcmVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN1YnRyZWUgc2hvdWxkIGJlIHZpc2l0ZWQKKyAgICAgICAgICAgICAgbV9lbnRyeSA9IG1fZW50cnktPmdldENoaWxkcmVuKClbMF07CisgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBib29sPiByZXN1bHQgPSAoKCptX2VudHJ5U3ViVHJlZVNlbGVjdG9yKSgqbV9lbnRyeSkpOworICAgICAgICAgICAgICBtX3Nob3VsZFZpc2l0Q2hpbGRyZW4gPSAocmVzdWx0LnNlY29uZCAmJiBtX2VudHJ5LT5oYXNDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgLy8gaWYgdGhpcyBub2RlIGlzIGFjY2VwdGFibGUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZywgYXMgdGhpcyBub2RlIGlzIGVzc2VudGlhbGx5IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhpcyBub2RlIHRvIHRoZSB3aGlsZSBsb29wLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIFNob3VsZCB0cnkgdG8gZmluZCBpdHMgc2libGluZworICAgICAgICAgICAgICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IHBhcmVudCA9IG1fZW50cnktPmdldFBhcmVudCgpOworCisgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gPiYgcGFyZW50Q2hpbGRyZW5MaXN0ID0gcGFyZW50LT5nZXRDaGlsZHJlbigpOworICAgICAgICAgICAgICBib29sIGlzRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFyZW50Q2hpbGRyZW5MaXN0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRDaGlsZHJlbkxpc3RbaV0gPT0gbV9lbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlzRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEJPT1NUX1ZFUklGWShpc0ZvdW5kID09IHRydWUpOworICAgICAgICAgICAgICBpZiAoaSA8IHBhcmVudENoaWxkcmVuTGlzdC5zaXplKCkgLSAxKSAvLyBtX2VudHJ5IG5vdCB0aGUgbGFzdCBjaGlsZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1fZW50cnkgPSBwYXJlbnRDaGlsZHJlbkxpc3RbaSArIDFdOworICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGJvb2w+IHJlc3VsdCA9ICgoKm1fZW50cnlTdWJUcmVlU2VsZWN0b3IpKCptX2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICBtX3Nob3VsZFZpc2l0Q2hpbGRyZW4gPSAocmVzdWx0LnNlY29uZCAmJiBtX2VudHJ5LT5oYXNDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIC8vIGlmIHRoaXMgbm9kZSBpcyBhY2NlcHRhYmxlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGFzIHRoaXMgbm9kZSBpcyBlc3NlbnRpYWxseSBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGlzIG5vZGUgdG8gdGhlIHdoaWxlIGxvb3AuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyBtX2VudHJ5IGlzIHRoZSBsYXN0IGNoaWxkLCBubyBtb3JlIHNpYmxpbmcsIHNob3VsZCB0cnkgdG8gZmluZCBwYXJlbnQncyBzaWJsaW5nCisgICAgICAgICAgICAgICAgICBtX3Nob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIG1fZW50cnkgPSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIG1fZW50cnkgPSBtX25hbWVUcmVlLT5tX2VuZDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgaWYgKG1fdHlwZSA9PSBGSU5EX0FMTF9NQVRDSEVTX1RZUEUpIC8vIGZpbmRBbGxNYXRjaGVzCisgICAgeworICAgICAgLy8gQXNzdW1wdGlvbjogYXQgdGhlIGJlZ2lubmluZywgbV9lbnRyeSB3YXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZmlyc3QKKyAgICAgIC8vIGVsaWdpYmxlIE5hbWUgVHJlZSBlbnRyeSAoaS5lLiwgaGFzIGEgUElUIGVudHJ5IHRoYXQgY2FuIGJlIHNhdGlzZmllZAorICAgICAgLy8gYnkgdGhlIERhdGEgcGFja2V0KQorCisgICAgICB3aGlsZSAoc3RhdGljX2Nhc3Q8Ym9vbD4obV9lbnRyeS0+Z2V0UGFyZW50KCkpKQorICAgICAgICB7CisgICAgICAgICAgbV9lbnRyeSA9IG1fZW50cnktPmdldFBhcmVudCgpOworICAgICAgICAgIGlmICgoKm1fZW50cnlTZWxlY3RvcikoKm1fZW50cnkpKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgIC8vIFJlYWNoIHRvIHRoZSBlbmQgKFJvb3QpCisgICAgICBtX2VudHJ5ID0gbV9uYW1lVHJlZS0+bV9lbmQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIEJPT1NUX0FTU0VSVChmYWxzZSk7IC8vIHVua25vd24gdHlwZQorICByZXR1cm4gKnRoaXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9uYW1lLXRyZWUuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9uYW1lLXRyZWUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNGU0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL25hbWUtdHJlZS5ocHAKQEAgLTAsMCArMSw0MTcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9OQU1FX1RSRUVfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfTkFNRV9UUkVFX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKyNpbmNsdWRlICJuYW1lLXRyZWUtZW50cnkuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBuYW1lX3RyZWUgeworCisvKioKKyAqIFxicmllZiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBnaXZlbiBuYW1lIHByZWZpeCdzIFdJUkUgRk9STUFUCisgKi8KK3NpemVfdAorY29tcHV0ZUhhc2goY29uc3QgTmFtZSYgcHJlZml4KTsKKworLyoqCisgKiBcYnJpZWYgSW5jcmVtZW50YWxseSBjb21wdXRlIGhhc2ggdmFsdWVzCisgKiBccmV0dXJuIFJldHVybiBhIHZlY3RvciBvZiBoYXNoIHZhbHVlcywgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCBwcmVmaXgKKyAqLworc3RkOjp2ZWN0b3I8c2l6ZV90PgorY29tcHV0ZUhhc2hTZXQoY29uc3QgTmFtZSYgcHJlZml4KTsKKworLy8vIGEgcHJlZGljYXRlIHRvIGFjY2VwdCBvciByZWplY3QgYW4gRW50cnkgaW4gZmluZCBvcGVyYXRpb25zCit0eXBlZGVmIGZ1bmN0aW9uPGJvb2wgKGNvbnN0IEVudHJ5JiBlbnRyeSk+IEVudHJ5U2VsZWN0b3I7CisKKy8qKgorICogXGJyaWVmIGEgcHJlZGljYXRlIHRvIGFjY2VwdCBvciByZWplY3QgYW4gRW50cnkgYW5kIGl0cyBjaGlsZHJlbgorICogXHJldHVybiAuZmlyc3QgaW5kaWNhdGVzIHdoZXRoZXIgZW50cnkgc2hvdWxkIGJlIGFjY2VwdGVkOworICogICAgICAgICAuc2Vjb25kIGluZGljYXRlcyB3aGV0aGVyIGVudHJ5J3MgY2hpbGRyZW4gc2hvdWxkIGJlIHZpc2l0ZWQKKyAqLwordHlwZWRlZiBmdW5jdGlvbjxzdGQ6OnBhaXI8Ym9vbCxib29sPiAoY29uc3QgRW50cnkmIGVudHJ5KT4gRW50cnlTdWJUcmVlU2VsZWN0b3I7CisKK3N0cnVjdCBBbnlFbnRyeSB7CisgIGJvb2wKKyAgb3BlcmF0b3IoKShjb25zdCBFbnRyeSYgZW50cnkpCisgIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworc3RydWN0IEFueUVudHJ5U3ViVHJlZSB7CisgIHN0ZDo6cGFpcjxib29sLCBib29sPgorICBvcGVyYXRvcigpKGNvbnN0IEVudHJ5JiBlbnRyeSkKKyAgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCB0cnVlKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbmFtZV90cmVlCisKKy8qKgorICogXGJyaWVmIENsYXNzIE5hbWUgVHJlZQorICovCitjbGFzcyBOYW1lVHJlZSA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yOworCisgIGV4cGxpY2l0CisgIE5hbWVUcmVlKHNpemVfdCBuQnVja2V0cyA9IDEwMjQpOworCisgIH5OYW1lVHJlZSgpOworCitwdWJsaWM6IC8vIGluZm9ybWF0aW9uCisgIC8qKgorICAgKiBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2Ygb2NjdXBpZWQgZW50cmllcyBpbiB0aGUgTmFtZSBUcmVlCisgICAqLworICBzaXplX3QKKyAgc2l6ZSgpIGNvbnN0OworCisgIC8qKgorICAgKiBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgTmFtZSBUcmVlIChOUEhUKQorICAgKiBcZGV0YWlscyBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaXMgdGhlIG9uZSB0aGF0IHVzZWQgdG8gY3JlYXRlIHRoZSBoYXNoCisgICAqIHRhYmxlLCBpLmUuLCBtX25CdWNrZXRzLgorICAgKi8KKyAgc2l6ZV90CisgIGdldE5CdWNrZXRzKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIFxicmllZiBEdW1wIGFsbCB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBOYW1lIFRyZWUgZm9yIGRlYnVnZ2luZy4KKyAgICovCisgIHZvaWQKKyAgZHVtcChzdGQ6Om9zdHJlYW0mIG91dHB1dCkgY29uc3Q7CisKK3B1YmxpYzogLy8gbXV0YXRpb24KKyAgLyoqCisgICAqIFxicmllZiBMb29rIGZvciB0aGUgTmFtZSBUcmVlIEVudHJ5IHRoYXQgY29udGFpbnMgdGhpcyBuYW1lIHByZWZpeC4KKyAgICogXGRldGFpbHMgU3RhcnRzIGZyb20gdGhlIHNob3J0ZXN0IG5hbWUgcHJlZml4LCBhbmQgdGhlbiBpbmNyZWFzZSB0aGUKKyAgICogbnVtYmVyIG9mIG5hbWUgY29tcG9uZW50cyBieSBvbmUgZWFjaCB0aW1lLiBBbGwgbm9uLWV4aXN0aW5nIE5hbWUgVHJlZQorICAgKiBFbnRyaWVzIHdpbGwgYmUgY3JlYXRlZC4KKyAgICogXHBhcmFtIHByZWZpeCBUaGUgcXVlcnlpbmcgbmFtZSBwcmVmaXguCisgICAqIFxyZXR1cm4gVGhlIHBvaW50ZXIgdG8gdGhlIE5hbWUgVHJlZSBFbnRyeSB0aGF0IGNvbnRhaW5zIHRoaXMgZnVsbCBuYW1lCisgICAqIHByZWZpeC4KKyAgICogXG5vdGUgRXhpc3RpbmcgaXRlcmF0b3JzIGFyZSB1bmFmZmVjdGVkLgorICAgKi8KKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PgorICBsb29rdXAoY29uc3QgTmFtZSYgcHJlZml4KTsKKworICAvKioKKyAgICogXGJyaWVmIERlbGV0ZSBhIE5hbWUgVHJlZSBFbnRyeSBpZiB0aGlzIGVudHJ5IGlzIGVtcHR5LgorICAgKiBccGFyYW0gZW50cnkgVGhlIGVudHJ5IHRvIGJlIGRlbGV0ZWQgaWYgZW1wdHkuCisgICAqIFxub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYSB0YWJsZSBlbnRyeSBpcyBkZXRhY2hlZCBmcm9tIE5hbWUgVHJlZQorICAgKiAgICAgICBlbnRyeS4gVGhlIGZ1bmN0aW9uIGRlbGV0ZXMgYSBOYW1lIFRyZWUgZW50cnkgaWYgbm90aGluZyBpcyBhdHRhY2hlZCB0byBpdCBhbmQKKyAgICogICAgICAgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGVuIHJlcGVhdHMgdGhlIHNhbWUgcHJvY2VzcyBvbiBpdHMgYW5jZXN0b3JzLgorICAgKiBcbm90ZSBFeGlzdGluZyBpdGVyYXRvcnMsIGV4Y2VwdCB0aG9zZSBwb2ludGluZyB0byBkZWxldGVkIGVudHJpZXMsIGFyZSB1bmFmZmVjdGVkLgorICAgKi8KKyAgYm9vbAorICBlcmFzZUVudHJ5SWZFbXB0eShzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IGVudHJ5KTsKKworcHVibGljOiAvLyBzaG9ydGN1dCBhY2Nlc3MKKyAgLy8vIGdldCBOYW1lVHJlZSBlbnRyeSBmcm9tIGF0dGFjaGVkIEZJQiBlbnRyeQorICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+CisgIGdldChjb25zdCBmaWI6OkVudHJ5JiBmaWJFbnRyeSkgY29uc3Q7CisKKyAgLy8vIGdldCBOYW1lVHJlZSBlbnRyeSBmcm9tIGF0dGFjaGVkIFBJVCBlbnRyeQorICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+CisgIGdldChjb25zdCBwaXQ6OkVudHJ5JiBwaXRFbnRyeSkgY29uc3Q7CisKKyAgLy8vIGdldCBOYW1lVHJlZSBlbnRyeSBmcm9tIGF0dGFjaGVkIE1lYXN1cmVtZW50cyBlbnRyeQorICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+CisgIGdldChjb25zdCBtZWFzdXJlbWVudHM6OkVudHJ5JiBtZWFzdXJlbWVudHNFbnRyeSkgY29uc3Q7CisKKyAgLy8vIGdldCBOYW1lVHJlZSBlbnRyeSBmcm9tIGF0dGFjaGVkIFN0cmF0ZWd5Q2hvaWNlIGVudHJ5CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4KKyAgZ2V0KGNvbnN0IHN0cmF0ZWd5X2Nob2ljZTo6RW50cnkmIHN0cmF0ZWd5Q2hvaWNlRW50cnkpIGNvbnN0OworCitwdWJsaWM6IC8vIG1hdGNoaW5nCisgIC8qKgorICAgKiBcYnJpZWYgRXhhY3QgbWF0Y2ggbG9va3VwIGZvciB0aGUgZ2l2ZW4gbmFtZSBwcmVmaXguCisgICAqIFxyZXR1cm4gYSBudWxsIHNoYXJlZF9wdHIgaWYgdGhpcyBwcmVmaXggaXMgbm90IGZvdW5kOworICAgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBOYW1lIFRyZWUgRW50cnkgYWRkcmVzcworICAgKi8KKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PgorICBmaW5kRXhhY3RNYXRjaChjb25zdCBOYW1lJiBwcmVmaXgpIGNvbnN0OworCisgIC8qKgorICAgKiBcYnJpZWYgTG9uZ2VzdCBwcmVmaXggbWF0Y2hpbmcgZm9yIHRoZSBnaXZlbiBuYW1lCisgICAqIFxkZXRhaWxzIFN0YXJ0cyBmcm9tIHRoZSBmdWxsIG5hbWUgc3RyaW5nLCByZWR1Y2UgdGhlIG51bWJlciBvZiBuYW1lIGNvbXBvbmVudAorICAgKiBieSBvbmUgZWFjaCB0aW1lLCB1bnRpbCBhbiBFbnRyeSBpcyBmb3VuZC4KKyAgICovCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4KKyAgZmluZExvbmdlc3RQcmVmaXhNYXRjaChjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZV90cmVlOjpFbnRyeVNlbGVjdG9yJiBlbnRyeVNlbGVjdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3RyZWU6OkFueUVudHJ5KCkpIGNvbnN0OworCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4KKyAgZmluZExvbmdlc3RQcmVmaXhNYXRjaChzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVfdHJlZTo6RW50cnlTZWxlY3RvciYgZW50cnlTZWxlY3RvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90cmVlOjpBbnlFbnRyeSgpKSBjb25zdDsKKworICAvKiogXGJyaWVmIEVudW1lcmF0ZSBhbGwgdGhlIG5hbWUgcHJlZml4ZXMgdGhhdCBzYXRpc2Z5IHRoZSBwcmVmaXggYW5kIGVudHJ5U2VsZWN0b3IKKyAgICogIFxyZXR1cm4gYW4gdW5zcGVjaWZpZWQgdHlwZSB0aGF0IGhhdmUgLmJlZ2luKCkgYW5kIC5lbmQoKSBtZXRob2RzCisgICAqICAgICAgICAgIGFuZCBpcyB1c2FibGUgd2l0aCByYW5nZS1iYXNlZCBmb3IKKyAgICoKKyAgICogIEV4YW1wbGU6CisgICAqICBcY29kZXsuY3BwfQorICAgKiAgYXV0byYmIGFsbE1hdGNoZXMgPSBudC5maW5kQWxsTWF0Y2hlcyhOYW1lKCIvQS9CL0MiKSk7CisgICAqICBmb3IgKGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmIG50ZSA6IGFsbE1hdGNoZXMpIHsKKyAgICogICAgLi4uCisgICAqICB9CisgICAqICBcZW5kY29kZQorICAgKiAgXG5vdGUgSXRlcmF0aW9uIG9yZGVyIGlzIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGFuZCBpcyB1bmRlZmluZWQKKyAgICogIFxub3RlIFRoZSByZXR1cm5lZCBpdGVyYXRvciBtYXkgZ2V0IGludmFsaWRhdGVkIHdoZW4gTmFtZVRyZWUgaXMgbW9kaWZpZWQKKyAgICovCisgIGJvb3N0OjppdGVyYXRvcl9yYW5nZTxjb25zdF9pdGVyYXRvcj4KKyAgZmluZEFsbE1hdGNoZXMoY29uc3QgTmFtZSYgcHJlZml4LAorICAgICAgICAgICAgICAgICBjb25zdCBuYW1lX3RyZWU6OkVudHJ5U2VsZWN0b3ImIGVudHJ5U2VsZWN0b3IgPSBuYW1lX3RyZWU6OkFueUVudHJ5KCkpIGNvbnN0OworCitwdWJsaWM6IC8vIGVudW1lcmF0aW9uCisgIC8qKiBcYnJpZWYgRW51bWVyYXRlIGFsbCBlbnRyaWVzLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGFuIEVudHJ5U2VsZWN0b3IuCisgICAqICBccmV0dXJuIGFuIHVuc3BlY2lmaWVkIHR5cGUgdGhhdCBoYXZlIC5iZWdpbigpIGFuZCAuZW5kKCkgbWV0aG9kcworICAgKiAgICAgICAgICBhbmQgaXMgdXNhYmxlIHdpdGggcmFuZ2UtYmFzZWQgZm9yCisgICAqCisgICAqICBFeGFtcGxlOgorICAgKiAgXGNvZGV7LmNwcH0KKyAgICogIGF1dG8mJiBlbnVtZXJhYmxlID0gbnQuZnVsbEVudW1lcmF0ZSgpOworICAgKiAgZm9yIChjb25zdCBuYW1lX3RyZWU6OkVudHJ5JiBudGUgOiBlbnVtZXJhYmxlKSB7CisgICAqICAgIC4uLgorICAgKiAgfQorICAgKiAgXGVuZGNvZGUKKyAgICogIFxub3RlIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhbmQgaXMgdW5kZWZpbmVkCisgICAqICBcbm90ZSBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgbWF5IGdldCBpbnZhbGlkYXRlZCB3aGVuIE5hbWVUcmVlIGlzIG1vZGlmaWVkCisgICAqLworICBib29zdDo6aXRlcmF0b3JfcmFuZ2U8Y29uc3RfaXRlcmF0b3I+CisgIGZ1bGxFbnVtZXJhdGUoY29uc3QgbmFtZV90cmVlOjpFbnRyeVNlbGVjdG9yJiBlbnRyeVNlbGVjdG9yID0gbmFtZV90cmVlOjpBbnlFbnRyeSgpKSBjb25zdDsKKworICAvKiogXGJyaWVmIEVudW1lcmF0ZSBhbGwgZW50cmllcyB1bmRlciBhIHByZWZpeCwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhbiBFbnRyeVN1YlRyZWVTZWxlY3Rvci4KKyAgICogIFxyZXR1cm4gYW4gdW5zcGVjaWZpZWQgdHlwZSB0aGF0IGhhdmUgLmJlZ2luKCkgYW5kIC5lbmQoKSBtZXRob2RzCisgICAqICAgICAgICAgIGFuZCBpcyB1c2FibGUgd2l0aCByYW5nZS1iYXNlZCBmb3IKKyAgICoKKyAgICogIEV4YW1wbGU6CisgICAqICBcY29kZXsuY3BwfQorICAgKiAgYXV0byYmIGVudW1lcmFibGUgPSBudC5wYXJ0aWFsRW51bWVyYXRlKE5hbWUoIi9BL0IvQyIpKTsKKyAgICogIGZvciAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgbnRlIDogZW51bWVyYWJsZSkgeworICAgKiAgICAuLi4KKyAgICogIH0KKyAgICogIFxlbmRjb2RlCisgICAqICBcbm90ZSBJdGVyYXRpb24gb3JkZXIgaXMgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYW5kIGlzIHVuZGVmaW5lZAorICAgKiAgXG5vdGUgVGhlIHJldHVybmVkIGl0ZXJhdG9yIG1heSBnZXQgaW52YWxpZGF0ZWQgd2hlbiBOYW1lVHJlZSBpcyBtb2RpZmllZAorICAgKi8KKyAgYm9vc3Q6Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2l0ZXJhdG9yPgorICBwYXJ0aWFsRW51bWVyYXRlKGNvbnN0IE5hbWUmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lX3RyZWU6OkVudHJ5U3ViVHJlZVNlbGVjdG9yJiBlbnRyeVN1YlRyZWVTZWxlY3RvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90cmVlOjpBbnlFbnRyeVN1YlRyZWUoKSkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBHZXQgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IE5hbWVUcmVlIGVudHJ5CisgICAqICBcbm90ZSBJdGVyYXRpb24gb3JkZXIgaXMgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYW5kIGlzIHVuZGVmaW5lZAorICAgKiAgXG5vdGUgVGhlIHJldHVybmVkIGl0ZXJhdG9yIG1heSBnZXQgaW52YWxpZGF0ZWQgd2hlbiBOYW1lVHJlZSBpcyBtb2RpZmllZAorICAgKi8KKyAgY29uc3RfaXRlcmF0b3IKKyAgYmVnaW4oKSBjb25zdDsKKworICAvKiogXGJyaWVmIEdldCBhbiBpdGVyYXRvciByZWZlcnJpbmcgdG8gdGhlIHBhc3QtdGhlLWVuZCBGSUIgZW50cnkKKyAgICogIFxub3RlIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhbmQgaXMgdW5kZWZpbmVkCisgICAqICBcbm90ZSBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgbWF5IGdldCBpbnZhbGlkYXRlZCB3aGVuIE5hbWVUcmVlIGlzIG1vZGlmaWVkCisgICAqLworICBjb25zdF9pdGVyYXRvcgorICBlbmQoKSBjb25zdDsKKworICBlbnVtIEl0ZXJhdG9yVHlwZSB7CisgICAgRlVMTF9FTlVNRVJBVEVfVFlQRSwKKyAgICBQQVJUSUFMX0VOVU1FUkFURV9UWVBFLAorICAgIEZJTkRfQUxMX01BVENIRVNfVFlQRQorICB9OworCisgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgY29uc3QgbmFtZV90cmVlOjpFbnRyeT4KKyAgeworICBwdWJsaWM6CisgICAgZnJpZW5kIGNsYXNzIE5hbWVUcmVlOworCisgICAgY29uc3RfaXRlcmF0b3IoKTsKKworICAgIGNvbnN0X2l0ZXJhdG9yKE5hbWVUcmVlOjpJdGVyYXRvclR5cGUgdHlwZSwKKyAgICAgIGNvbnN0IE5hbWVUcmVlJiBuYW1lVHJlZSwKKyAgICAgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gZW50cnksCisgICAgICBjb25zdCBuYW1lX3RyZWU6OkVudHJ5U2VsZWN0b3ImIGVudHJ5U2VsZWN0b3IgPSBuYW1lX3RyZWU6OkFueUVudHJ5KCksCisgICAgICBjb25zdCBuYW1lX3RyZWU6OkVudHJ5U3ViVHJlZVNlbGVjdG9yJiBlbnRyeVN1YlRyZWVTZWxlY3RvciA9IG5hbWVfdHJlZTo6QW55RW50cnlTdWJUcmVlKCkpOworCisgICAgfmNvbnN0X2l0ZXJhdG9yKCk7CisKKyAgICBjb25zdCBuYW1lX3RyZWU6OkVudHJ5JgorICAgIG9wZXJhdG9yKigpIGNvbnN0OworCisgICAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PgorICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgb3BlcmF0b3IrKygpOworCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBvcGVyYXRvcisrKGludCk7CisKKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0OworCisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIGNvbnN0IE5hbWVUcmVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uYW1lVHJlZTsKKyAgICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+ICAgICAgICAgICAgICAgIG1fZW50cnk7CisgICAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiAgICAgICAgICAgICAgICBtX3N1YlRyZWVSb290OworICAgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeVNlbGVjdG9yPiAgICAgICAgbV9lbnRyeVNlbGVjdG9yOworICAgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeVN1YlRyZWVTZWxlY3Rvcj4gbV9lbnRyeVN1YlRyZWVTZWxlY3RvcjsKKyAgICBOYW1lVHJlZTo6SXRlcmF0b3JUeXBlICAgICAgICAgICAgICAgICAgICAgIG1fdHlwZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2hvdWxkVmlzaXRDaGlsZHJlbjsKKyAgfTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIFxicmllZiBSZXNpemUgdGhlIGhhc2ggdGFibGUgc2l6ZSB3aGVuIGl0cyBsb2FkIGZhY3RvciByZWFjaGVzIGEgdGhyZXNob2xkLgorICAgKiBcZGV0YWlscyBBcyB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIGEgaGFuZC13cml0dGVuIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24KKyAgICogZm9yIHRoZSBOYW1lIFRyZWUsIHRoZSBoYXNoIHRhYmxlIHJlc2l6ZSgpIGZ1bmN0aW9uIHNob3VsZCBiZSBrZXB0IGluIHRoZQorICAgKiBuYW1lLXRyZWUuaHBwIGZpbGUuCisgICAqIFxwYXJhbSBuZXdOQnVja2V0cyBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgZm9yIHRoZSBuZXcgaGFzaCB0YWJsZS4KKyAgICovCisgIHZvaWQKKyAgcmVzaXplKHNpemVfdCBuZXdOQnVja2V0cyk7CisKK3ByaXZhdGU6CisgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIG1fbkl0ZW1zOyAgLy8gTnVtYmVyIG9mIGl0ZW1zIGJlaW5nIHN0b3JlZAorICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBtX25CdWNrZXRzOyAvLyBOdW1iZXIgb2YgaGFzaCBidWNrZXRzCisgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIG1fbWluTkJ1Y2tldHM7IC8vIE1pbmltdW0gbnVtYmVyIG9mIGhhc2ggYnVja2V0cworICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICBtX2VubGFyZ2VMb2FkRmFjdG9yOworICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBtX2VubGFyZ2VUaHJlc2hvbGQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZW5sYXJnZUZhY3RvcjsKKyAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgbV9zaHJpbmtMb2FkRmFjdG9yOworICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBtX3Nocmlua1RocmVzaG9sZDsKKyAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgbV9zaHJpbmtGYWN0b3I7CisgIG5hbWVfdHJlZTo6Tm9kZSoqICAgICAgICAgICAgIG1fYnVja2V0czsgLy8gTmFtZSBUcmVlIEJ1Y2tldHMgaW4gdGhlIE5QSFQKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiAgbV9lbmQ7CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgICAgIG1fZW5kSXRlcmF0b3I7CisKKyAgLyoqCisgICAqIFxicmllZiBDcmVhdGUgYSBOYW1lIFRyZWUgRW50cnkgaWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIHJldHVybiB0aGUgZXhpc3RpbmcKKyAgICogTmFtZSBUcmVlIEVudHJ5IGFkZHJlc3MuCisgICAqIFxkZXRhaWxzIENhbGxlZCBieSBsb29rdXAoKSBvbmx5LgorICAgKiBccmV0dXJuIFRoZSBmaXJzdCBpdGVtIGlzIHRoZSBOYW1lIFRyZWUgRW50cnkgYWRkcmVzcywgdGhlIHNlY29uZCBpdGVtIGlzCisgICAqIGEgYm9vbCB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIG9sZCBlbnRyeSAoZmFsc2UpIG9yIGEgbmV3CisgICAqIGVudHJ5ICh0cnVlKS4KKyAgICovCisgIHN0ZDo6cGFpcjxzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+LCBib29sPgorICBpbnNlcnQoY29uc3QgTmFtZSYgcHJlZml4KTsKK307CisKK2lubGluZSBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I6On5jb25zdF9pdGVyYXRvcigpCit7Cit9CisKK2lubGluZSBzaXplX3QKK05hbWVUcmVlOjpzaXplKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbkl0ZW1zOworfQorCitpbmxpbmUgc2l6ZV90CitOYW1lVHJlZTo6Z2V0TkJ1Y2tldHMoKSBjb25zdAoreworICByZXR1cm4gbV9uQnVja2V0czsKK30KKworaW5saW5lIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4KK05hbWVUcmVlOjpnZXQoY29uc3QgZmliOjpFbnRyeSYgZmliRW50cnkpIGNvbnN0Cit7CisgIHJldHVybiBmaWJFbnRyeS5tX25hbWVUcmVlRW50cnk7Cit9CisKK2lubGluZSBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+CitOYW1lVHJlZTo6Z2V0KGNvbnN0IHBpdDo6RW50cnkmIHBpdEVudHJ5KSBjb25zdAoreworICByZXR1cm4gcGl0RW50cnkubV9uYW1lVHJlZUVudHJ5OworfQorCitpbmxpbmUgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PgorTmFtZVRyZWU6OmdldChjb25zdCBtZWFzdXJlbWVudHM6OkVudHJ5JiBtZWFzdXJlbWVudHNFbnRyeSkgY29uc3QKK3sKKyAgcmV0dXJuIG1lYXN1cmVtZW50c0VudHJ5Lm1fbmFtZVRyZWVFbnRyeTsKK30KKworaW5saW5lIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4KK05hbWVUcmVlOjpnZXQoY29uc3Qgc3RyYXRlZ3lfY2hvaWNlOjpFbnRyeSYgc3RyYXRlZ3lDaG9pY2VFbnRyeSkgY29uc3QKK3sKKyAgcmV0dXJuIHN0cmF0ZWd5Q2hvaWNlRW50cnkubV9uYW1lVHJlZUVudHJ5OworfQorCitpbmxpbmUgTmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yCitOYW1lVHJlZTo6YmVnaW4oKSBjb25zdAoreworICByZXR1cm4gZnVsbEVudW1lcmF0ZSgpLmJlZ2luKCk7Cit9CisKK2lubGluZSBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3IKK05hbWVUcmVlOjplbmQoKSBjb25zdAoreworICByZXR1cm4gbV9lbmRJdGVyYXRvcjsKK30KKworaW5saW5lIGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmCitOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7CisgIHJldHVybiAqbV9lbnRyeTsKK30KKworaW5saW5lIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4KK05hbWVUcmVlOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0Cit7CisgIHJldHVybiBtX2VudHJ5OworfQorCitpbmxpbmUgTmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yCitOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoaW50KQoreworICBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3IgdGVtcCgqdGhpcyk7CisgICsrKCp0aGlzKTsKKyAgcmV0dXJuIHRlbXA7Cit9CisKK2lubGluZSBib29sCitOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgTmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIG1fZW50cnkgPT0gb3RoZXIubV9lbnRyeTsKK30KKworaW5saW5lIGJvb2wKK05hbWVUcmVlOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdAoreworICByZXR1cm4gbV9lbnRyeSAhPSBvdGhlci5tX2VudHJ5OworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fVEFCTEVfTkFNRV9UUkVFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9waXQtZW50cnkuY3BwIGIvTkZEL2RhZW1vbi90YWJsZS9waXQtZW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhN2M2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1lbnRyeS5jcHAKQEAgLTAsMCArMSwxOTggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJwaXQtZW50cnkuaHBwIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcGl0IHsKKworY29uc3QgTmFtZSBFbnRyeTo6TE9DQUxIT1NUX05BTUUoIm5kbjovbG9jYWxob3N0Iik7Citjb25zdCBOYW1lIEVudHJ5OjpMT0NBTEhPUF9OQU1FKCJuZG46L2xvY2FsaG9wIik7CisKK0VudHJ5OjpFbnRyeShjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCisgIDogbV9pbnRlcmVzdChpbnRlcmVzdC5zaGFyZWRfZnJvbV90aGlzKCkpCit7Cit9CisKK2NvbnN0IE5hbWUmCitFbnRyeTo6Z2V0TmFtZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX2ludGVyZXN0LT5nZXROYW1lKCk7Cit9CisKK2Jvb2wKK0VudHJ5OjpoYXNMb2NhbEluUmVjb3JkKCkgY29uc3QKK3sKKyAgcmV0dXJuIHN0ZDo6YW55X29mKG1faW5SZWNvcmRzLmJlZ2luKCksIG1faW5SZWNvcmRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgW10gKGNvbnN0IEluUmVjb3JkJiBpblJlY29yZCkgeyByZXR1cm4gaW5SZWNvcmQuZ2V0RmFjZSgpLT5pc0xvY2FsKCk7IH0pOworfQorCitib29sCitFbnRyeTo6Y2FuRm9yd2FyZFRvKGNvbnN0IEZhY2UmIGZhY2UpIGNvbnN0Cit7CisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IG5vdyA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCk7CisKKyAgYm9vbCBoYXNVbmV4cGlyZWRPdXRSZWNvcmQgPSBzdGQ6OmFueV9vZihtX291dFJlY29yZHMuYmVnaW4oKSwgbV9vdXRSZWNvcmRzLmVuZCgpLAorICAgIFsmZmFjZSwgJm5vd10gKGNvbnN0IE91dFJlY29yZCYgb3V0UmVjb3JkKSB7CisgICAgICByZXR1cm4gb3V0UmVjb3JkLmdldEZhY2UoKS5nZXQoKSA9PSAmZmFjZSAmJiBvdXRSZWNvcmQuZ2V0RXhwaXJ5KCkgPj0gbm93OworICAgIH0pOworICBpZiAoaGFzVW5leHBpcmVkT3V0UmVjb3JkKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBoYXNVbmV4cGlyZWRPdGhlckluUmVjb3JkID0gc3RkOjphbnlfb2YobV9pblJlY29yZHMuYmVnaW4oKSwgbV9pblJlY29yZHMuZW5kKCksCisgICAgWyZmYWNlLCAmbm93XSAoY29uc3QgSW5SZWNvcmQmIGluUmVjb3JkKSB7CisgICAgICByZXR1cm4gaW5SZWNvcmQuZ2V0RmFjZSgpLmdldCgpICE9ICZmYWNlICYmIGluUmVjb3JkLmdldEV4cGlyeSgpID49IG5vdzsKKyAgICB9KTsKKyAgaWYgKCFoYXNVbmV4cGlyZWRPdGhlckluUmVjb3JkKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuICF0aGlzLT52aW9sYXRlc1Njb3BlKGZhY2UpOworfQorCitib29sCitFbnRyeTo6dmlvbGF0ZXNTY29wZShjb25zdCBGYWNlJiBmYWNlKSBjb25zdAoreworICAvLyAvbG9jYWxob3N0IHNjb3BlCisgIGJvb2wgaXNWaW9sYXRpbmdMb2NhbGhvc3QgPSAhZmFjZS5pc0xvY2FsKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMSE9TVF9OQU1FLmlzUHJlZml4T2YodGhpcy0+Z2V0TmFtZSgpKTsKKyAgaWYgKGlzVmlvbGF0aW5nTG9jYWxob3N0KSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyAvbG9jYWxob3Agc2NvcGUKKyAgYm9vbCBpc1Zpb2xhdGluZ0xvY2FsaG9wID0gIWZhY2UuaXNMb2NhbCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMSE9QX05BTUUuaXNQcmVmaXhPZih0aGlzLT5nZXROYW1lKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLT5oYXNMb2NhbEluUmVjb3JkKCk7CisgIGlmIChpc1Zpb2xhdGluZ0xvY2FsaG9wKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2ludAorRW50cnk6OmZpbmROb25jZSh1aW50MzJfdCBub25jZSwgY29uc3QgRmFjZSYgZmFjZSkgY29uc3QKK3sKKyAgLy8gVE9ETyBzaG91bGQgd2UgaWdub3JlIGV4cGlyZWQgaW4vb3V0IHJlY29yZHM/CisKKyAgaW50IGRudyA9IERVUExJQ0FURV9OT05DRV9OT05FOworCisgIGZvciAoY29uc3QgSW5SZWNvcmQmIGluUmVjb3JkIDogbV9pblJlY29yZHMpIHsKKyAgICBpZiAoaW5SZWNvcmQuZ2V0TGFzdE5vbmNlKCkgPT0gbm9uY2UpIHsKKyAgICAgIGlmIChpblJlY29yZC5nZXRGYWNlKCkuZ2V0KCkgPT0gJmZhY2UpIHsKKyAgICAgICAgZG53IHw9IERVUExJQ0FURV9OT05DRV9JTl9TQU1FOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGRudyB8PSBEVVBMSUNBVEVfTk9OQ0VfSU5fT1RIRVI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChjb25zdCBPdXRSZWNvcmQmIG91dFJlY29yZCA6IG1fb3V0UmVjb3JkcykgeworICAgIGlmIChvdXRSZWNvcmQuZ2V0TGFzdE5vbmNlKCkgPT0gbm9uY2UpIHsKKyAgICAgIGlmIChvdXRSZWNvcmQuZ2V0RmFjZSgpLmdldCgpID09ICZmYWNlKSB7CisgICAgICAgIGRudyB8PSBEVVBMSUNBVEVfTk9OQ0VfT1VUX1NBTUU7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgZG53IHw9IERVUExJQ0FURV9OT05DRV9PVVRfT1RIRVI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGRudzsKK30KKworSW5SZWNvcmRDb2xsZWN0aW9uOjppdGVyYXRvcgorRW50cnk6Omluc2VydE9yVXBkYXRlSW5SZWNvcmQoc2hhcmVkX3B0cjxGYWNlPiBmYWNlLCBjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYobV9pblJlY29yZHMuYmVnaW4oKSwgbV9pblJlY29yZHMuZW5kKCksCisgICAgWyZmYWNlXSAoY29uc3QgSW5SZWNvcmQmIGluUmVjb3JkKSB7IHJldHVybiBpblJlY29yZC5nZXRGYWNlKCkgPT0gZmFjZTsgfSk7CisgIGlmIChpdCA9PSBtX2luUmVjb3Jkcy5lbmQoKSkgeworICAgIG1faW5SZWNvcmRzLmVtcGxhY2VfZnJvbnQoZmFjZSk7CisgICAgaXQgPSBtX2luUmVjb3Jkcy5iZWdpbigpOworICB9CisKKyAgaXQtPnVwZGF0ZShpbnRlcmVzdCk7CisgIHJldHVybiBpdDsKK30KKworSW5SZWNvcmRDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvcgorRW50cnk6OmdldEluUmVjb3JkKGNvbnN0IEZhY2UmIGZhY2UpIGNvbnN0Cit7CisgIHJldHVybiBzdGQ6OmZpbmRfaWYobV9pblJlY29yZHMuYmVnaW4oKSwgbV9pblJlY29yZHMuZW5kKCksCisgICAgWyZmYWNlXSAoY29uc3QgSW5SZWNvcmQmIGluUmVjb3JkKSB7IHJldHVybiBpblJlY29yZC5nZXRGYWNlKCkuZ2V0KCkgPT0gJmZhY2U7IH0pOworfQorCit2b2lkCitFbnRyeTo6ZGVsZXRlSW5SZWNvcmRzKCkKK3sKKyAgbV9pblJlY29yZHMuY2xlYXIoKTsKK30KKworT3V0UmVjb3JkQ29sbGVjdGlvbjo6aXRlcmF0b3IKK0VudHJ5OjppbnNlcnRPclVwZGF0ZU91dFJlY29yZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UsIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKK3sKKyAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihtX291dFJlY29yZHMuYmVnaW4oKSwgbV9vdXRSZWNvcmRzLmVuZCgpLAorICAgIFsmZmFjZV0gKGNvbnN0IE91dFJlY29yZCYgb3V0UmVjb3JkKSB7IHJldHVybiBvdXRSZWNvcmQuZ2V0RmFjZSgpID09IGZhY2U7IH0pOworICBpZiAoaXQgPT0gbV9vdXRSZWNvcmRzLmVuZCgpKSB7CisgICAgbV9vdXRSZWNvcmRzLmVtcGxhY2VfZnJvbnQoZmFjZSk7CisgICAgaXQgPSBtX291dFJlY29yZHMuYmVnaW4oKTsKKyAgfQorCisgIGl0LT51cGRhdGUoaW50ZXJlc3QpOworICByZXR1cm4gaXQ7Cit9CisKK091dFJlY29yZENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yCitFbnRyeTo6Z2V0T3V0UmVjb3JkKGNvbnN0IEZhY2UmIGZhY2UpIGNvbnN0Cit7CisgIHJldHVybiBzdGQ6OmZpbmRfaWYobV9vdXRSZWNvcmRzLmJlZ2luKCksIG1fb3V0UmVjb3Jkcy5lbmQoKSwKKyAgICBbJmZhY2VdIChjb25zdCBPdXRSZWNvcmQmIG91dFJlY29yZCkgeyByZXR1cm4gb3V0UmVjb3JkLmdldEZhY2UoKS5nZXQoKSA9PSAmZmFjZTsgfSk7Cit9CisKK3ZvaWQKK0VudHJ5OjpkZWxldGVPdXRSZWNvcmQoY29uc3QgRmFjZSYgZmFjZSkKK3sKKyAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihtX291dFJlY29yZHMuYmVnaW4oKSwgbV9vdXRSZWNvcmRzLmVuZCgpLAorICAgIFsmZmFjZV0gKGNvbnN0IE91dFJlY29yZCYgb3V0UmVjb3JkKSB7IHJldHVybiBvdXRSZWNvcmQuZ2V0RmFjZSgpLmdldCgpID09ICZmYWNlOyB9KTsKKyAgaWYgKGl0ICE9IG1fb3V0UmVjb3Jkcy5lbmQoKSkgeworICAgIG1fb3V0UmVjb3Jkcy5lcmFzZShpdCk7CisgIH0KK30KKworYm9vbAorRW50cnk6Omhhc1VuZXhwaXJlZE91dFJlY29yZHMoKSBjb25zdAoreworICB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCBub3cgPSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpOworCisgIHJldHVybiBzdGQ6OmFueV9vZihtX291dFJlY29yZHMuYmVnaW4oKSwgbV9vdXRSZWNvcmRzLmVuZCgpLAorICAgIFsmbm93XSAoY29uc3QgT3V0UmVjb3JkJiBvdXRSZWNvcmQpIHsgcmV0dXJuIG91dFJlY29yZC5nZXRFeHBpcnkoKSA+PSBub3c7IH0pOworfQorCit9IC8vIG5hbWVzcGFjZSBwaXQKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9waXQtZW50cnkuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9waXQtZW50cnkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmY2Y0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1lbnRyeS5ocHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9QSVRfRU5UUllfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfUElUX0VOVFJZX0hQUAorCisjaW5jbHVkZSAicGl0LWluLXJlY29yZC5ocHAiCisjaW5jbHVkZSAicGl0LW91dC1yZWNvcmQuaHBwIgorI2luY2x1ZGUgImNvcmUvc2NoZWR1bGVyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKK2NsYXNzIE5hbWVUcmVlOworCituYW1lc3BhY2UgbmFtZV90cmVlIHsKK2NsYXNzIEVudHJ5OworfQorCituYW1lc3BhY2UgcGl0IHsKKworLyoqIFxicmllZiByZXByZXNlbnRzIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIEluUmVjb3JkcworICovCit0eXBlZGVmIHN0ZDo6bGlzdDwgSW5SZWNvcmQ+ICBJblJlY29yZENvbGxlY3Rpb247CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiBPdXRSZWNvcmRzCisgKi8KK3R5cGVkZWYgc3RkOjpsaXN0PE91dFJlY29yZD4gT3V0UmVjb3JkQ29sbGVjdGlvbjsKKworLyoqIFxicmllZiBpbmRpY2F0ZXMgd2hlcmUgZHVwbGljYXRlIE5vbmNlcyBhcmUgZm91bmQKKyAqLworZW51bSBEdXBsaWNhdGVOb25jZVdoZXJlIHsKKyAgRFVQTElDQVRFX05PTkNFX05PTkUgICAgICA9IDAsCisgIC8vLyBpbi1yZWNvcmQgb2Ygc2FtZSBmYWNlCisgIERVUExJQ0FURV9OT05DRV9JTl9TQU1FICAgPSAoMSA8PCAwKSwKKyAgLy8vIGluLXJlY29yZCBvZiBvdGhlciBmYWNlCisgIERVUExJQ0FURV9OT05DRV9JTl9PVEhFUiAgPSAoMSA8PCAxKSwKKyAgLy8vIG91dC1yZWNvcmQgb2Ygc2FtZSBmYWNlCisgIERVUExJQ0FURV9OT05DRV9PVVRfU0FNRSAgPSAoMSA8PCAyKSwKKyAgLy8vIG91dC1yZWNvcmQgb2Ygb3RoZXIgZmFjZQorICBEVVBMSUNBVEVfTk9OQ0VfT1VUX09USEVSID0gKDEgPDwgMykKK307CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyBhIFBJVCBlbnRyeQorICovCitjbGFzcyBFbnRyeSA6IHB1YmxpYyBTdHJhdGVneUluZm9Ib3N0LCBub25jb3B5YWJsZQoreworcHVibGljOgorICBleHBsaWNpdAorICBFbnRyeShjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpOworCisgIGNvbnN0IEludGVyZXN0JgorICBnZXRJbnRlcmVzdCgpIGNvbnN0OworCisgIC8qKiBccmV0dXJuIEludGVyZXN0IE5hbWUKKyAgICovCisgIGNvbnN0IE5hbWUmCisgIGdldE5hbWUoKSBjb25zdDsKKworICAvKiogXGJyaWVmIGRlY2lkZXMgd2hldGhlciBJbnRlcmVzdCBjYW4gYmUgZm9yd2FyZGVkIHRvIGZhY2UKKyAgICoKKyAgICogIFxyZXR1cm4gdHJ1ZSBpZiBPdXRSZWNvcmQgb2YgdGhpcyBmYWNlIGRvZXMgbm90IGV4aXN0IG9yIGhhcyBleHBpcmVkLAorICAgKiAgICAgICAgICBhbmQgdGhlcmUgaXMgYW4gSW5SZWNvcmQgbm90IG9mIHRoaXMgZmFjZSwKKyAgICogICAgICAgICAgYW5kIHNjb3BlIGlzIG5vdCB2aW9sYXRlZAorICAgKi8KKyAgYm9vbAorICBjYW5Gb3J3YXJkVG8oY29uc3QgRmFjZSYgZmFjZSkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBkZWNpZGVzIHdoZXRoZXIgZm9yd2FyZGluZyBJbnRlcmVzdCB0byBmYWNlIHdvdWxkIHZpb2xhdGUgc2NvcGUKKyAgICoKKyAgICogIFxyZXR1cm4gdHJ1ZSBpZiBzY29wZSBjb250cm9sIHdvdWxkIGJlIHZpb2xhdGVkCisgICAqICBcbm90ZSBjYW5Gb3J3YXJkVG8gaGFzIG1vcmUgY29tcHJlaGVuc2l2ZSBjaGVja3MgKGluY2x1ZGluZyBzY29wZSBjb250cm9sKQorICAgKiAgICAgICAgYW5kIHNob3VsZCBiZSB1c2VkIGJ5IG1vc3Qgc3RyYXRlZ2llcy4gT3V0Z29pbmcgSW50ZXJlc3QgcGlwZWxpbmUKKyAgICogICAgICAgIHNob3VsZCBvbmx5IGNoZWNrIHNjb3BlIGJlY2F1c2Ugc29tZSBzdHJhdGVneSAoZWcuIHZlaGljdWxhcikgbmVlZHMKKyAgICogICAgICAgIHRvIHJldHJhbnNtaXQgc29vbmVyIHRoYW4gT3V0UmVjb3JkIGV4cGlyeSwgb3IgZm9yd2FyZCBJbnRlcmVzdAorICAgKiAgICAgICAgYmFjayB0byBpbmNvbWluZyBmYWNlCisgICAqLworICBib29sCisgIHZpb2xhdGVzU2NvcGUoY29uc3QgRmFjZSYgZmFjZSkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBmaW5kcyB3aGVyZSBhIGR1cGxpY2F0ZSBOb25jZSBhcHBlYXJzCisgICAqICBccmV0dXJuIE9SJ2VkIER1cGxpY2F0ZU5vbmNlV2hlcmUKKyAgICovCisgIGludAorICBmaW5kTm9uY2UodWludDMyX3Qgbm9uY2UsIGNvbnN0IEZhY2UmIGZhY2UpIGNvbnN0OworCitwdWJsaWM6IC8vIEluUmVjb3JkCisgIGNvbnN0IEluUmVjb3JkQ29sbGVjdGlvbiYKKyAgZ2V0SW5SZWNvcmRzKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBkZXRlcm1pbmVzIHdoZXRoZXIgYW55IEluUmVjb3JkIGlzIGEgbG9jYWwgRmFjZQorICAgKgorICAgKiAgXHJldHVybiB0cnVlIGlmIGFueSBJblJlY29yZCBpcyBhIGxvY2FsIEZhY2UsCisgICAqICAgICAgICAgIGZhbHNlIGlmIGFsbCBJblJlY29yZHMgYXJlIG5vbi1sb2NhbCBGYWNlcworICAgKi8KKyAgYm9vbAorICBoYXNMb2NhbEluUmVjb3JkKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBpbnNlcnRzIGEgSW5SZWNvcmQgZm9yIGZhY2UsIGFuZCB1cGRhdGVzIGl0IHdpdGggaW50ZXJlc3QKKyAgICoKKyAgICogIElmIEluUmVjb3JkIGZvciBmYWNlIGV4aXN0cywgdGhlIGV4aXN0aW5nIG9uZSBpcyB1cGRhdGVkLgorICAgKiAgVGhpcyBtZXRob2QgZG9lcyBub3QgYWRkIHRoZSBOb25jZSBhcyBhIHNlZW4gTm9uY2UuCisgICAqICBccmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBJblJlY29yZAorICAgKi8KKyAgSW5SZWNvcmRDb2xsZWN0aW9uOjppdGVyYXRvcgorICBpbnNlcnRPclVwZGF0ZUluUmVjb3JkKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSwgY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KTsKKworICAvKiogXGJyaWVmIGdldCB0aGUgSW5SZWNvcmQgZm9yIGZhY2UKKyAgICogIFxyZXR1cm4gYW4gaXRlcmF0b3IgdG8gdGhlIEluUmVjb3JkLCBvciAuZW5kIGlmIGl0IGRvZXMgbm90IGV4aXN0CisgICAqLworICBJblJlY29yZENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yCisgIGdldEluUmVjb3JkKGNvbnN0IEZhY2UmIGZhY2UpIGNvbnN0OworCisgIC8vLyBkZWxldGVzIGFsbCBJblJlY29yZHMKKyAgdm9pZAorICBkZWxldGVJblJlY29yZHMoKTsKKworcHVibGljOiAvLyBPdXRSZWNvcmQKKyAgY29uc3QgT3V0UmVjb3JkQ29sbGVjdGlvbiYKKyAgZ2V0T3V0UmVjb3JkcygpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgaW5zZXJ0cyBhIE91dFJlY29yZCBmb3IgZmFjZSwgYW5kIHVwZGF0ZXMgaXQgd2l0aCBpbnRlcmVzdAorICAgKgorICAgKiAgSWYgT3V0UmVjb3JkIGZvciBmYWNlIGV4aXN0cywgdGhlIGV4aXN0aW5nIG9uZSBpcyB1cGRhdGVkLgorICAgKiAgXHJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgT3V0UmVjb3JkCisgICAqLworICBPdXRSZWNvcmRDb2xsZWN0aW9uOjppdGVyYXRvcgorICBpbnNlcnRPclVwZGF0ZU91dFJlY29yZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UsIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCk7CisKKyAgLyoqIFxicmllZiBnZXQgdGhlIE91dFJlY29yZCBmb3IgZmFjZQorICAgKiAgXHJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgT3V0UmVjb3JkLCBvciAuZW5kIGlmIGl0IGRvZXMgbm90IGV4aXN0CisgICAqLworICBPdXRSZWNvcmRDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvcgorICBnZXRPdXRSZWNvcmQoY29uc3QgRmFjZSYgZmFjZSkgY29uc3Q7CisKKyAgLy8vIGRlbGV0ZXMgb25lIE91dFJlY29yZCBmb3IgZmFjZSBpZiBleGlzdHMKKyAgdm9pZAorICBkZWxldGVPdXRSZWNvcmQoY29uc3QgRmFjZSYgZmFjZSk7CisKKyAgLyoqIFxyZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSB1bmV4cGlyZWQgT3V0UmVjb3JkcworICAgKi8KKyAgYm9vbAorICBoYXNVbmV4cGlyZWRPdXRSZWNvcmRzKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgRXZlbnRJZCBtX3Vuc2F0aXNmeVRpbWVyOworICBFdmVudElkIG1fc3RyYWdnbGVyVGltZXI7CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+IG1faW50ZXJlc3Q7CisgIEluUmVjb3JkQ29sbGVjdGlvbiBtX2luUmVjb3JkczsKKyAgT3V0UmVjb3JkQ29sbGVjdGlvbiBtX291dFJlY29yZHM7CisKKyAgc3RhdGljIGNvbnN0IE5hbWUgTE9DQUxIT1NUX05BTUU7CisgIHN0YXRpYyBjb25zdCBOYW1lIExPQ0FMSE9QX05BTUU7CisKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBtX25hbWVUcmVlRW50cnk7CisKKyAgZnJpZW5kIGNsYXNzIG5mZDo6TmFtZVRyZWU7CisgIGZyaWVuZCBjbGFzcyBuZmQ6Om5hbWVfdHJlZTo6RW50cnk7Cit9OworCitpbmxpbmUgY29uc3QgSW50ZXJlc3QmCitFbnRyeTo6Z2V0SW50ZXJlc3QoKSBjb25zdAoreworICByZXR1cm4gKm1faW50ZXJlc3Q7Cit9CisKK2lubGluZSBjb25zdCBJblJlY29yZENvbGxlY3Rpb24mCitFbnRyeTo6Z2V0SW5SZWNvcmRzKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1faW5SZWNvcmRzOworfQorCitpbmxpbmUgY29uc3QgT3V0UmVjb3JkQ29sbGVjdGlvbiYKK0VudHJ5OjpnZXRPdXRSZWNvcmRzKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fb3V0UmVjb3JkczsKK30KKworfSAvLyBuYW1lc3BhY2UgcGl0Cit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fVEFCTEVfUElUX0VOVFJZX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9waXQtZmFjZS1yZWNvcmQuY3BwIGIvTkZEL2RhZW1vbi90YWJsZS9waXQtZmFjZS1yZWNvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MmExYjUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1mYWNlLXJlY29yZC5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInBpdC1mYWNlLXJlY29yZC5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHBpdCB7CisKK0ZhY2VSZWNvcmQ6OkZhY2VSZWNvcmQoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKQorICA6IG1fZmFjZShmYWNlKQorICAsIG1fbGFzdE5vbmNlKDApCisgICwgbV9sYXN0UmVuZXdlZCh0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludDo6bWluKCkpCisgICwgbV9leHBpcnkodGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQ6Om1pbigpKQoreworfQorCit2b2lkCitGYWNlUmVjb3JkOjp1cGRhdGUoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQoreworICBtX2xhc3ROb25jZSA9IGludGVyZXN0LmdldE5vbmNlKCk7CisgIG1fbGFzdFJlbmV3ZWQgPSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpOworCisgIHRpbWU6Om1pbGxpc2Vjb25kcyBsaWZldGltZSA9IGludGVyZXN0LmdldEludGVyZXN0TGlmZXRpbWUoKTsKKyAgaWYgKGxpZmV0aW1lIDwgdGltZTo6bWlsbGlzZWNvbmRzOjp6ZXJvKCkpIHsKKyAgICBsaWZldGltZSA9IG5kbjo6REVGQVVMVF9JTlRFUkVTVF9MSUZFVElNRTsKKyAgfQorICBtX2V4cGlyeSA9IG1fbGFzdFJlbmV3ZWQgKyBsaWZldGltZTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBwaXQKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9waXQtZmFjZS1yZWNvcmQuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9waXQtZmFjZS1yZWNvcmQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDZjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1mYWNlLXJlY29yZC5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9QSVRfRkFDRV9SRUNPUkRfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfUElUX0ZBQ0VfUkVDT1JEX0hQUAorCisjaW5jbHVkZSAiZmFjZS9mYWNlLmhwcCIKKyNpbmNsdWRlICJzdHJhdGVneS1pbmZvLWhvc3QuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBwaXQgeworCisvKiogXGJyaWVmIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEludGVyZXN0CisgKiAgICAgICAgIG9uIGFuIGluY29taW5nIG9yIG91dGdvaW5nIGZhY2UKKyAqICBcbm90ZSBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCB0byBleHRyYWN0IGNvbW1vbiBmdW5jdGlvbmFsaXR5CisgKiAgICAgICAgb2YgSW5SZWNvcmQgYW5kIE91dFJlY29yZAorICovCitjbGFzcyBGYWNlUmVjb3JkIDogcHVibGljIFN0cmF0ZWd5SW5mb0hvc3QKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgRmFjZVJlY29yZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpOworCisgIHNoYXJlZF9wdHI8RmFjZT4KKyAgZ2V0RmFjZSgpIGNvbnN0OworCisgIHVpbnQzMl90CisgIGdldExhc3ROb25jZSgpIGNvbnN0OworCisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50CisgIGdldExhc3RSZW5ld2VkKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBnaXZlcyB0aGUgdGltZSBwb2ludCB0aGlzIHJlY29yZCBleHBpcmVzCisgICAqICBccmV0dXJuIGdldExhc3RSZW5ld2VkKCkgKyBJbnRlcmVzdExpZmV0aW1lCisgICAqLworICB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludAorICBnZXRFeHBpcnkoKSBjb25zdDsKKworICAvKiogXGJyaWVmIHVwZGF0ZXMgbGFzdE5vbmNlLCBsYXN0UmVuZXdlZCwgZXhwaXJ5IGZpZWxkcworICAgKi8KKyAgdm9pZAorICB1cGRhdGUoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KTsKKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxGYWNlPiBtX2ZhY2U7CisgIHVpbnQzMl90IG1fbGFzdE5vbmNlOworICB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCBtX2xhc3RSZW5ld2VkOworICB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCBtX2V4cGlyeTsKK307CisKK2lubGluZSBzaGFyZWRfcHRyPEZhY2U+CitGYWNlUmVjb3JkOjpnZXRGYWNlKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fZmFjZTsKK30KKworaW5saW5lIHVpbnQzMl90CitGYWNlUmVjb3JkOjpnZXRMYXN0Tm9uY2UoKSBjb25zdAoreworICByZXR1cm4gbV9sYXN0Tm9uY2U7Cit9CisKK2lubGluZSB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludAorRmFjZVJlY29yZDo6Z2V0TGFzdFJlbmV3ZWQoKSBjb25zdAoreworICByZXR1cm4gbV9sYXN0UmVuZXdlZDsKK30KKworaW5saW5lIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50CitGYWNlUmVjb3JkOjpnZXRFeHBpcnkoKSBjb25zdAoreworICByZXR1cm4gbV9leHBpcnk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHBpdAorfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX1RBQkxFX1BJVF9GQUNFX1JFQ09SRF9IUFAKZGlmZiAtLWdpdCBhL05GRC9kYWVtb24vdGFibGUvcGl0LWluLXJlY29yZC5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1pbi1yZWNvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjBlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1pbi1yZWNvcmQuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJwaXQtaW4tcmVjb3JkLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcGl0IHsKKworSW5SZWNvcmQ6OkluUmVjb3JkKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSkKKyAgOiBGYWNlUmVjb3JkKGZhY2UpCit7Cit9CisKK3ZvaWQKK0luUmVjb3JkOjp1cGRhdGUoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQoreworICB0aGlzLT5GYWNlUmVjb3JkOjp1cGRhdGUoaW50ZXJlc3QpOworICBtX2ludGVyZXN0ID0gY29uc3RfY2FzdDxJbnRlcmVzdCY+KGludGVyZXN0KS5zaGFyZWRfZnJvbV90aGlzKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHBpdAorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL3BpdC1pbi1yZWNvcmQuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9waXQtaW4tcmVjb3JkLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU2ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi90YWJsZS9waXQtaW4tcmVjb3JkLmhwcApAQCAtMCwwICsxLDYzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9EQUVNT05fVEFCTEVfUElUX0lOX1JFQ09SRF9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9UQUJMRV9QSVRfSU5fUkVDT1JEX0hQUAorCisjaW5jbHVkZSAicGl0LWZhY2UtcmVjb3JkLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcGl0IHsKKworLyoqIFxjbGFzcyBJblJlY29yZAorICogIFxicmllZiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBJbnRlcmVzdCBmcm9tIGFuIGluY29taW5nIGZhY2UKKyAqLworY2xhc3MgSW5SZWNvcmQgOiBwdWJsaWMgRmFjZVJlY29yZAoreworcHVibGljOgorICBleHBsaWNpdAorICBJblJlY29yZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpOworCisgIHZvaWQKKyAgdXBkYXRlKGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCk7CisKKyAgY29uc3QgSW50ZXJlc3QmCisgIGdldEludGVyZXN0KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+IG1faW50ZXJlc3Q7Cit9OworCitpbmxpbmUgY29uc3QgSW50ZXJlc3QmCitJblJlY29yZDo6Z2V0SW50ZXJlc3QoKSBjb25zdAoreworICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4obV9pbnRlcmVzdCkpOworICByZXR1cm4gKm1faW50ZXJlc3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIHBpdAorfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfREFFTU9OX1RBQkxFX1BJVF9JTl9SRUNPUkRfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL3BpdC1vdXQtcmVjb3JkLmNwcCBiL05GRC9kYWVtb24vdGFibGUvcGl0LW91dC1yZWNvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGI2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1vdXQtcmVjb3JkLmNwcApAQCAtMCwwICsxLDM2IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAicGl0LW91dC1yZWNvcmQuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBwaXQgeworCitPdXRSZWNvcmQ6Ok91dFJlY29yZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpCisgIDogRmFjZVJlY29yZChmYWNlKQoreworfQorCit9IC8vIG5hbWVzcGFjZSBwaXQKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9waXQtb3V0LXJlY29yZC5ocHAgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC1vdXQtcmVjb3JkLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzVlMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RhZW1vbi90YWJsZS9waXQtb3V0LXJlY29yZC5ocHAKQEAgLTAsMCArMSw0NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBORkRfREFFTU9OX1RBQkxFX1BJVF9PVVRfUkVDT1JEX0hQUAorI2RlZmluZSBORkRfREFFTU9OX1RBQkxFX1BJVF9PVVRfUkVDT1JEX0hQUAorCisjaW5jbHVkZSAicGl0LWZhY2UtcmVjb3JkLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcGl0IHsKKworLyoqIFxjbGFzcyBPdXRSZWNvcmQKKyAqICBcYnJpZWYgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW4gSW50ZXJlc3QgdG93YXJkIGFuIG91dGdvaW5nIGZhY2UKKyAqLworY2xhc3MgT3V0UmVjb3JkIDogcHVibGljIEZhY2VSZWNvcmQKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgT3V0UmVjb3JkKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBwaXQKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9UQUJMRV9QSVRfSU5fUkVDT1JEX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9waXQuY3BwIGIvTkZEL2RhZW1vbi90YWJsZS9waXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzMzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJwaXQuaHBwIgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8Ym9vc3QvY29uY2VwdC9hc3NlcnQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvbmNlcHRfY2hlY2suaHBwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBwaXQgeworCisjaWYgSEFWRV9JU19NT1ZFX0NPTlNUUlVDVElCTEUKK3N0YXRpY19hc3NlcnQoc3RkOjppc19tb3ZlX2NvbnN0cnVjdGlibGU8RGF0YU1hdGNoUmVzdWx0Pjo6dmFsdWUsCisgICAgICAgICAgICAgICJEYXRhTWF0Y2hSZXN1bHQgbXVzdCBiZSBNb3ZlQ29uc3RydWN0aWJsZSIpOworI2VuZGlmIC8vIEhBVkVfSVNfTU9WRV9DT05TVFJVQ1RJQkxFCisKK30gLy8gbmFtZXNwYWNlIHBpdAorCisvLyBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0ZvcndhcmRJdGVyYXRvcgorQk9PU1RfQ09OQ0VQVF9BU1NFUlQoKGJvb3N0OjpGb3J3YXJkSXRlcmF0b3I8UGl0Ojpjb25zdF9pdGVyYXRvcj4pKTsKKy8vIGJvb3N0OjpGb3J3YXJkSXRlcmF0b3IgZm9sbG93cyBTR0kgc3RhbmRhcmQgaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0ZvcndhcmRJdGVyYXRvci5odG1sLAorLy8gd2hpY2ggZG9lc24ndCByZXF1aXJlIERlZmF1bHRDb25zdHJ1Y3RpYmxlCisjaWZkZWYgSEFWRV9JU19ERUZBVUxUX0NPTlNUUlVDVElCTEUKK3N0YXRpY19hc3NlcnQoc3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8UGl0Ojpjb25zdF9pdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgICAiUGl0Ojpjb25zdF9pdGVyYXRvciBtdXN0IGJlIGRlZmF1bHQtY29uc3RydWN0aWJsZSIpOworI2Vsc2UKK0JPT1NUX0NPTkNFUFRfQVNTRVJUKChib29zdDo6RGVmYXVsdENvbnN0cnVjdGlibGU8UGl0Ojpjb25zdF9pdGVyYXRvcj4pKTsKKyNlbmRpZiAvLyBIQVZFX0lTX0RFRkFVTFRfQ09OU1RSVUNUSUJMRQorCitQaXQ6OlBpdChOYW1lVHJlZSYgbmFtZVRyZWUpCisgIDogbV9uYW1lVHJlZShuYW1lVHJlZSkKKyAgLCBtX25JdGVtcygwKQoreworfQorCitQaXQ6On5QaXQoKQoreworfQorCitzdGQ6OnBhaXI8c2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiwgYm9vbD4KK1BpdDo6aW5zZXJ0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKK3sKKyAgLy8gZmlyc3QgbG9va3VwKCkgdGhlIEludGVyZXN0IE5hbWUgaW4gdGhlIE5hbWVUcmVlLCB3aGljaCB3aWxsIGNyZWF0ZXMgYWxsCisgIC8vIHRoZSBpbnRlcm1lZGlhIG5vZGVzLCBzdGFydGluZyBmcm9tIHRoZSBzaG9ydGVzdCBwcmVmaXguCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbmFtZVRyZWVFbnRyeSA9IG1fbmFtZVRyZWUubG9va3VwKGludGVyZXN0LmdldE5hbWUoKSk7CisgIEJPT1NUX0FTU0VSVChzdGF0aWNfY2FzdDxib29sPihuYW1lVHJlZUVudHJ5KSk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxwaXQ6OkVudHJ5Pj4mIHBpdEVudHJpZXMgPSBuYW1lVHJlZUVudHJ5LT5nZXRQaXRFbnRyaWVzKCk7CisKKyAgLy8gdGhlbiBjaGVjayBpZiB0aGlzIEludGVyZXN0IGlzIGFscmVhZHkgaW4gdGhlIFBJVCBlbnRyaWVzCisgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYocGl0RW50cmllcy5iZWdpbigpLCBwaXRFbnRyaWVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsmaW50ZXJlc3RdIChjb25zdCBzaGFyZWRfcHRyPHBpdDo6RW50cnk+JiBlbnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LT5nZXRJbnRlcmVzdCgpLmdldE5hbWUoKSA9PSBpbnRlcmVzdC5nZXROYW1lKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Z2V0SW50ZXJlc3QoKS5nZXRTZWxlY3RvcnMoKSA9PSBpbnRlcmVzdC5nZXRTZWxlY3RvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgaWYgKGl0ICE9IHBpdEVudHJpZXMuZW5kKCkpIHsKKyAgICByZXR1cm4geyAqaXQsIGZhbHNlIH07CisgIH0KKworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IGVudHJ5ID0gbWFrZV9zaGFyZWQ8cGl0OjpFbnRyeT4oaW50ZXJlc3QpOworICBuYW1lVHJlZUVudHJ5LT5pbnNlcnRQaXRFbnRyeShlbnRyeSk7CisgIG1fbkl0ZW1zKys7CisgIHJldHVybiB7IGVudHJ5LCB0cnVlIH07Cit9CisKK3BpdDo6RGF0YU1hdGNoUmVzdWx0CitQaXQ6OmZpbmRBbGxEYXRhTWF0Y2hlcyhjb25zdCBEYXRhJiBkYXRhKSBjb25zdAoreworICBhdXRvJiYgbnRNYXRjaGVzID0gbV9uYW1lVHJlZS5maW5kQWxsTWF0Y2hlcyhkYXRhLmdldE5hbWUoKSwKKyAgICBbXSAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgZW50cnkpIHsgcmV0dXJuIGVudHJ5Lmhhc1BpdEVudHJpZXMoKTsgfSk7CisKKyAgcGl0OjpEYXRhTWF0Y2hSZXN1bHQgbWF0Y2hlczsKKyAgZm9yIChjb25zdCBuYW1lX3RyZWU6OkVudHJ5JiBudGUgOiBudE1hdGNoZXMpIHsKKyAgICBmb3IgKGNvbnN0IHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4mIHBpdEVudHJ5IDogbnRlLmdldFBpdEVudHJpZXMoKSkgeworICAgICAgaWYgKHBpdEVudHJ5LT5nZXRJbnRlcmVzdCgpLm1hdGNoZXNEYXRhKGRhdGEpKQorICAgICAgICBtYXRjaGVzLmVtcGxhY2VfYmFjayhwaXRFbnRyeSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1hdGNoZXM7Cit9CisKK3ZvaWQKK1BpdDo6ZXJhc2Uoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBuYW1lVHJlZUVudHJ5ID0gbV9uYW1lVHJlZS5nZXQoKnBpdEVudHJ5KTsKKyAgQk9PU1RfQVNTRVJUKHN0YXRpY19jYXN0PGJvb2w+KG5hbWVUcmVlRW50cnkpKTsKKworICBuYW1lVHJlZUVudHJ5LT5lcmFzZVBpdEVudHJ5KHBpdEVudHJ5KTsKKyAgbV9uYW1lVHJlZS5lcmFzZUVudHJ5SWZFbXB0eShuYW1lVHJlZUVudHJ5KTsKKworICAtLW1fbkl0ZW1zOworfQorCitQaXQ6OmNvbnN0X2l0ZXJhdG9yCitQaXQ6OmJlZ2luKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fbmFtZVRyZWUuZnVsbEVudW1lcmF0ZSgKKyAgICBbXSAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgZW50cnkpIHsgcmV0dXJuIGVudHJ5Lmhhc1BpdEVudHJpZXMoKTsgfSkuYmVnaW4oKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9waXQuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9waXQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZGY0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3BpdC5ocHAKQEAgLTAsMCArMSwyMjAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9QSVRfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfUElUX0hQUAorCisjaW5jbHVkZSAibmFtZS10cmVlLmhwcCIKKyNpbmNsdWRlICJwaXQtZW50cnkuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBwaXQgeworCisvKiogXGNsYXNzIERhdGFNYXRjaFJlc3VsdAorICogIFxicmllZiBhbiB1bm9yZGVyZWQgaXRlcmFibGUgb2YgYWxsIFBJVCBlbnRyaWVzIG1hdGNoaW5nIERhdGEKKyAqCisgKiAgVGhpcyB0eXBlIHNoYWxsIHN1cHBvcnQ6CisgKiAgICBpdGVyYXRvcjxzaGFyZWRfcHRyPHBpdDo6RW50cnk+PiBiZWdpbigpCisgKiAgICBpdGVyYXRvcjxzaGFyZWRfcHRyPHBpdDo6RW50cnk+PiBlbmQoKQorICovCit0eXBlZGVmIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4+IERhdGFNYXRjaFJlc3VsdDsKKworfSAvLyBuYW1lc3BhY2UgcGl0CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyB0aGUgSW50ZXJlc3QgVGFibGUKKyAqLworY2xhc3MgUGl0IDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgUGl0KE5hbWVUcmVlJiBuYW1lVHJlZSk7CisKKyAgflBpdCgpOworCisgIC8qKiBccmV0dXJuIG51bWJlciBvZiBlbnRyaWVzCisgICAqLworICBzaXplX3QKKyAgc2l6ZSgpIGNvbnN0OworCisgIC8qKiBcYnJpZWYgaW5zZXJ0cyBhIFBJVCBlbnRyeSBmb3IgSW50ZXJlc3QKKyAgICoKKyAgICogIElmIGFuIGVudHJ5IGZvciBleGFjdCBzYW1lIG5hbWUgYW5kIHNlbGVjdG9ycyBleGlzdHMsIHRoYXQgZW50cnkgaXMgcmV0dXJuZWQuCisgICAqICBccmV0dXJuIHRoZSBlbnRyeSwgYW5kIHRydWUgZm9yIG5ldyBlbnRyeSwgZmFsc2UgZm9yIGV4aXN0aW5nIGVudHJ5CisgICAqLworICBzdGQ6OnBhaXI8c2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiwgYm9vbD4KKyAgaW5zZXJ0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCk7CisKKyAgLyoqIFxicmllZiBwZXJmb3JtcyBhIERhdGEgbWF0Y2gKKyAgICogIFxyZXR1cm4gYW4gaXRlcmFibGUgb2YgYWxsIFBJVCBlbnRyaWVzIG1hdGNoaW5nIGRhdGEKKyAgICovCisgIHBpdDo6RGF0YU1hdGNoUmVzdWx0CisgIGZpbmRBbGxEYXRhTWF0Y2hlcyhjb25zdCBEYXRhJiBkYXRhKSBjb25zdDsKKworICAvKioKKyAgICogIFxicmllZiBlcmFzZXMgYSBQSVQgRW50cnkKKyAgICovCisgIHZvaWQKKyAgZXJhc2Uoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSk7CisKK3B1YmxpYzogLy8gZW51bWVyYXRpb24KKyAgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBQSVQgZW50cnkKKyAgICogIFxub3RlIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhbmQgaXMgdW5kZWZpbmVkCisgICAqICBcbm90ZSBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgbWF5IGdldCBpbnZhbGlkYXRlZCBpZiBQSVQgb3IgYW5vdGhlciBOYW1lVHJlZS1iYXNlZAorICAgKiAgICAgICAgdGFibGUgaXMgbW9kaWZpZWQKKyAgICovCisgIGNvbnN0X2l0ZXJhdG9yCisgIGJlZ2luKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHJlZmVycmluZyB0byB0aGUgcGFzdC10aGUtZW5kIFBJVCBlbnRyeQorICAgKiAgXG5vdGUgVGhlIHJldHVybmVkIGl0ZXJhdG9yIG1heSBnZXQgaW52YWxpZGF0ZWQgaWYgUElUIG9yIGFub3RoZXIgTmFtZVRyZWUtYmFzZWQKKyAgICogICAgICAgIHRhYmxlIGlzIG1vZGlmaWVkCisgICAqLworICBjb25zdF9pdGVyYXRvcgorICBlbmQoKSBjb25zdDsKKworICBjbGFzcyBjb25zdF9pdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIGNvbnN0IHBpdDo6RW50cnk+CisgIHsKKyAgcHVibGljOgorICAgIGNvbnN0X2l0ZXJhdG9yKCk7CisKKyAgICBleHBsaWNpdAorICAgIGNvbnN0X2l0ZXJhdG9yKGNvbnN0IE5hbWVUcmVlOjpjb25zdF9pdGVyYXRvciYgaXQpOworCisgICAgfmNvbnN0X2l0ZXJhdG9yKCk7CisKKyAgICBjb25zdCBwaXQ6OkVudHJ5JgorICAgIG9wZXJhdG9yKigpIGNvbnN0OworCisgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PgorICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKworICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgIG9wZXJhdG9yKysoKTsKKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgb3BlcmF0b3IrKyhpbnQpOworCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKKworICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3IgbV9uYW1lVHJlZUl0ZXJhdG9yOworICAgIC8qKiBcYnJpZWYgSW5kZXggb2YgdGhlIGN1cnJlbnQgdmlzaXRpbmcgUElUIGVudHJ5IGluIE5hbWVUcmVlIG5vZGUKKyAgICAgKgorICAgICAqIEluZGV4IGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgZGVyZWZlcmVuY2luZyBvZiBtX25hbWVUcmVlSXRlcmF0b3IgaGFwcGVucyBvbmx5IHdoZW4KKyAgICAgKiBjb25zdF9pdGVyYXRvciBpcyBkZXJlZmVyZW5jZWQgb3IgYWR2YW5jZWQuCisgICAgICovCisgICAgc2l6ZV90IG1faVBpdEVudHJ5OworICB9OworCitwcml2YXRlOgorICBOYW1lVHJlZSYgbV9uYW1lVHJlZTsKKyAgc2l6ZV90IG1fbkl0ZW1zOworfTsKKworaW5saW5lIHNpemVfdAorUGl0OjpzaXplKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbkl0ZW1zOworfQorCitpbmxpbmUgUGl0Ojpjb25zdF9pdGVyYXRvcgorUGl0OjplbmQoKSBjb25zdAoreworICByZXR1cm4gY29uc3RfaXRlcmF0b3IobV9uYW1lVHJlZS5lbmQoKSk7Cit9CisKK2lubGluZQorUGl0Ojpjb25zdF9pdGVyYXRvcjo6Y29uc3RfaXRlcmF0b3IoKQorICA6IG1faVBpdEVudHJ5KDApCit7Cit9CisKK2lubGluZQorUGl0Ojpjb25zdF9pdGVyYXRvcjo6Y29uc3RfaXRlcmF0b3IoY29uc3QgTmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yJiBpdCkKKyAgOiBtX25hbWVUcmVlSXRlcmF0b3IoaXQpCisgICwgbV9pUGl0RW50cnkoMCkKK3sKK30KKworaW5saW5lCitQaXQ6OmNvbnN0X2l0ZXJhdG9yOjp+Y29uc3RfaXRlcmF0b3IoKQoreworfQorCitpbmxpbmUgUGl0Ojpjb25zdF9pdGVyYXRvcgorUGl0Ojpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKyhpbnQpCit7CisgIFBpdDo6Y29uc3RfaXRlcmF0b3IgdGVtcCgqdGhpcyk7CisgICsrKCp0aGlzKTsKKyAgcmV0dXJuIHRlbXA7Cit9CisKK2lubGluZSBQaXQ6OmNvbnN0X2l0ZXJhdG9yJgorUGl0Ojpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7CisgICsrbV9pUGl0RW50cnk7CisgIGlmIChtX2lQaXRFbnRyeSA8IG1fbmFtZVRyZWVJdGVyYXRvci0+Z2V0UGl0RW50cmllcygpLnNpemUoKSkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgICsrbV9uYW1lVHJlZUl0ZXJhdG9yOworICBtX2lQaXRFbnRyeSA9IDA7CisgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIGNvbnN0IHBpdDo6RW50cnkmCitQaXQ6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdAoreworICByZXR1cm4gKih0aGlzLT5vcGVyYXRvci0+KCkpOworfQorCitpbmxpbmUgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PgorUGl0Ojpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0Cit7CisgIHJldHVybiBtX25hbWVUcmVlSXRlcmF0b3ItPmdldFBpdEVudHJpZXMoKS5hdChtX2lQaXRFbnRyeSk7Cit9CisKK2lubGluZSBib29sCitQaXQ6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IFBpdDo6Y29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdAoreworICByZXR1cm4gbV9uYW1lVHJlZUl0ZXJhdG9yID09IG90aGVyLm1fbmFtZVRyZWVJdGVyYXRvciAmJgorICAgICAgICAgbV9pUGl0RW50cnkgPT0gb3RoZXIubV9pUGl0RW50cnk7Cit9CisKK2lubGluZSBib29sCitQaXQ6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IFBpdDo6Y29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdAoreworICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9UQUJMRV9QSVRfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWNob2ljZS1lbnRyeS5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWNob2ljZS1lbnRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3YTI1NwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvc3RyYXRlZ3ktY2hvaWNlLWVudHJ5LmNwcApAQCAtMCwwICsxLDQ2IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgInN0cmF0ZWd5LWNob2ljZS1lbnRyeS5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImZ3L3N0cmF0ZWd5LmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2Ugc3RyYXRlZ3lfY2hvaWNlIHsKKworRW50cnk6OkVudHJ5KGNvbnN0IE5hbWUmIHByZWZpeCkKKyAgOiBtX3ByZWZpeChwcmVmaXgpCisgICwgbV9zdHJhdGVneShudWxscHRyKQoreworfQorCitjb25zdCBOYW1lJgorRW50cnk6OmdldFN0cmF0ZWd5TmFtZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX3N0cmF0ZWd5LT5nZXROYW1lKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHN0cmF0ZWd5X2Nob2ljZQorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWNob2ljZS1lbnRyeS5ocHAgYi9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWNob2ljZS1lbnRyeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3YTMxMwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvc3RyYXRlZ3ktY2hvaWNlLWVudHJ5LmhwcApAQCAtMCwwICsxLDk0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBORkRfREFFTU9OX1RBQkxFX1NUUkFURUdZX0NIT0lDRV9FTlRSWV9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9UQUJMRV9TVFJBVEVHWV9DSE9JQ0VfRU5UUllfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworY2xhc3MgTmFtZVRyZWU7CituYW1lc3BhY2UgbmFtZV90cmVlIHsKK2NsYXNzIEVudHJ5OworfQorbmFtZXNwYWNlIGZ3IHsKK2NsYXNzIFN0cmF0ZWd5OworfQorCituYW1lc3BhY2Ugc3RyYXRlZ3lfY2hvaWNlIHsKKworLyoqIFxicmllZiByZXByZXNlbnRzIGEgU3RyYXRlZ3kgQ2hvaWNlIGVudHJ5CisgKi8KK2NsYXNzIEVudHJ5IDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgRW50cnkoY29uc3QgTmFtZSYgcHJlZml4KTsKKworICBjb25zdCBOYW1lJgorICBnZXRQcmVmaXgoKSBjb25zdDsKKworICBjb25zdCBOYW1lJgorICBnZXRTdHJhdGVneU5hbWUoKSBjb25zdDsKKworICBmdzo6U3RyYXRlZ3kmCisgIGdldFN0cmF0ZWd5KCkgY29uc3Q7CisKKyAgdm9pZAorICBzZXRTdHJhdGVneShmdzo6U3RyYXRlZ3kmIHN0cmF0ZWd5KTsKKworcHJpdmF0ZToKKyAgTmFtZSBtX3ByZWZpeDsKKyAgZnc6OlN0cmF0ZWd5KiBtX3N0cmF0ZWd5OworCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbV9uYW1lVHJlZUVudHJ5OworICBmcmllbmQgY2xhc3MgbmZkOjpOYW1lVHJlZTsKKyAgZnJpZW5kIGNsYXNzIG5mZDo6bmFtZV90cmVlOjpFbnRyeTsKK307CisKKworaW5saW5lIGNvbnN0IE5hbWUmCitFbnRyeTo6Z2V0UHJlZml4KCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fcHJlZml4OworfQorCitpbmxpbmUgZnc6OlN0cmF0ZWd5JgorRW50cnk6OmdldFN0cmF0ZWd5KCkgY29uc3QKK3sKKyAgQk9PU1RfQVNTRVJUKG1fc3RyYXRlZ3kgIT0gbnVsbHB0cik7CisgIHJldHVybiAqbV9zdHJhdGVneTsKK30KKworaW5saW5lIHZvaWQKK0VudHJ5OjpzZXRTdHJhdGVneShmdzo6U3RyYXRlZ3kmIHN0cmF0ZWd5KQoreworICBtX3N0cmF0ZWd5ID0gJnN0cmF0ZWd5OworfQorCit9IC8vIG5hbWVzcGFjZSBzdHJhdGVneV9jaG9pY2UKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9UQUJMRV9TVFJBVEVHWV9DSE9JQ0VfRU5UUllfSFBQCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWNob2ljZS5jcHAgYi9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWNob2ljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhYWRlNgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvc3RyYXRlZ3ktY2hvaWNlLmNwcApAQCAtMCwwICsxLDI4NyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInN0cmF0ZWd5LWNob2ljZS5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImZ3L3N0cmF0ZWd5LmhwcCIKKyNpbmNsdWRlICJwaXQtZW50cnkuaHBwIgorI2luY2x1ZGUgIm1lYXN1cmVtZW50cy1lbnRyeS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCit1c2luZyBzdHJhdGVneV9jaG9pY2U6OkVudHJ5OwordXNpbmcgZnc6OlN0cmF0ZWd5OworCitORkRfTE9HX0lOSVQoIlN0cmF0ZWd5Q2hvaWNlIik7CisKK1N0cmF0ZWd5Q2hvaWNlOjpTdHJhdGVneUNob2ljZShOYW1lVHJlZSYgbmFtZVRyZWUsIHNoYXJlZF9wdHI8U3RyYXRlZ3k+IGRlZmF1bHRTdHJhdGVneSkKKyAgOiBtX25hbWVUcmVlKG5hbWVUcmVlKQorICAsIG1fbkl0ZW1zKDApCit7CisgIHRoaXMtPnNldERlZmF1bHRTdHJhdGVneShkZWZhdWx0U3RyYXRlZ3kpOworfQorCitib29sCitTdHJhdGVneUNob2ljZTo6aGFzU3RyYXRlZ3koY29uc3QgTmFtZSYgc3RyYXRlZ3lOYW1lLCBib29sIGlzRXhhY3QpIGNvbnN0Cit7CisgIGlmIChpc0V4YWN0KSB7CisgICAgcmV0dXJuIG1fc3RyYXRlZ3lJbnN0YW5jZXMuY291bnQoc3RyYXRlZ3lOYW1lKSA+IDA7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHRoaXMtPmdldFN0cmF0ZWd5KHN0cmF0ZWd5TmFtZSkpOworICB9Cit9CisKK2Jvb2wKK1N0cmF0ZWd5Q2hvaWNlOjppbnN0YWxsKHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5KQoreworICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4oc3RyYXRlZ3kpKTsKKyAgY29uc3QgTmFtZSYgc3RyYXRlZ3lOYW1lID0gc3RyYXRlZ3ktPmdldE5hbWUoKTsKKworICBpZiAodGhpcy0+aGFzU3RyYXRlZ3koc3RyYXRlZ3lOYW1lLCB0cnVlKSkgeworICAgIE5GRF9MT0dfRVJST1IoImluc3RhbGwoIiA8PCBzdHJhdGVneU5hbWUgPDwgIikgZHVwbGljYXRlIHN0cmF0ZWd5TmFtZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG1fc3RyYXRlZ3lJbnN0YW5jZXNbc3RyYXRlZ3lOYW1lXSA9IHN0cmF0ZWd5OworICByZXR1cm4gdHJ1ZTsKK30KKworZnc6OlN0cmF0ZWd5KgorU3RyYXRlZ3lDaG9pY2U6OmdldFN0cmF0ZWd5KGNvbnN0IE5hbWUmIHN0cmF0ZWd5TmFtZSkgY29uc3QKK3sKKyAgZnc6OlN0cmF0ZWd5KiBjYW5kaWRhdGUgPSBudWxscHRyOworICBmb3IgKGF1dG8gaXQgPSBtX3N0cmF0ZWd5SW5zdGFuY2VzLmxvd2VyX2JvdW5kKHN0cmF0ZWd5TmFtZSk7CisgICAgICAgaXQgIT0gbV9zdHJhdGVneUluc3RhbmNlcy5lbmQoKSAmJiBzdHJhdGVneU5hbWUuaXNQcmVmaXhPZihpdC0+Zmlyc3QpOyArK2l0KSB7CisgICAgc3dpdGNoIChpdC0+Zmlyc3Quc2l6ZSgpIC0gc3RyYXRlZ3lOYW1lLnNpemUoKSkgeworICAgIGNhc2UgMDogLy8gZXhhY3QgbWF0Y2gKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOworICAgIGNhc2UgMTogLy8gdW52ZXJzaW9uZWQgc3RyYXRlZ3lOYW1lIG1hdGNoZXMgdmVyc2lvbmVkIHN0cmF0ZWd5CisgICAgICBjYW5kaWRhdGUgPSBpdC0+c2Vjb25kLmdldCgpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBjYW5kaWRhdGU7Cit9CisKK2Jvb2wKK1N0cmF0ZWd5Q2hvaWNlOjppbnNlcnQoY29uc3QgTmFtZSYgcHJlZml4LCBjb25zdCBOYW1lJiBzdHJhdGVneU5hbWUpCit7CisgIFN0cmF0ZWd5KiBzdHJhdGVneSA9IHRoaXMtPmdldFN0cmF0ZWd5KHN0cmF0ZWd5TmFtZSk7CisgIGlmIChzdHJhdGVneSA9PSBudWxscHRyKSB7CisgICAgTkZEX0xPR19FUlJPUigiaW5zZXJ0KCIgPDwgcHJlZml4IDw8ICIsIiA8PCBzdHJhdGVneU5hbWUgPDwgIikgc3RyYXRlZ3kgbm90IGluc3RhbGxlZCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlID0gbV9uYW1lVHJlZS5sb29rdXAocHJlZml4KTsKKyAgc2hhcmVkX3B0cjxFbnRyeT4gZW50cnkgPSBudGUtPmdldFN0cmF0ZWd5Q2hvaWNlRW50cnkoKTsKKyAgU3RyYXRlZ3kqIG9sZFN0cmF0ZWd5ID0gbnVsbHB0cjsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkgeworICAgIGlmIChlbnRyeS0+Z2V0U3RyYXRlZ3koKS5nZXROYW1lKCkgPT0gc3RyYXRlZ3ktPmdldE5hbWUoKSkgeworICAgICAgTkZEX0xPR19UUkFDRSgiaW5zZXJ0KCIgPDwgcHJlZml4IDw8ICIpIG5vdCBjaGFuZ2luZyAiIDw8IHN0cmF0ZWd5LT5nZXROYW1lKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIG9sZFN0cmF0ZWd5ID0gJmVudHJ5LT5nZXRTdHJhdGVneSgpOworICAgIE5GRF9MT0dfVFJBQ0UoImluc2VydCgiIDw8IHByZWZpeCA8PCAiKSBjaGFuZ2luZyBmcm9tICIgPDwgb2xkU3RyYXRlZ3ktPmdldE5hbWUoKSA8PAorICAgICAgICAgICAgICAgICAgIiB0byAiIDw8IHN0cmF0ZWd5LT5nZXROYW1lKCkpOworICB9CisKKyAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpIHsKKyAgICBvbGRTdHJhdGVneSA9ICZ0aGlzLT5maW5kRWZmZWN0aXZlU3RyYXRlZ3kocHJlZml4KTsKKyAgICBlbnRyeSA9IG1ha2Vfc2hhcmVkPEVudHJ5PihwcmVmaXgpOworICAgIG50ZS0+c2V0U3RyYXRlZ3lDaG9pY2VFbnRyeShlbnRyeSk7CisgICAgKyttX25JdGVtczsKKyAgICBORkRfTE9HX1RSQUNFKCJpbnNlcnQoIiA8PCBwcmVmaXggPDwgIikgbmV3IGVudHJ5ICIgPDwgc3RyYXRlZ3ktPmdldE5hbWUoKSk7CisgIH0KKworICB0aGlzLT5jaGFuZ2VTdHJhdGVneSgqZW50cnksICpvbGRTdHJhdGVneSwgKnN0cmF0ZWd5KTsKKyAgZW50cnktPnNldFN0cmF0ZWd5KCpzdHJhdGVneSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkCitTdHJhdGVneUNob2ljZTo6ZXJhc2UoY29uc3QgTmFtZSYgcHJlZml4KQoreworICBCT09TVF9BU1NFUlQocHJlZml4LnNpemUoKSA+IDApOworCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlID0gbV9uYW1lVHJlZS5maW5kRXhhY3RNYXRjaChwcmVmaXgpOworICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KG50ZSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzaGFyZWRfcHRyPEVudHJ5PiBlbnRyeSA9IG50ZS0+Z2V0U3RyYXRlZ3lDaG9pY2VFbnRyeSgpOworICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkgeworICAgIHJldHVybjsKKyAgfQorCisgIFN0cmF0ZWd5JiBvbGRTdHJhdGVneSA9IGVudHJ5LT5nZXRTdHJhdGVneSgpOworCisgIFN0cmF0ZWd5JiBwYXJlbnRTdHJhdGVneSA9IHRoaXMtPmZpbmRFZmZlY3RpdmVTdHJhdGVneShwcmVmaXguZ2V0UHJlZml4KC0xKSk7CisgIHRoaXMtPmNoYW5nZVN0cmF0ZWd5KCplbnRyeSwgb2xkU3RyYXRlZ3ksIHBhcmVudFN0cmF0ZWd5KTsKKworICBudGUtPnNldFN0cmF0ZWd5Q2hvaWNlRW50cnkoc2hhcmVkX3B0cjxFbnRyeT4oKSk7CisgIG1fbmFtZVRyZWUuZXJhc2VFbnRyeUlmRW1wdHkobnRlKTsKKyAgLS1tX25JdGVtczsKK30KKworc3RkOjpwYWlyPGJvb2wsIE5hbWU+CitTdHJhdGVneUNob2ljZTo6Z2V0KGNvbnN0IE5hbWUmIHByZWZpeCkgY29uc3QKK3sKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBudGUgPSBtX25hbWVUcmVlLmZpbmRFeGFjdE1hdGNoKHByZWZpeCk7CisgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4obnRlKSkgeworICAgIHJldHVybiB7IGZhbHNlLCBOYW1lKCkgfTsKKyAgfQorCisgIHNoYXJlZF9wdHI8RW50cnk+IGVudHJ5ID0gbnRlLT5nZXRTdHJhdGVneUNob2ljZUVudHJ5KCk7CisgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKSB7CisgICAgcmV0dXJuIHsgZmFsc2UsIE5hbWUoKSB9OworICB9CisKKyAgcmV0dXJuIHsgdHJ1ZSwgZW50cnktPmdldFN0cmF0ZWd5KCkuZ2V0TmFtZSgpIH07Cit9CisKK1N0cmF0ZWd5JgorU3RyYXRlZ3lDaG9pY2U6OmZpbmRFZmZlY3RpdmVTdHJhdGVneShjb25zdCBOYW1lJiBwcmVmaXgpIGNvbnN0Cit7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlID0gbV9uYW1lVHJlZS5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKHByZWZpeCwKKyAgICBbXSAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgZW50cnkpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihlbnRyeS5nZXRTdHJhdGVneUNob2ljZUVudHJ5KCkpOworICAgIH0pOworCisgIEJPT1NUX0FTU0VSVChzdGF0aWNfY2FzdDxib29sPihudGUpKTsKKyAgcmV0dXJuIG50ZS0+Z2V0U3RyYXRlZ3lDaG9pY2VFbnRyeSgpLT5nZXRTdHJhdGVneSgpOworfQorCitTdHJhdGVneSYKK1N0cmF0ZWd5Q2hvaWNlOjpmaW5kRWZmZWN0aXZlU3RyYXRlZ3koc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBudGUpIGNvbnN0Cit7CisgIHNoYXJlZF9wdHI8c3RyYXRlZ3lfY2hvaWNlOjpFbnRyeT4gZW50cnkgPSBudGUtPmdldFN0cmF0ZWd5Q2hvaWNlRW50cnkoKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICByZXR1cm4gZW50cnktPmdldFN0cmF0ZWd5KCk7CisKKyAgbnRlID0gbV9uYW1lVHJlZS5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG50ZSwKKyAgICBbXSAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgZW50cnkpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihlbnRyeS5nZXRTdHJhdGVneUNob2ljZUVudHJ5KCkpOworICAgIH0pOworCisgIEJPT1NUX0FTU0VSVChzdGF0aWNfY2FzdDxib29sPihudGUpKTsKKyAgcmV0dXJuIG50ZS0+Z2V0U3RyYXRlZ3lDaG9pY2VFbnRyeSgpLT5nZXRTdHJhdGVneSgpOworfQorCitTdHJhdGVneSYKK1N0cmF0ZWd5Q2hvaWNlOjpmaW5kRWZmZWN0aXZlU3RyYXRlZ3koY29uc3QgcGl0OjpFbnRyeSYgcGl0RW50cnkpIGNvbnN0Cit7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlID0gbV9uYW1lVHJlZS5nZXQocGl0RW50cnkpOworCisgIEJPT1NUX0FTU0VSVChzdGF0aWNfY2FzdDxib29sPihudGUpKTsKKyAgcmV0dXJuIHRoaXMtPmZpbmRFZmZlY3RpdmVTdHJhdGVneShudGUpOworfQorCitTdHJhdGVneSYKK1N0cmF0ZWd5Q2hvaWNlOjpmaW5kRWZmZWN0aXZlU3RyYXRlZ3koY29uc3QgbWVhc3VyZW1lbnRzOjpFbnRyeSYgbWVhc3VyZW1lbnRzRW50cnkpIGNvbnN0Cit7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnRlID0gbV9uYW1lVHJlZS5nZXQobWVhc3VyZW1lbnRzRW50cnkpOworCisgIEJPT1NUX0FTU0VSVChzdGF0aWNfY2FzdDxib29sPihudGUpKTsKKyAgcmV0dXJuIHRoaXMtPmZpbmRFZmZlY3RpdmVTdHJhdGVneShudGUpOworfQorCit2b2lkCitTdHJhdGVneUNob2ljZTo6c2V0RGVmYXVsdFN0cmF0ZWd5KHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5KQoreworICB0aGlzLT5pbnN0YWxsKHN0cmF0ZWd5KTsKKworICAvLyBkb24ndCB1c2UgLmluc2VydCBoZXJlLCBiZWNhdXNlIGl0IHdpbGwgaW52b2tlIGZpbmRFZmZlY3RpdmVTdHJhdGVneQorICAvLyB3aGljaCBleHBlY3RzIGFuIGV4aXN0aW5nIHJvb3QgZW50cnkKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBudGUgPSBtX25hbWVUcmVlLmxvb2t1cChOYW1lKCkpOworICBzaGFyZWRfcHRyPEVudHJ5PiBlbnRyeSA9IG1ha2Vfc2hhcmVkPEVudHJ5PihOYW1lKCkpOworICBudGUtPnNldFN0cmF0ZWd5Q2hvaWNlRW50cnkoZW50cnkpOworICArK21fbkl0ZW1zOworICBORkRfTE9HX0lORk8oInNldERlZmF1bHRTdHJhdGVneSAiIDw8IHN0cmF0ZWd5LT5nZXROYW1lKCkpOworCisgIGVudHJ5LT5zZXRTdHJhdGVneSgqc3RyYXRlZ3kpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NsZWFyU3RyYXRlZ3lJbmZvKGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmIG50ZSkKK3sKKyAgTkZEX0xPR19UUkFDRSgiY2xlYXJTdHJhdGVneUluZm8gIiA8PCBudGUuZ2V0UHJlZml4KCkpOworCisgIGZvciAoY29uc3Qgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiYgcGl0RW50cnkgOiBudGUuZ2V0UGl0RW50cmllcygpKSB7CisgICAgcGl0RW50cnktPmNsZWFyU3RyYXRlZ3lJbmZvKCk7CisgICAgZm9yIChjb25zdCBwaXQ6OkluUmVjb3JkJiBpblJlY29yZCA6IHBpdEVudHJ5LT5nZXRJblJlY29yZHMoKSkgeworICAgICAgY29uc3RfY2FzdDxwaXQ6OkluUmVjb3JkJj4oaW5SZWNvcmQpLmNsZWFyU3RyYXRlZ3lJbmZvKCk7CisgICAgfQorICAgIGZvciAoY29uc3QgcGl0OjpPdXRSZWNvcmQmIG91dFJlY29yZCA6IHBpdEVudHJ5LT5nZXRPdXRSZWNvcmRzKCkpIHsKKyAgICAgIGNvbnN0X2Nhc3Q8cGl0OjpPdXRSZWNvcmQmPihvdXRSZWNvcmQpLmNsZWFyU3RyYXRlZ3lJbmZvKCk7CisgICAgfQorICB9CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihudGUuZ2V0TWVhc3VyZW1lbnRzRW50cnkoKSkpIHsKKyAgICBudGUuZ2V0TWVhc3VyZW1lbnRzRW50cnkoKS0+Y2xlYXJTdHJhdGVneUluZm8oKTsKKyAgfQorfQorCit2b2lkCitTdHJhdGVneUNob2ljZTo6Y2hhbmdlU3RyYXRlZ3koc3RyYXRlZ3lfY2hvaWNlOjpFbnRyeSYgZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnc6OlN0cmF0ZWd5JiBvbGRTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdzo6U3RyYXRlZ3kmIG5ld1N0cmF0ZWd5KQoreworICBpZiAoJm9sZFN0cmF0ZWd5ID09ICZuZXdTdHJhdGVneSkgeworICAgIHJldHVybjsKKyAgfQorCisgIE5GRF9MT0dfSU5GTygiY2hhbmdlU3RyYXRlZ3koIiA8PCBlbnRyeS5nZXRQcmVmaXgoKSA8PCAiKSIKKyAgICAgICAgICAgICAgIDw8ICIgZnJvbSAiIDw8IG9sZFN0cmF0ZWd5LmdldE5hbWUoKQorICAgICAgICAgICAgICAgPDwgIiB0byAiIDw8IG5ld1N0cmF0ZWd5LmdldE5hbWUoKSk7CisKKyAgLy8gcmVzZXQgU3RyYXRlZ3lJbmZvIG9uIGEgcG9ydGlvbiBvZiBOYW1lVHJlZSwKKyAgLy8gd2hlcmUgZW50cnkncyBlZmZlY3RpdmUgc3RyYXRlZ3kgaXMgY292ZXJlZCBieSB0aGUgY2hhbmdpbmcgU3RyYXRlZ3lDaG9pY2UgZW50cnkKKyAgY29uc3QgbmFtZV90cmVlOjpFbnRyeSogcm9vdE50ZSA9IG1fbmFtZVRyZWUuZ2V0KGVudHJ5KS5nZXQoKTsKKyAgYXV0byYmIG50Q2hhbmdlZCA9IG1fbmFtZVRyZWUucGFydGlhbEVudW1lcmF0ZShlbnRyeS5nZXRQcmVmaXgoKSwKKyAgICBbJnJvb3ROdGVdIChjb25zdCBuYW1lX3RyZWU6OkVudHJ5JiBudGUpIC0+IHN0ZDo6cGFpcjxib29sLCBib29sPiB7CisgICAgICBpZiAoJm50ZSA9PSByb290TnRlKSB7CisgICAgICAgIHJldHVybiB7dHJ1ZSwgdHJ1ZX07CisgICAgICB9CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obnRlLmdldFN0cmF0ZWd5Q2hvaWNlRW50cnkoKSkpIHsKKyAgICAgICAgcmV0dXJuIHtmYWxzZSwgZmFsc2V9OworICAgICAgfQorICAgICAgcmV0dXJuIHt0cnVlLCB0cnVlfTsKKyAgICB9KTsKKyAgZm9yIChjb25zdCBuYW1lX3RyZWU6OkVudHJ5JiBudGUgOiBudENoYW5nZWQpIHsKKyAgICBjbGVhclN0cmF0ZWd5SW5mbyhudGUpOworICB9Cit9CisKK1N0cmF0ZWd5Q2hvaWNlOjpjb25zdF9pdGVyYXRvcgorU3RyYXRlZ3lDaG9pY2U6OmJlZ2luKCkgY29uc3QKK3sKKyAgYXV0byYmIGVudW1lcmFibGUgPSBtX25hbWVUcmVlLmZ1bGxFbnVtZXJhdGUoCisgICAgW10gKGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmIGVudHJ5KSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkuZ2V0U3RyYXRlZ3lDaG9pY2VFbnRyeSgpKTsKKyAgICB9KTsKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGVudW1lcmFibGUuYmVnaW4oKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9zdHJhdGVneS1jaG9pY2UuaHBwIGIvTkZEL2RhZW1vbi90YWJsZS9zdHJhdGVneS1jaG9pY2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmYzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWNob2ljZS5ocHAKQEAgLTAsMCArMSwyMzcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX0RBRU1PTl9UQUJMRV9TVFJBVEVHWV9DSE9JQ0VfSFBQCisjZGVmaW5lIE5GRF9EQUVNT05fVEFCTEVfU1RSQVRFR1lfQ0hPSUNFX0hQUAorCisjaW5jbHVkZSAic3RyYXRlZ3ktY2hvaWNlLWVudHJ5LmhwcCIKKyNpbmNsdWRlICJuYW1lLXRyZWUuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKKworLyoqIFxicmllZiByZXByZXNlbnRzIHRoZSBTdHJhdGVneSBDaG9pY2UgdGFibGUKKyAqCisgKiAgVGhlIFN0cmF0ZWd5IENob2ljZSB0YWJsZSBtYWludGFpbnMgYXZhaWxhYmxlIFN0cmF0ZWd5IHR5cGVzLAorICogIGFuZCBhc3NvY2lhdGVzIE5hbWUgcHJlZml4ZXMgd2l0aCBTdHJhdGVneSB0eXBlcy4KKyAqCisgKiAgRWFjaCBzdHJhdGVneSBpcyBpZGVudGlmaWVkIGJ5IGEgc3RyYXRlZ3lOYW1lLgorICogIEl0J3MgcmVjb21tZW5kZWQgdG8gaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIGFzIHRoZSBsYXN0IGNvbXBvbmVudCBvZiBzdHJhdGVneU5hbWUuCisgKgorICogIEEgTmFtZSBwcmVmaXggaXMgb3duZWQgYnkgYSBzdHJhdGVneSBpZiBhIGxvbmdlc3QgcHJlZml4IG1hdGNoIG9uIHRoZQorICogIFN0cmF0ZWd5IENob2ljZSB0YWJsZSByZXR1cm5zIHRoYXQgc3RyYXRlZ3kuCisgKi8KK2NsYXNzIFN0cmF0ZWd5Q2hvaWNlIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgU3RyYXRlZ3lDaG9pY2UoTmFtZVRyZWUmIG5hbWVUcmVlLCBzaGFyZWRfcHRyPGZ3OjpTdHJhdGVneT4gZGVmYXVsdFN0cmF0ZWd5KTsKKworcHVibGljOiAvLyBhdmFpbGFibGUgU3RyYXRlZ3kgdHlwZXMKKyAgLyoqIFxicmllZiBkZXRlcm1pbmVzIGlmIGEgc3RyYXRlZ3kgaXMgaW5zdGFsbGVkCisgICAqICBccGFyYW0gaXNFeGFjdCB0cnVlIHRvIHJlcXVpcmUgZXhhY3QgbWF0Y2gsIGZhbHNlIHRvIHBlcm1pdCB1bnZlcnNpb25lZCBzdHJhdGVneU5hbWUKKyAgICogIFxyZXR1cm4gdHJ1ZSBpZiBzdHJhdGVneSBpcyBpbnN0YWxsZWQKKyAgICovCisgIGJvb2wKKyAgaGFzU3RyYXRlZ3koY29uc3QgTmFtZSYgc3RyYXRlZ3lOYW1lLCBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBpbnN0YWxsIGEgc3RyYXRlZ3kKKyAgICogIFxyZXR1cm4gdHJ1ZSBpZiBpbnN0YWxsZWQ7IGZhbHNlIGlmIG5vdCBpbnN0YWxsZWQgZHVlIHRvIGR1cGxpY2F0ZSBzdHJhdGVneU5hbWUKKyAgICogIFxub3RlIHNoYXJlZF9wdHIgaXMgcGFzc2VkIGJ5IHZhbHVlIGJlY2F1c2UgU3RyYXRlZ3lDaG9pY2UgdGFrZXMgb3duZXJzaGlwIG9mIHN0cmF0ZWd5CisgICAqLworICBib29sCisgIGluc3RhbGwoc2hhcmVkX3B0cjxmdzo6U3RyYXRlZ3k+IHN0cmF0ZWd5KTsKKworcHVibGljOiAvLyBTdHJhdGVneSBDaG9pY2UgdGFibGUKKyAgLyoqIFxicmllZiBzZXQgc3RyYXRlZ3kgb2YgcHJlZml4IHRvIGJlIHN0cmF0ZWd5TmFtZQorICAgKiAgXHBhcmFtIHN0cmF0ZWd5TmFtZSB0aGUgc3RyYXRlZ3kgdG8gYmUgdXNlZAorICAgKiAgXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKKyAgICoKKyAgICogIFRoaXMgbWV0aG9kIHNldCBhIHN0cmF0ZWd5IG9udG8gYSBOYW1lIHByZWZpeC4KKyAgICogIFRoZSBzdHJhdGVneSBtdXN0IGhhdmUgYmVlbiBpbnN0YWxsZWQuCisgICAqICBUaGUgc3RyYXRlZ3lOYW1lIGNhbiBlaXRoZXIgYmUgZXhhY3QgKGNvbnRhaW5zIHZlcnNpb24gY29tcG9uZW50KSwKKyAgICogIG9yIG9taXQgdGhlIHZlcnNpb24gY29tcG9uZW50IHRvIHBpY2sgdGhlIGxhdGVzdCB2ZXJzaW9uLgorICAgKi8KKyAgYm9vbAorICBpbnNlcnQoY29uc3QgTmFtZSYgcHJlZml4LCBjb25zdCBOYW1lJiBzdHJhdGVneU5hbWUpOworCisgIC8qKiBcYnJpZWYgbWFrZSBwcmVmaXggdG8gaW5oZXJpdCBzdHJhdGVneSBmcm9tIGl0cyBwYXJlbnQKKyAgICoKKyAgICogIG5vdCBhbGxvd2VkIGZvciByb290IHByZWZpeCAobmRuOi8pCisgICAqLworICB2b2lkCisgIGVyYXNlKGNvbnN0IE5hbWUmIHByZWZpeCk7CisKKyAgLyoqIFxicmllZiBnZXQgc3RyYXRlZ3kgTmFtZSBvZiBwcmVmaXgKKyAgICogIFxyZXR1cm4gdHJ1ZSBhbmQgc3RyYXRlZ3lOYW1lIGF0IGV4YWN0IG1hdGNoLCBvciBmYWxzZQorICAgKi8KKyAgc3RkOjpwYWlyPGJvb2wsIE5hbWU+CisgIGdldChjb25zdCBOYW1lJiBwcmVmaXgpIGNvbnN0OworCitwdWJsaWM6IC8vIGVmZmVjdGl2ZSBzdHJhdGVneQorICAvLy8gZ2V0IGVmZmVjdGl2ZSBzdHJhdGVneSBmb3IgcHJlZml4CisgIGZ3OjpTdHJhdGVneSYKKyAgZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KGNvbnN0IE5hbWUmIHByZWZpeCkgY29uc3Q7CisKKyAgLy8vIGdldCBlZmZlY3RpdmUgc3RyYXRlZ3kgZm9yIHBpdEVudHJ5CisgIGZ3OjpTdHJhdGVneSYKKyAgZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KGNvbnN0IHBpdDo6RW50cnkmIHBpdEVudHJ5KSBjb25zdDsKKworICAvLy8gZ2V0IGVmZmVjdGl2ZSBzdHJhdGVneSBmb3IgbWVhc3VyZW1lbnRzRW50cnkKKyAgZnc6OlN0cmF0ZWd5JgorICBmaW5kRWZmZWN0aXZlU3RyYXRlZ3koY29uc3QgbWVhc3VyZW1lbnRzOjpFbnRyeSYgbWVhc3VyZW1lbnRzRW50cnkpIGNvbnN0OworCitwdWJsaWM6IC8vIGVudW1lcmF0aW9uCisgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb25zdCBzdHJhdGVneV9jaG9pY2U6OkVudHJ5PgorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIGNvbnN0X2l0ZXJhdG9yKGNvbnN0IE5hbWVUcmVlOjpjb25zdF9pdGVyYXRvciYgaXQpOworCisgICAgfmNvbnN0X2l0ZXJhdG9yKCk7CisKKyAgICBjb25zdCBzdHJhdGVneV9jaG9pY2U6OkVudHJ5JgorICAgIG9wZXJhdG9yKigpIGNvbnN0OworCisgICAgc2hhcmVkX3B0cjxzdHJhdGVneV9jaG9pY2U6OkVudHJ5PgorICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKworICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgIG9wZXJhdG9yKysoKTsKKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgb3BlcmF0b3IrKyhpbnQpOworCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKKworICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3IgbV9uYW1lVHJlZUl0ZXJhdG9yOworICB9OworCisgIC8vLyBudW1iZXIgb2YgZW50cmllcyBzdG9yZWQKKyAgc2l6ZV90CisgIHNpemUoKSBjb25zdDsKKworICBjb25zdF9pdGVyYXRvcgorICBiZWdpbigpIGNvbnN0OworCisgIGNvbnN0X2l0ZXJhdG9yCisgIGVuZCgpIGNvbnN0OworCitwcml2YXRlOgorICAvKiogXGJyaWVmIGdldCBTdHJhdGVneSBpbnN0YW5jZSBieSBzdHJhdGVneU5hbWUKKyAgICogIFxwYXJhbSBzdHJhdGVneU5hbWUgYSB2ZXJzaW9uZWQgb3IgdW52ZXJzaW9uZWQgc3RyYXRlZ3lOYW1lCisgICAqLworICBmdzo6U3RyYXRlZ3kqCisgIGdldFN0cmF0ZWd5KGNvbnN0IE5hbWUmIHN0cmF0ZWd5TmFtZSkgY29uc3Q7CisKKyAgdm9pZAorICBzZXREZWZhdWx0U3RyYXRlZ3koc2hhcmVkX3B0cjxmdzo6U3RyYXRlZ3k+IHN0cmF0ZWd5KTsKKworICB2b2lkCisgIGNoYW5nZVN0cmF0ZWd5KHN0cmF0ZWd5X2Nob2ljZTo6RW50cnkmIGVudHJ5LAorICAgICAgICAgICAgICAgICBmdzo6U3RyYXRlZ3kmIG9sZFN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICBmdzo6U3RyYXRlZ3kmIG5ld1N0cmF0ZWd5KTsKKworICBmdzo6U3RyYXRlZ3kmCisgIGZpbmRFZmZlY3RpdmVTdHJhdGVneShzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG50ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgIE5hbWVUcmVlJiBtX25hbWVUcmVlOworICBzaXplX3QgbV9uSXRlbXM7CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxOYW1lLCBzaGFyZWRfcHRyPGZ3OjpTdHJhdGVneT4gPiBTdHJhdGVneUluc3RhbmNlVGFibGU7CisgIFN0cmF0ZWd5SW5zdGFuY2VUYWJsZSBtX3N0cmF0ZWd5SW5zdGFuY2VzOworfTsKKworaW5saW5lIHNpemVfdAorU3RyYXRlZ3lDaG9pY2U6OnNpemUoKSBjb25zdAoreworICByZXR1cm4gbV9uSXRlbXM7Cit9CisKK2lubGluZSBTdHJhdGVneUNob2ljZTo6Y29uc3RfaXRlcmF0b3IKK1N0cmF0ZWd5Q2hvaWNlOjplbmQoKSBjb25zdAoreworICByZXR1cm4gY29uc3RfaXRlcmF0b3IobV9uYW1lVHJlZS5lbmQoKSk7Cit9CisKK2lubGluZQorU3RyYXRlZ3lDaG9pY2U6OmNvbnN0X2l0ZXJhdG9yOjpjb25zdF9pdGVyYXRvcihjb25zdCBOYW1lVHJlZTo6Y29uc3RfaXRlcmF0b3ImIGl0KQorICA6IG1fbmFtZVRyZWVJdGVyYXRvcihpdCkKK3sKK30KKworaW5saW5lCitTdHJhdGVneUNob2ljZTo6Y29uc3RfaXRlcmF0b3I6On5jb25zdF9pdGVyYXRvcigpCit7Cit9CisKK2lubGluZQorU3RyYXRlZ3lDaG9pY2U6OmNvbnN0X2l0ZXJhdG9yCitTdHJhdGVneUNob2ljZTo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoaW50KQoreworICBTdHJhdGVneUNob2ljZTo6Y29uc3RfaXRlcmF0b3IgdGVtcCgqdGhpcyk7CisgICsrKCp0aGlzKTsKKyAgcmV0dXJuIHRlbXA7Cit9CisKK2lubGluZSBTdHJhdGVneUNob2ljZTo6Y29uc3RfaXRlcmF0b3ImCitTdHJhdGVneUNob2ljZTo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreworICArK21fbmFtZVRyZWVJdGVyYXRvcjsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgY29uc3Qgc3RyYXRlZ3lfY2hvaWNlOjpFbnRyeSYKK1N0cmF0ZWd5Q2hvaWNlOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sKKyAgcmV0dXJuICoobV9uYW1lVHJlZUl0ZXJhdG9yLT5nZXRTdHJhdGVneUNob2ljZUVudHJ5KCkpOworfQorCitpbmxpbmUgc2hhcmVkX3B0cjxzdHJhdGVneV9jaG9pY2U6OkVudHJ5PgorU3RyYXRlZ3lDaG9pY2U6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fbmFtZVRyZWVJdGVyYXRvci0+Z2V0U3RyYXRlZ3lDaG9pY2VFbnRyeSgpOworfQorCitpbmxpbmUgYm9vbAorU3RyYXRlZ3lDaG9pY2U6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IFN0cmF0ZWd5Q2hvaWNlOjpjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBtX25hbWVUcmVlSXRlcmF0b3IgPT0gb3RoZXIubV9uYW1lVHJlZUl0ZXJhdG9yOworfQorCitpbmxpbmUgYm9vbAorU3RyYXRlZ3lDaG9pY2U6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IFN0cmF0ZWd5Q2hvaWNlOjpjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBtX25hbWVUcmVlSXRlcmF0b3IgIT0gb3RoZXIubV9uYW1lVHJlZUl0ZXJhdG9yOworfQorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9EQUVNT05fVEFCTEVfU1RSQVRFR1lfQ0hPSUNFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL2RhZW1vbi90YWJsZS9zdHJhdGVneS1pbmZvLWhvc3QuY3BwIGIvTkZEL2RhZW1vbi90YWJsZS9zdHJhdGVneS1pbmZvLWhvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjFjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWluZm8taG9zdC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInN0cmF0ZWd5LWluZm8taG9zdC5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworCit2b2lkCitTdHJhdGVneUluZm9Ib3N0OjpjbGVhclN0cmF0ZWd5SW5mbygpCit7CisgIG1faXRlbXMuY2xlYXIoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWluZm8taG9zdC5ocHAgYi9ORkQvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWluZm8taG9zdC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2ZDk0MAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kYWVtb24vdGFibGUvc3RyYXRlZ3ktaW5mby1ob3N0LmhwcApAQCAtMCwwICsxLDExOSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfREFFTU9OX1RBQkxFX1NUUkFURUdZX0lORk9fSE9TVF9IUFAKKyNkZWZpbmUgTkZEX0RBRU1PTl9UQUJMRV9TVFJBVEVHWV9JTkZPX0hPU1RfSFBQCisKKyNpbmNsdWRlICJmdy9zdHJhdGVneS1pbmZvLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CisKKy8qKiBcYnJpZWYgYmFzZSBjbGFzcyBmb3IgYW4gZW50aXR5IG9udG8gd2hpY2ggU3RyYXRlZ3lJbmZvIG9iamVjdHMgbWF5IGJlIHBsYWNlZAorICovCitjbGFzcyBTdHJhdGVneUluZm9Ib3N0Cit7CitwdWJsaWM6CisgIC8qKiBcYnJpZWYgZ2V0IGEgU3RyYXRlZ3lJbmZvIGl0ZW0KKyAgICogIFx0cGFyYW0gVCB0eXBlIG9mIFN0cmF0ZWd5SW5mbywgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIGZyb20gbmZkOjpmdzo6U3RyYXRlZ3lJbmZvCisgICAqICBccmV0dmFsIG51bGxwdHIgaWYgbm8gU3RyYXRlZ3lJbmZvIG9mIHR5cGUgVCBpcyBzdG9yZWQKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHNoYXJlZF9wdHI8VD4KKyAgZ2V0U3RyYXRlZ3lJbmZvKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBzZXQgYSBTdHJhdGVneUluZm8gaXRlbQorICAgKiAgXHRwYXJhbSBUIHR5cGUgb2YgU3RyYXRlZ3lJbmZvLCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgZnJvbSBuZmQ6OmZ3OjpTdHJhdGVneUluZm8KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQKKyAgc2V0U3RyYXRlZ3lJbmZvKHNoYXJlZF9wdHI8VD4gc3RyYXRlZ3lJbmZvKTsKKworICAvKiogXGJyaWVmIGdldCBvciBjcmVhdGUgYSBTdHJhdGVneUluZm8gaXRlbQorICAgKiAgXHRwYXJhbSBUIHR5cGUgb2YgU3RyYXRlZ3lJbmZvLCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgZnJvbSBuZmQ6OmZ3OjpTdHJhdGVneUluZm8KKyAgICoKKyAgICogIElmIG5vIFN0cmF0ZWd5SW5mbyBvZiB0eXBlIFQgaXMgc3RvcmVkLCBpdCdzIGNyZWF0ZWQgd2l0aCBccHthcmdzfTsKKyAgICogIG90aGVyd2lzZSwgdGhlIGV4aXN0aW5nIGl0ZW0gaXMgcmV0dXJuZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BPgorICBzaGFyZWRfcHRyPFQ+CisgIGdldE9yQ3JlYXRlU3RyYXRlZ3lJbmZvKEEmJi4uLiBhcmdzKTsKKworICAvKiogXGJyaWVmIGNsZWFyIGFsbCBTdHJhdGVneUluZm8gaXRlbXMKKyAgICovCisgIHZvaWQKKyAgY2xlYXJTdHJhdGVneUluZm8oKTsKKworcHJpdmF0ZToKKyAgc3RkOjptYXA8aW50LCBzaGFyZWRfcHRyPGZ3OjpTdHJhdGVneUluZm8+PiBtX2l0ZW1zOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc2hhcmVkX3B0cjxUPgorU3RyYXRlZ3lJbmZvSG9zdDo6Z2V0U3RyYXRlZ3lJbmZvKCkgY29uc3QKK3sKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8Znc6OlN0cmF0ZWd5SW5mbywgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJUIG11c3QgaW5oZXJpdCBmcm9tIFN0cmF0ZWd5SW5mbyIpOworCisgIGF1dG8gaXQgPSBtX2l0ZW1zLmZpbmQoVDo6Z2V0VHlwZUlkKCkpOworICBpZiAoaXQgPT0gbV9pdGVtcy5lbmQoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBzdGF0aWNfcG9pbnRlcl9jYXN0PFQsIGZ3OjpTdHJhdGVneUluZm8+KGl0LT5zZWNvbmQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZAorU3RyYXRlZ3lJbmZvSG9zdDo6c2V0U3RyYXRlZ3lJbmZvKHNoYXJlZF9wdHI8VD4gaXRlbSkKK3sKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8Znc6OlN0cmF0ZWd5SW5mbywgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJUIG11c3QgaW5oZXJpdCBmcm9tIFN0cmF0ZWd5SW5mbyIpOworCisgIGlmIChpdGVtID09IG51bGxwdHIpIHsKKyAgICBtX2l0ZW1zLmVyYXNlKFQ6OmdldFR5cGVJZCgpKTsKKyAgfQorICBlbHNlIHsKKyAgICBtX2l0ZW1zW1Q6OmdldFR5cGVJZCgpXSA9IGl0ZW07CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQT4KK3NoYXJlZF9wdHI8VD4KK1N0cmF0ZWd5SW5mb0hvc3Q6OmdldE9yQ3JlYXRlU3RyYXRlZ3lJbmZvKEEmJi4uLiBhcmdzKQoreworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxmdzo6U3RyYXRlZ3lJbmZvLCBUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIlQgbXVzdCBpbmhlcml0IGZyb20gU3RyYXRlZ3lJbmZvIik7CisKKyAgc2hhcmVkX3B0cjxUPiBpdGVtID0gdGhpcy0+Z2V0U3RyYXRlZ3lJbmZvPFQ+KCk7CisgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oaXRlbSkpIHsKKyAgICBpdGVtID0gbWFrZV9zaGFyZWQ8VD4oc3RkOjpmb3J3YXJkPEE+KGFyZ3MpLi4uKTsKKyAgICB0aGlzLT5zZXRTdHJhdGVneUluZm8oaXRlbSk7CisgIH0KKyAgcmV0dXJuIGl0ZW07Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX0RBRU1PTl9UQUJMRV9TVFJBVEVHWV9JTkZPX0hPU1RfSFBQCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9GQVEucnN0IGIvTkZEL2RvY3MvRkFRLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzA5ZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvRkFRLnJzdApAQCAtMCwwICsxLDIyMSBAQAorRkFRCis9PT0KKworSG93IHRvIGNoYW5nZSBkZWZhdWx0IHBhdGhzPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQYXRocyB0byB3aGVyZSBORkQgaXMgaW5zdGFsbGVkIGNhbiBiZSBjb25maWd1cmVkIGR1cmluZyBgYC4vd2FmCitjb25maWd1cmVgYDoKKworLSBJbnN0YWxsYXRpb24gcHJlZml4IChkZWZhdWx0IGBgL3Vzci9sb2NhbGBgKToKKworICAgIDo6CisKKyAgICAgICAgLi93YWYgY29uZmlndXJlIC0tcHJlZml4PS91c3IKKworLSBMb2NhdGlvbiBvZiBORkQgY29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiBgYCR7cHJlZml4fS9ldGNgYCk6CisKKyAgICA6OgorCisgICAgICAgIC4vd2FmIGNvbmZpZ3VyZSAtLXByZWZpeD0vdXNyIC0tc3lzY29uZmRpcj0vZXRjCisKKy0gTG9jYXRpb24gb2YgbWFucGFnZXMgKGRlZmF1bHQ6IGBgJHtwcmVmaXh9L3NoYXJlL21hbmBgKQorCisgICAgOjoKKworICAgICAgICAuL3dhZiBjb25maWd1cmUgLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YyAtLW1hbmRpcj0vdXNyL3NoYXJlL21hbgorCitIb3cgdG8gcnVuIE5GRCBvbiBSYXNwYmVycnkgUGk/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJ1biBORkQgb24gdGhlIFJhc3BiZXJyeSBQaSwgeW91IG5lZWQgdG8gZWl0aGVyIGVuYWJsZSBJUHY2IHN1cHBvcnQKK2luIFJhc3BiZXJyeSBQaSBvciBkaXNhYmxlIElQdjYgc3VwcG9ydCBpbiBORkQuCisKK1RvIGVuYWJsZSBJUHY2IGluIFJhc3BiZXJyeSBQaToKKworOjoKKworICAgIHN1ZG8gbW9kcHJvYmUgaXB2NgorCitUbyBkaXNhYmxlIElQdjYgaW4gTkZELCByZXBsYWNlIGBgZW5hYmxlX3Y2IHllc2BgIHdpdGggYGBlbmFibGVfdjYgbm9gYAoraW4gYGB0Y3BgYCBhbmQgYGB1ZHBgYCBzZWN0aW9ucyBvZiBgYC91c3IvbG9jYWwvZXRjL25kbi9uZmQuY29uZmBgOgorCis6OgorCisgICAgLi4uCisgICAgdGNwCisgICAgeworICAgICAgbGlzdGVuIHllcworICAgICAgcG9ydCA2MzYzCisgICAgICBlbmFibGVfdjQgeWVzCisgICAgICBlbmFibGVfdjYgbm8KKyAgICB9CisKKyAgICB1ZHAKKyAgICB7CisgICAgICBwb3J0IDYzNjMKKyAgICAgIGVuYWJsZV92NCB5ZXMKKyAgICAgIGVuYWJsZV92NiBubworICAgICAgaWRsZV90aW1lb3V0IDYwMAorICAgICAga2VlcF9hbGl2ZV9pbnRlcnZhbCAyNQorCisgICAgICBtY2FzdCB5ZXMKKyAgICAgIG1jYXN0X3BvcnQgNTYzNjMKKyAgICAgIG1jYXN0X2dyb3VwIDIyNC4wLjIzLjE3MAorICAgIH0KKyAgICAuLi4KKworCitIb3cgdG8gcnVuIE5GRCBhcyBub24tcm9vdCB1c2VyPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSG93IHRvIGNvbmZpZ3VyZSBhdXRvbWF0aWMgZHJvcHBpbmcgb2YgcHJpdmlsZWdlcz8KKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisKK05GRCBjYW4gYmUgY29uZmlndXJlZCB0byBkcm9wIHByaXZpbGVnZXMgd2hlbmV2ZXIgcG9zc2libGUuICBZb3UgY2FuIHNwZWNpZnkgYSB1c2VyIGFuZC9vcgorZ3JvdXAgZm9yIE5GRCB0byBjaGFuZ2UgaXRzICplZmZlY3RpdmUqIHVzZXIvZ3JvdXAgSUQgdG8gaW4gdGhlIGBgZ2VuZXJhbGBgIHNlY3Rpb24gb2YgdGhlCitjb25maWd1cmF0aW9uIGZpbGUuIEZvciBleGFtcGxlOgorCis6OgorCisgICAgZ2VuZXJhbAorICAgIHsKKyAgICAgIHVzZXIgbm9ib2R5CisgICAgICBncm91cCBub2dyb3VwCisgICAgfQorCit3aWxsIGNvbmZpZ3VyZSBORkQgdG8gZHJvcCBpdHMgZWZmZWN0aXZlIHVzZXIgYW5kIGdyb3VwIElEcyB0byBgYG5vYm9keWBgIGFuZCBgYG5vZ3JvdXBgYCwKK3Jlc3BlY3RpdmVseS4KKworLi4gbm90ZTo6CisKKyAgICAqKklNUE9SVEFOVDoqKiBORkQgbWF5IHJlZ2FpbiBlbGV2YXRlZCBwZXJtaXNzaW9ucyBhcyBuZWVkZWQgZHVyaW5nIG5vcm1hbAorICAgIGV4ZWN1dGlvbi4gRHJvcHBpbmcgcHJpdmlsZWdlcyBpbiB0aGlzIG1hbm5lciBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYSBzZWN1cml0eQorICAgIG1lY2hhbmlzbSAoYSBjb21wcm9taXNlZCBORkQgdGhhdCB3YXMgc3RhcnRlZCBhcyByb290IGNhbiB0cml2aWFsbHkgcmV0dXJuIHRvCisgICAgcm9vdCkuIEhvd2V2ZXIsIHJlZHVjaW5nIHByaXZpbGVnZXMgbWF5IGxpbWl0IGFueSBkYW1hZ2VkIGNhdXNlZCBieSB3ZWxsIGludGVudGlvbmVkLAorICAgIGJ1dCBidWdneSwgY29kZS4KKworCitIb3cgdG8gZW5hYmxlIEV0aGVybmV0IEZhY2UgU3VwcG9ydD8KKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworCitUaGUgYGBldGhlcmBgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uIGNvbnRhaW5zIHNldHRpbmdzIGZvciBFdGhlcm5ldCBmYWNlcyBhbmQKK2NoYW5uZWxzLiBUaGVzZSBzZXR0aW5ncyB3aWxsICoqTk9UKiogd29yayB3aXRob3V0IHJvb3Qgb3Igc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUKK3Blcm1pc3Npb25zOgorCis6OgorCisgICAgc3VkbyBzZXRjYXAgY2FwX25ldF9yYXcsY2FwX25ldF9hZG1pbj1laXAgL2Z1bGwvcGF0aC9uZmQKKworWW91IG1heSBuZWVkIHRvIGluc3RhbGwgYSBwYWNrYWdlIHRvIHVzZSBzZXRjYXA6CisKKyoqVWJ1bnR1OioqCisKKzo6CisKKyAgICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJjYXAyLWJpbgorCisqKk1hYyBPUyBYOioqCisKKzo6CisKKyAgICBjdXJsIGh0dHBzOi8vYnVncy53aXJlc2hhcmsub3JnL2J1Z3ppbGxhL2F0dGFjaG1lbnQuY2dpP2lkPTMzNzMgLW8gQ2htb2RCUEYudGFyLmd6CisgICAgdGFyIHp4dmYgQ2htb2RCUEYudGFyLmd6CisgICAgb3BlbiBDaG1vZEJQRi9JbnN0YWxsXCBDaG1vZEJQRi5hcHAKKworb3IgbWFudWFsbHk6CisKKzo6CisKKyAgICBzdWRvIGNoZ3JwIGFkbWluIC9kZXYvYnBmKgorICAgIHN1ZG8gY2htb2QgZytydyAvZGV2L2JwZioKKworSG93IHRvIGVuYWJsZSBVRFAgbXVsdGljYXN0IHN1cHBvcnQgaW4gbXVsdGktaG9tZWQgTGludXggbWFjaGluZXMKKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisKK1RoZSBVRFAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24gY29udGFpbnMgc2V0dGluZ3MgZm9yIHVuaWNhc3QgYW5kIG11bHRpY2FzdCBVRFAKK2ZhY2VzLiBJZiB0aGUgTGludXggYm94IGlzIGVxdWlwcGVkIHdpdGggbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2VzIHdpdGggbXVsdGljYXN0CitjYXBhYmlsaXRpZXMsIHRoZSBzZXR0aW5ncyBmb3IgbXVsdGljYXN0IGZhY2VzIHdpbGwgKipOT1QqKiB3b3JrIHdpdGhvdXQgcm9vdAorb3Igc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnM6CisKKzo6CisKKyAgICBzdWRvIHNldGNhcCBjYXBfbmV0X3Jhdz1laXAgL2Z1bGwvcGF0aC9uZmQKKworLi4gX0hvdyB0byBjb25maWd1cmUgTkZEIHNlY3VyaXR5OgorCitIb3cgdG8gY29uZmlndXJlIE5GRCBzZWN1cml0eT8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBub3RlOjogU2FtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZSBvZiBORkQgYWxsb3cgYW55IHVzZXIgdG8gbWFuYWdlIGZhY2VzLCBGSUIsIFJJQiwgYW5kCisgICAgU3RyYXRlZ3lDaG9pY2UuICBUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IGNlcnRhaW4gb3BlcmF0aW9ucworICAgIHRvIGNlcnRhaW4gdXNlcnMuCisKKyAgICBNb3JlIGV4dGVuc2l2ZSBkb2N1bWVudGF0aW9uIGFib3V0IE5GRCdzIHNlY3VyaXR5IGFuZCBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0cnVzdCBtb2RlbAorICAgIGZvciBORkQgaXMgY3VycmVudGx5IGluIHByZXBhcmF0aW9uLgorCitNYW55IE5GRCBtYW5hZ2VtZW50IHByb3RvY29scyByZXF1aXJlIHNpZ25lZCBjb21tYW5kcyB0byBiZSBwcm9jZXNzZWQKKyhlLmcuIEZJQiBtb2RpZmljYXRpb24sIEZhY2UgY3JlYXRpb24vZGVzdHJ1Y3Rpb25zLCBldGMuKS4gWW91IHdpbGwgbmVlZAorYW4gTkROIGNlcnRpZmljYXRlIHRvIHVzZSBhbnkgYXBwbGljYXRpb24gdGhhdCBpc3N1ZXMgc2lnbmVkIGNvbW1hbmRzLgorCitJZiB5b3UgZG8gbm90IGFscmVhZHkgaGF2ZSBORE4gY2VydGlmaWNhdGUsIHlvdSBjYW4gZ2VuZXJhdGUgb25lIHdpdGgKK3RoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyoqR2VuZXJhdGUgYW5kIGluc3RhbGwgYSBzZWxmLXNpZ25lZCBpZGVudGl0eSBjZXJ0aWZpY2F0ZSoqOgorCis6OgorCisgICAgbmRuc2VjLWtleWdlbiAvYHdob2FtaWAgfCBuZG5zZWMtaW5zdGFsbC1jZXJ0IC0KKworTm90ZSB0aGF0IHRoZSBhcmd1bWVudCB0byBuZG5zZWMta2V5IHdpbGwgYmUgdGhlIGlkZW50aXR5IG5hbWUgb2YgdGhlCituZXcga2V5IChpbiB0aGlzIGNhc2UsIGBgL3lvdXItdXNlcm5hbWVgYCkuIElkZW50aXR5IG5hbWVzIGFyZQoraGllcmFyY2hpY2FsIE5ETiBuYW1lcyBhbmQgbWF5IGhhdmUgbXVsdGlwbGUgY29tcG9uZW50cyAoZS5nLgorYGAvbmRuL3VjbGEvZWR1L2FsaWNlYGApLiBZb3UgbWF5IGNyZWF0ZSBhZGRpdGlvbmFsIGtleXMgYW5kIGlkZW50aXRpZXMKK2FzIHlvdSBzZWUgZml0LgorCisqKkR1bXAgdGhlIE5ETiBjZXJ0aWZpY2F0ZSB0byBhIGZpbGUqKjoKKworVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhc3N1bWUgdGhhdCB5b3UgaGF2ZSBub3QgbW9kaWZpZWQgYGBQUkVGSVhgYCBvcgorYGBTWVNDT05GRElSYGAgSWYgeW91IGhhdmUsIHBsZWFzZSBzdWJzdGl0dXRlIGBgL3Vzci9sb2NhbC9ldGNgYCBmb3IgdGhlCithcHByb3ByaWF0ZSB2YWx1ZSAodGhlIG92ZXJyaWRlbiBgYFNZU0NPTkZESVJgYCBvciBgYFBSRUZJWC9ldGNgYCBpZiB5b3UKK2NoYW5nZWQgYGBQUkVGSVhgYCkuCisKKzo6CisKKyAgICBzdWRvIG1rZGlyIC1wIC91c3IvbG9jYWwvZXRjL25kbi9rZXlzCisgICAgbmRuc2VjLWNlcnQtZHVtcCAtaSAvYHdob2FtaWAgPiBkZWZhdWx0Lm5kbmNlcnQKKyAgICBzdWRvIG12IGRlZmF1bHQubmRuY2VydCAvdXNyL2xvY2FsL2V0Yy9uZG4va2V5cy9kZWZhdWx0Lm5kbmNlcnQKKworLi4gX0hvdyB0byBzdGFydCB1c2luZyBORE4gTWFjUG9ydHMgcmVwb3NpdG9yeSBvbiBPU1g6CisKK0hvdyB0byBzdGFydCB1c2luZyBORE4gTWFjUG9ydHMgcmVwb3NpdG9yeSBvbiBPU1g/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQbGVhc2Ugc2VlIDpyZWY6YEluc3RhbGwgTkZEIFVzaW5nIHRoZSBORE4gTWFjUG9ydHMgUmVwb3NpdG9yeSBvbiBPUyBYYC4KKworLi4gX0hvdyB0byBzdGFydCB1c2luZyBORE4gUFBBIHJlcG9zaXRvcnkgb24gVWJ1bnR1IExpbnV4OgorCitIb3cgdG8gc3RhcnQgdXNpbmcgTkROIFBQQSByZXBvc2l0b3J5IG9uIFVidW50dSBMaW51eD8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQbGVhc2Ugc2VlIDpyZWY6YEluc3RhbGwgTkZEIFVzaW5nIHRoZSBORE4gUFBBIFJlcG9zaXRvcnkgb24gVWJ1bnR1IExpbnV4YC4KKworLi4gX0hvdyB0byBzdGFydCB1c2luZyBORE4gT3ZlcmxheSBvbiBHZW50b28gTGludXg6CisKK0hvdyB0byBzdGFydCB1c2luZyBORE4gT3ZlcmxheSBvbiBHZW50b28gTGludXg/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCB0byBpbnN0YWxsIE5GRCBhbmQgb3RoZXIgcGFja2FnZXMgdXNpbmcgUG9ydGFnZSBvbiBHZW50b28gTGludXgsIHlvdSBjYW4gc3RhcnQKK3VzaW5nIE5ETiBPdmVybGF5LgorCitTaW1wbHkgY2hlY2tvdXQgYE5ETiBPdmVybGF5IDxodHRwczovL2dpdGh1Yi5jb20vUGVzYS9uZG4tb3ZlcmxheT5gXyByZXBvc2l0b3J5IHRvIHNvbWUKK2xvY2F0aW9uIGFkZCB0aGUgY2hlY2tvdXQgcGF0aCB0byBgYFBPUlRESVJfT1ZFUkxBWWBgIGluIGBgL2V0Yy9wb3J0YWdlL21ha2UuY29uZmBgOgorCis6OgorCisgICAgY2QgL3NvbWUvcGF0aAorICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vUGVzYS9uZG4tb3ZlcmxheS5naXQKKworICAgICMgYW5kIHRoZW4gYWRkIC9zb21lL3BhdGgvbmRuLW92ZXJsYXkgdG8gUE9SVERJUl9PVkVSTEFZIGluIC9ldGMvcG9ydGFnZS9tYWtlLmNvbmYKKworQWZ0ZXJ3YXJkcywgeW91IHdpbGwgYmUgYWJsZSB0byBpbnN0YWxsIGBgbmZkYGAgdXNpbmcgc3RhbmRhcmQgbWVjaGFuaXNtcy4KZGlmZiAtLWdpdCBhL05GRC9kb2NzL0lOU1RBTEwucnN0IGIvTkZEL2RvY3MvSU5TVEFMTC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0ZWU0OAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL0lOU1RBTEwucnN0CkBAIC0wLDAgKzEsMzg3IEBACitHZXR0aW5nIFN0YXJ0ZWQgd2l0aCBORkQKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnN0YWxsaW5nIE5GRCBmcm9tIEJpbmFyaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHByb3ZpZGUgTkZEIGJpbmFyaWVzIGZvciB0aGUgc3VwcG9ydGVkIHBsYXRmb3Jtcywgd2hpY2ggYXJlIHRoZSBwcmVmZXJyZWQgaW5zdGFsbGF0aW9uCittZXRob2QuIEluIGFkZGl0aW9uIHRvIHNpbXBsaWZ5aW5nIGluc3RhbGxhdGlvbiwgdGhlIGJpbmFyeSByZWxlYXNlIGFsc28gaW5jbHVkZXMKK2F1dG9tYXRpYyBpbml0aWFsIGNvbmZpZ3VyYXRpb24gYW5kIHBsYXRmb3JtLXNwZWNpZmljIHRvb2xzIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgTkZEIGFuZAorcmVsYXRlZCBkYWVtb25zLiAgSW4gcGFydGljdWxhciwgb24gT1MgWCBORkQgaXMgY29udHJvbGxlZCB1c2luZyBgbGF1bmNoZAorPGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL05GRC90cmVlL21hc3Rlci9jb250cmliL29zeC1sYXVuY2hkPmBfXyBhbmQgb24gVWJ1bnR1IHVzaW5nCitgdXBzdGFydCA8aHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvTkZEL3RyZWUvbWFzdGVyL2NvbnRyaWIvdXBzdGFydD5gX18gbWVjaGFuaXNtcy4KK0luIGJvdGggY2FzZXMsIGBuZmQtc3RhcnRgIGFuZCBgbmZkLXN0b3BgIHNjcmlwdHMgYXJlIGNvbnZlbmllbmNlIHdyYXBwZXJzIGZvciBsYXVuY2hkIGFuZAordXBzdGFydC4KKworT24gT1MgWCwgTkZEIGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBNYWNQb3J0cy4gIFJlZmVyIHRvIDpyZWY6YEluc3RhbGwgTkZEIFVzaW5nIHRoZSBORE4KK01hY1BvcnRzIFJlcG9zaXRvcnkgb24gT1MgWGAgZm9yIG1vcmUgZGV0YWlscy4KKworT24gVWJ1bnR1IDEyLjA0LCAxNC4wNCwgb3IgMTQuMTAgTkZEIGNhbiBiZSBpbnN0YWxsZWQgZnJvbSBORE4gUFBBIHJlcG9zaXRvcnkuICBSZWZlciB0bworOnJlZjpgSW5zdGFsbCBORkQgVXNpbmcgdGhlIE5ETiBQUEEgUmVwb3NpdG9yeSBvbiBVYnVudHUgTGludXhgLgorCitGdXR1cmUgcmVsZWFzZXMgY291bGQgaW5jbHVkZSBzdXBwb3J0IGZvciBvdGhlciBwbGF0Zm9ybXMuICBQbGVhc2Ugc2VuZCB1cyBmZWVkYmFjayBvbiB0aGUKK3BsYXRmb3JtcyB5b3UncmUgdXNpbmcsIHNvIHdlIGNhbiBwcmlvcml0aXplIG91ciBnb2Fscy4gIFdlIHdvdWxkIGFsc28gYXBwcmVjaWF0ZSBoZWxwCitwYWNrYWdpbmcgdGhlIGN1cnJlbnQgTkZEIHJlbGVhc2UgZm9yIG90aGVyIHBsYXRmb3Jtcy4KKworCisuLiBfSW5zdGFsbCBORkQgVXNpbmcgdGhlIE5ETiBNYWNQb3J0cyBSZXBvc2l0b3J5IG9uIE9TIFg6CisKK0luc3RhbGwgTkZEIFVzaW5nIHRoZSBORE4gTWFjUG9ydHMgUmVwb3NpdG9yeSBvbiBPUyBYCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPUyBYIHVzZXJzIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvIHNlYW1sZXNzbHkgaW5zdGFsbCBhbmQgcnVuIE5GRCBhcyB3ZWxsIGFzIG90aGVyIHJlbGF0ZWQKK2FwcGxpY2F0aW9ucyB2aWEgYE1hY1BvcnRzIDxodHRwczovL3d3dy5tYWNwb3J0cy5vcmcvPmBfLiAgSWYgeW91IGFyZSBub3QgdXNpbmcgTWFjUG9ydHMKK3lldCwgZ28gdG8gdGhlIGBNYWNQb3J0cyB3ZWJzaXRlIDxodHRwczovL3d3dy5tYWNwb3J0cy5vcmcvaW5zdGFsbC5waHA+YF8gYW5kIGluc3RhbGwgdGhlCitNYWNQb3J0cyBwYWNrYWdlLgorCitORkQgYW5kIHJlbGF0ZWQgcG9ydHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBNYWNQb3J0cyByZXBvc2l0b3J5LiBJbiBvcmRlciB0byB1c2UKK3RoZXNlIHBvcnRzLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgTkROIE1hY1BvcnRzIHJlcG9zaXRvcnkgdG8geW91ciBsb2NhbCBjb25maWd1cmF0aW9uLgorSW4gcGFydGljdWxhciwgeW91IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhlIGxpc3Qgb2Ygc291cmNlIFVSTHMgZm9yIE1hY1BvcnRzLiAgRm9yIGV4YW1wbGUsCitpZiB5b3VyIE1hY1BvcnRzIGFyZSBpbnN0YWxsZWQgaW4gYGAvb3B0L2xvY2FsYGAsIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8KK2Avb3B0L2xvY2FsL2V0Yy9tYWNwb3J0cy9zb3VyY2VzLmNvbmZgIGJlZm9yZSBvciBhZnRlciB0aGUgZGVmYXVsdCBwb3J0IHJlcG9zaXRvcnk6CisKKzo6CisKKyAgICByc3luYzovL21hY3BvcnRzLm5hbWVkLWRhdGEubmV0L21hY3BvcnRzLworCitBZnRlciB0aGlzIHN0ZXAsIHlvdSBjYW4gdXNlIGBgc3VkbyBwb3J0IHNlbGZ1cGRhdGVgYCB0byBmZXRjaCB1cGRhdGVkIHBvcnQgZGVmaW5pdGlvbnMuCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCB3aWxsIGluc3RhbGwgTkZEIHVzaW5nIE1hY1BvcnRzOgorCis6OgorCisgICAgc3VkbyBwb3J0IGluc3RhbGwgbmZkCisKKy4uIG5vdGU6OgorCisgICAgWW91IGhhdmUgdG8gaGF2ZSBYQ29kZSBpbnN0YWxsZWQgb24geW91ciBtYWNoaW5lLiBUaGlzIGNhbiBiZSBpbnN0YWxsZWQgZnJvbSB0aGUKKyAgICBBcHBTdG9yZSAoZnJlZSkgb24gT1MgWCAxMC43IG9yIGxhdGVyLiBPbGRlciBlZGl0aW9ucyBvZiBPUyBYIGNhbiBkb3dubG9hZCBhbgorICAgIGFwcHJvcHJpYXRlIHZlcnNpb24gb2YgWENvZGUgZnJvbSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS4KKworCitPbmUgYWR2YW50YWdlIG9mIHVzaW5nIE1hY1BvcnRzIGlzIHRoYXQgeW91IGNhbiBlYXNpbHkgdXBncmFkZSBORkQgYW5kIG90aGVyIHBhY2thZ2VzIHRvCit0aGUgbGF0ZXN0IHZlcnNpb24uICBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIHdpbGwgZG8gdGhpcyBqb2I6CisKKzo6CisKKyAgICBzdWRvIHBvcnQgc2VsZnVwZGF0ZQorICAgIHN1ZG8gcG9ydCB1cGdyYWRlIG5mZAorCisuLiBfSW5zdGFsbCBORkQgVXNpbmcgdGhlIE5ETiBQUEEgUmVwb3NpdG9yeSBvbiBVYnVudHUgTGludXg6CisKK0luc3RhbGwgTkZEIFVzaW5nIHRoZSBORE4gUFBBIFJlcG9zaXRvcnkgb24gVWJ1bnR1IExpbnV4CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitORkQgYmluYXJpZXMgYW5kIHJlbGF0ZWQgdG9vbHMgZm9yIFVidW50dSAxMi4wNCwgMTQuMDQsIG9yIDE0LjEwIGNhbiBiZSBpbnN0YWxsZWQgdXNpbmcgUFBBCitwYWNrYWdlcyBmcm9tIG5hbWVkLWRhdGEgcmVwb3NpdG9yeS4gIEZpcnN0LCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBgYG5hbWVkLWRhdGEvcHBhYGAKK3JlcG9zaXRvcnkgdG8gYmluYXJ5IHBhY2thZ2Ugc291cmNlcyBhbmQgdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhY2thZ2VzLgorCitQcmVsaW1pbmFyeSBzdGVwcyBpZiB5b3UgaGF2ZW4ndCB1c2VkIFBQQSBwYWNrYWdlcyBiZWZvcmUKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUbyBzaW1wbGlmeSBhZGRpbmcgbmV3IFBQQSByZXBvc2l0b3JpZXMsIFVidW50dSBwcm92aWRlcyBgYGFkZC1hcHQtcmVwb3NpdG9yeWBgIHRvb2wsCit3aGljaCBpcyBub3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgb24gc29tZSBwbGF0Zm9ybXMuCisKK09uIFVidW50dSAqKjEyLjA0Kio6CisKKzo6CisKKyAgICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBweXRob24tc29mdHdhcmUtcHJvcGVydGllcworCitPbiBVYnVudHUgKioxNC4wNCoqIG9yICoqMTQuMTAqKjoKKworOjoKKworICAgIHN1ZG8gYXB0LWdldCBpbnN0YWxsIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uCisKKworQWRkaW5nIE5ETiBQUEEKK35+fn5+fn5+fn5+fn5+CisKK0FmdGVyIGluc3RhbGxpbmcgYGBhZGQtYXB0LXJlcG9zaXRvcnlgYCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBhZGQgYE5ETiBQUEEKK3JlcG9zaXRvcnlgXy4KKworOjoKKworICAgIHN1ZG8gYWRkLWFwdC1yZXBvc2l0b3J5IHBwYTpuYW1lZC1kYXRhL3BwYQorICAgIHN1ZG8gYXB0LWdldCB1cGRhdGUKKworSW5zdGFsbGluZyBORkQgYW5kIG90aGVyIE5ETiBwYWNrYWdlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBZnRlciB5b3UgaGF2ZSBhZGRlZCBgTkROIFBQQSByZXBvc2l0b3J5YF8sIE5GRCBhbmQgb3RoZXIgTkROIHBhY2thZ2VzIGNhbiBiZSBlYXNpbHkKK2luc3RhbGxlZCBpbiBhIHN0YW5kYXJkIHdheSwgaS5lLiwgZWl0aGVyIHVzaW5nIGBgYXB0LWdldGBgIGFzIHNob3duIGJlbG93IG9yIHVzaW5nIGFueQorb3RoZXIgcGFja2FnZSBtYW5hZ2VyLCBzdWNoIGFzIFN5bmFwdGljIFBhY2thZ2UgTWFuYWdlcjoKKworOjoKKworICAgIHN1ZG8gYXB0LWdldCBpbnN0YWxsIG5mZAorCitGb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhY2thZ2VzLCByZWZlciB0byBgTkROIFBQQSByZXBvc2l0b3J5YF8gaG9tZXBhZ2UuCisKKy4uIF9ORE4gUFBBIHJlcG9zaXRvcnk6IGh0dHBzOi8vbGF1bmNocGFkLm5ldC9+bmFtZWQtZGF0YS8rYXJjaGl2ZS9wcGEKKworQnVpbGRpbmcgZnJvbSBTb3VyY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Rvd25sb2FkaW5nIGZyb20gR2l0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgZmlyc3Qgc3RlcCBpcyB0byBvYnRhaW4gdGhlIHNvdXJjZSBjb2RlIGZvciBgYE5GRGBgIGFuZCwgaXRzIG1haW4gZGVwZW5kZW5jeSwgdGhlCitgYG5kbi1jeHhgYCBsaWJyYXJ5LiAgSWYgeW91IGFyZSBub3QgcGxhbm5pbmcgdG8gd29yayB3aXRoIHRoZSBibGVlZGluZyBlZGdlIGNvZGUsIG1ha2UKK3N1cmUgeW91IGNoZWNrb3V0IHRoZSBjb3JyZWN0IHJlbGVhc2UgdGFnIChlLmcuLCBgYCotMC4yLjBgYCkgZm9yIGJvdGggcmVwb3NpdG9yaWVzOgorCis6OgorCisgICAgIyBEb3dubG9hZCBuZG4tY3h4CisgICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL25kbi1jeHgKKworICAgICMgRG93bmxvYWQgTkZECisgICAgZ2l0IGNsb25lIC0tcmVjdXJzaXZlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL05GRAorCitQcmVyZXF1aXNpdGVzCit+fn5+fn5+fn5+fn5+CisKKy0gIEluc3RhbGwgdGhlIGBuZG4tY3h4IGxpYnJhcnkgPGh0dHA6Ly9uYW1lZC1kYXRhLm5ldC9kb2MvbmRuLWN4eC9jdXJyZW50L0lOU1RBTEwuaHRtbD5gXworICAgYW5kIGl0cyByZXF1aXJlbWVudHMKKworLSAgYGBwa2ctY29uZmlnYGAKKworICAgT24gT1MgWCAxMC44LCAxMC45LCBhbmQgMTAuMTAgd2l0aCBNYWNQb3J0czoKKworICAgOjoKKworICAgICAgIHN1ZG8gcG9ydCBpbnN0YWxsIHBrZ2NvbmZpZworCisgICBPbiBVYnVudHUgPj0gMTIuMDQ6CisKKyAgIDo6CisKKyAgICAgICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBwa2ctY29uZmlnCisKKy0gIGBgbGlicGNhcGBgCisKKyAgIENvbWVzIHdpdGggdGhlIGJhc2Ugc3lzdGVtIG9uIE9TIFggMTAuOCwgMTAuOSwgYW5kIDEwLjEwLgorCisgICBPbiBVYnVudHUgPj0gMTIuMDQ6CisKKyAgIDo6CisKKyAgICAgICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJwY2FwLWRldgorCitUbyBidWlsZCBtYW5wYWdlcyBhbmQgQVBJIGRvY3VtZW50YXRpb246CisKKy0gIGBgZG94eWdlbmBgCistICBgYGdyYXBodml6YGAKKy0gIGBgcHl0aG9uLXNwaGlueGBgCisKKyAgIE9uIE9TIFggMTAuOCwgMTAuOSwgYW5kIDEwLjEwIHdpdGggTWFjUG9ydHM6CisKKyAgIDo6CisKKyAgICAgICBzdWRvIHBvcnQgaW5zdGFsbCBkb3h5Z2VuIGdyYXBodml6IHB5Mjctc3BoaW54IHNwaGlueF9zZWxlY3QKKyAgICAgICBzdWRvIHBvcnQgc2VsZWN0IHNwaGlueCBweTI3LXNwaGlueAorCisgICBPbiBVYnVudHUgPj0gMTIuMDQ6CisKKyAgIDo6CisKKyAgICAgICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBkb3h5Z2VuIGdyYXBodml6IHB5dGhvbi1zcGhpbngKKworCitCZXNpZGVzIG9mZmljaWFsbHkgc3VwcG9ydGVkIHBsYXRmb3JtcywgTkZEIGlzIGtub3duIHRvIHdvcmsgb246IEZlZG9yYSAyMCwgQ2VudE9TIDYvNywgR2VudG9vIExpbnV4LAorUmFzcGJlcnJ5IFBpLCBPcGVuV1JULCBGcmVlQlNEIDEwLjAsIGFuZCBzZXZlcmFsIG90aGVyIHBsYXRmb3Jtcy4gIFdlIGFyZSBzb2xpY2l0aW5nIGhlbHAKK3dpdGggZG9jdW1lbnRpbmcgY29tbW9uIHByb2JsZW1zIC8gcGl0ZmFsbHMgaW4gaW5zdGFsbGluZy91c2luZyBORkQgb24gZGlmZmVyZW50IHBsYXRmb3Jtcworb24gYE5GRCBXaWtpCis8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvV2lraSNJbnN0YWxsYXRpb24tZXhwZXJpZW5jZXMtZm9yLXNlbGVjdGVkLXBsYXRmb3Jtcz5gX18uCisKKworQnVpbGQKK35+fn5+CisKK1RoZSBmb2xsb3dpbmcgYmFzaWMgY29tbWFuZHMgc2hvdWxkIGJlIHVzZWQgdG8gYnVpbGQgTkZEIG9uIFVidW50dToKKworOjoKKworICAgIC4vd2FmIGNvbmZpZ3VyZQorICAgIC4vd2FmCisgICAgc3VkbyAuL3dhZiBpbnN0YWxsCisKK0lmIHlvdSBoYXZlIGluc3RhbGxlZCBgbmRuLWN4eGAgbGlicmFyeSBhbmQvb3Igb3RoZXIgZGVwZW5kZW5jaWVzIGludG8gYSBub24tc3RhbmRhcmQgcGF0aHMsIHlvdQorbWF5IG5lZWQgdG8gbW9kaWZ5IGBgUEtHX0NPTkZJR19QQVRIYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgYGAuL3dhZiBjb25maWd1cmVgYC4KK0ZvciBleGFtcGxlLAorCis6OgorCisgICAgZXhwb3J0IFBLR19DT05GSUdfUEFUSD0vY3VzdG9tL2xpYi9wa2djb25maWc6JFBLR19DT05GSUdfUEFUSAorICAgIC4vd2FmIGNvbmZpZ3VyZQorICAgIC4vd2FmCisgICAgc3VkbyAuL3dhZiBpbnN0YWxsCisKKworUmVmZXIgdG8gYGAuL3dhZiAtLWhlbHBgYCBmb3IgbW9yZSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgZHVyaW5nIGBgY29uZmlndXJlYGAgc3RhZ2UgYW5kCitob3cgdG8gcHJvcGVybHkgY29uZmlndXJlIGFuZCBydW4gTkZELgorCisuLiBub3RlOjoKKyAgIElmIHlvdSBhcmUgd29ya2luZyBvbiBhIHNvdXJjZSByZXBvc2l0b3J5IHRoYXQgaGFzIGJlZW4gY29tcGlsZWQgYmVmb3JlLCBhbmQgeW91IGhhdmUKKyAgIHVwZ3JhZGVkIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzLCBwbGVhc2UgZXhlY3V0ZSBgYC4vd2FmIGRpc3RjbGVhbmBgIHRvIGNsZWFyIG9iamVjdCBmaWxlcworICAgYW5kIHN0YXJ0IG92ZXIuCisKK0RlYnVnIHN5bWJvbHMKK35+fn5+fn5+fn5+fn4KKworVGhlIGRlZmF1bHQgY29tcGlsZXIgZmxhZ3MgZW5hYmxlIGRlYnVnIHN5bWJvbHMgdG8gYmUgaW5jbHVkZWQgaW4gYmluYXJpZXMuICBUaGlzCitwb3RlbnRpYWxseSBhbGxvd3MgbW9yZSBtZWFuaW5nZnVsIGRlYnVnZ2luZyBpZiBORkQgb3Igb3RoZXIgdG9vbHMgaGFwcGVuIHRvIGNyYXNoLgorCitJZiBpdCBpcyB1bmRlc2lyYWJsZSwgZGVmYXVsdCBmbGFncyBjYW4gYmUgZWFzaWx5IG92ZXJyaWRkZW4uICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MKK2hvdyB0byBjb21wbGV0ZWx5IGRpc2FibGUgZGVidWcgc3ltYm9scyBhbmQgY29uZmlndXJlIE5GRCB0byBiZSBpbnN0YWxsZWQgaW50byBgYC91c3JgYAord2l0aCBjb25maWd1cmF0aW9uIGluIGBgL2V0Y2BgIGZvbGRlci4KKworOjoKKworICAgIENYWEZMQUdTPSItTzIiIC4vd2FmIGNvbmZpZ3VyZSAtLXByZWZpeD0vdXNyIC0tc3lzY29uZmRpcj0vZXRjCisgICAgLi93YWYKKyAgICBzdWRvIC4vd2FmIGluc3RhbGwKKworQnVpbGRpbmcgZG9jdW1lbnRhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitORkQgdHV0b3JpYWxzIGFuZCBBUEkgZG9jdW1lbnRhdGlvbiBjYW4gYmUgYnVpbHQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworOjoKKworICAgICMgRnVsbCBzZXQgb2YgZG9jdW1lbnRhdGlvbiAodHV0b3JpYWxzICsgQVBJKSBpbiBidWlsZC9kb2NzCisgICAgLi93YWYgZG9jcworCisgICAgIyBPbmx5IHR1dG9yaWFscyBpbiBgYnVpbGQvZG9jc2AKKyAgICAuL3dhZiBzcGhpbngKKworICAgICMgT25seSBBUEkgZG9jcyBpbiBgYnVpbGQvZG9jcy9kb3h5Z2VuYAorICAgIC4vd2FmIGRveGd5ZW4KKworCitNYW5wYWdlcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCBpbnN0YWxsZWQgZHVyaW5nIHRoZSBub3JtYWwgYnVpbGQgcHJvY2VzcyAoZS5nLiwKK2R1cmluZyBgYC4vd2FmYGAgYW5kIGBgLi93YWYgaW5zdGFsbGBgKSwgaWYgYGBweXRob24tc3BoaW54YGAgbW9kdWxlIGlzIGRldGVjdGVkIGR1cmluZworYGAuL3dhZiBjb25maWd1cmVgYCBzdGFnZS4gIEJ5IGRlZmF1bHQsIG1hbnBhZ2VzIGFyZSBpbnN0YWxsZWQgaW50bworYGAke1BSRUZJWH0vc2hhcmUvbWFuYGAgKHdoZXJlIGRlZmF1bHQgdmFsdWUgZm9yIGBgUFJFRklYYGAgaXMgYGAvdXNyL2xvY2FsYGApLiBUaGlzCitsb2NhdGlvbiBjYW4gYmUgY2hhbmdlZCBkdXJpbmcgYGAuL3dhZiBjb25maWd1cmVgYCBzdGFnZSB1c2luZyBgYC0tcHJlZml4YGAsCitgYC0tZGF0YXJvb3RkaXJgYCwgb3IgYGAtLW1hbmRpcmBgIG9wdGlvbnMuCisKK0ZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIGBgLi93YWYgLS1oZWxwYGAuCisKKworSW5pdGlhbCBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gbm90ZTo6CisgICAgSWYgeW91IGhhdmUgaW5zdGFsbGVkIE5GRCBmcm9tIGJpbmFyeSBwYWNrYWdlcywgdGhlIHBhY2thZ2UgbWFuYWdlciBoYXMgYWxyZWFkeQorICAgIGluc3RhbGxlZCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gYW5kIHlvdSBjYW4gc2FmZWx5IHNraXAgdGhpcyBzZWN0aW9uLgorCitHZW5lcmFsCit+fn5+fn5+CisKK0FmdGVyIGluc3RhbGxpbmcgTkZEIGZyb20gc291cmNlLCB5b3UgbmVlZCB0byBjcmVhdGUgYSBwcm9wZXIgY29uZmlnIGZpbGUuICBJZiBkZWZhdWx0Citsb2NhdGlvbiBmb3IgYGAuL3dhZiBjb25maWd1cmVgYCB3YXMgdXNlZCwgdGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHNpbXBseSBjb3B5aW5nIHRoZQorc2FtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZToKKworOjoKKworICAgIHN1ZG8gY3AgL3Vzci9sb2NhbC9ldGMvbmRuL25mZC5jb25mLnNhbXBsZSAvdXNyL2xvY2FsL2V0Yy9uZG4vbmZkLmNvbmYKKworTkZEIFNlY3VyaXR5Cit+fn5+fn5+fn5+fn4KKworTkZEIHByb3ZpZGVzIG1lY2hhbmlzbXMgdG8gZW5hYmxlIHN0cmljdCBhdXRob3JpemF0aW9uIGZvciBhbGwgbWFuYWdlbWVudCBjb21tYW5kcy4gSW4KK3BhcnRpY3VsYXIsIG9uZSBjYW4gYXV0aG9yaXplIG9ubHkgc3BlY2lmaWMgcHVibGljIGtleXMgdG8gY3JlYXRlIG5ldyBGYWNlcyBvciBjaGFuZ2UgdGhlCitmb3J3YXJkaW5nIHN0cmF0ZWd5IGZvciBzcGVjaWZpYyBuYW1lc3BhY2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZ2VuZXJhdGUKK3ByaXZhdGUvcHVibGljIGtleSBwYWlyLCBnZW5lcmF0ZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSwgYW5kIHVzZSB0aGlzIHNlbGYtc2lnbmVkCitjZXJ0aWZpY2F0ZSB0byBhdXRob3JpemUgTkZEIG1hbmFnZW1lbnQgY29tbWFuZHMgcmVmZXIgdG8gOnJlZjpgSG93IHRvIGNvbmZpZ3VyZSBORkQKK3NlY3VyaXR5YCBGQVEgcXVlc3Rpb24uCisKK0luIHRoZSBzYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlLCBhbGwgYXV0aG9yaXphdGlvbnMgYXJlIGRpc2FibGVkLCBlZmZlY3RpdmVseSBhbGxvd2luZworYW55Ym9keSBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byBpc3N1ZSBORkQgbWFuYWdlbWVudCBjb21tYW5kcy4gKipUaGUgc2FtcGxlIGZpbGUgaXMKK2ludGVuZGVkIG9ubHkgZm9yIGRlbW8gcHVycG9zZXMgYW5kIE1VU1QgTk9UIGJlIHVzZWQgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LioqCisKK1J1bm5pbmcKKy0tLS0tLS0KKworKipZb3Ugc2hvdWxkIG5vdCBydW4gbmRuZCBvciBuZG5kLXRsdiwgb3RoZXJ3aXNlIE5GRCB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSoqCisKK1N0YXJ0aW5nCit+fn5+fn5+fgorCitJbiBvcmRlciB0byB1c2UgTkZELCB5b3UgbmVlZCB0byBzdGFydCB0d28gc2VwYXJhdGUgZGFlbW9uczogYGBuZmRgYCAodGhlIGZvcndhcmRlcgoraXRzZWxmKSBhbmQgYGBucmRgYCAoUklCIG1hbmFnZXIgdGhhdCB3aWxsIG1hbmFnZSBhbGwgcHJlZml4IHJlZ2lzdHJhdGlvbnMpLiAgVGhlCityZWNvbW1lbmRlZCB3YXkgaXMgdG8gdXNlIGBuZmQtc3RhcnRgIHNjcmlwdDoKKworOjoKKworICAgIG5mZC1zdGFydAorCitPbiBPUyBYIGl0IG1heSBhc2sgZm9yIHlvdXIga2V5Y2hhaW4gcGFzc3dvcmQgb3IgYXNrIGBgbmZkL25yZCB3YW50cyB0byBzaWduIHVzaW5nIGtleSBpbgoreW91ciBrZXljaGFpbi5gYCBFbnRlciB5b3VyIGtleWNoYWluIHBhc3N3b3JkIGFuZCBjbGljayBBbHdheXMgQWxsb3cuCisKK0xhdGVyLCB5b3UgY2FuIHN0b3AgTkZEIHdpdGggYGBuZmQtc3RvcGBgIG9yIGJ5IHNpbXBseSBraWxsaW5nIHRoZSBgYG5mZGBgIHByb2Nlc3MuCisKKworQ29ubmVjdGluZyB0byByZW1vdGUgTkZEcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUbyBjcmVhdGUgYSBVRFAgb3IgVENQIHR1bm5lbCB0byByZW1vdGUgTkZEIGFuZCBjcmVhdGUgcm91dGUgdG93YXJkIGl0LCB1c2UgdGhlIGZvbGxvd2luZworY29tbWFuZCBpbiB0ZXJtaW5hbDoKKworOjoKKworICAgIG5mZGMgcmVnaXN0ZXIgL25kbiB1ZHA6Ly88b3RoZXIgaG9zdD4KKword2hlcmUgYGA8b3RoZXIgaG9zdD5gYCBpcyB0aGUgbmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBvdGhlciBob3N0IChlLmcuLAorYGB1ZHA6Ly9zcHVycy5jcy51Y2xhLmVkdWBgKS4gVGhpcyBvdXRwdXRzOgorCis6OgorCisgICAgU3VjY2Vzc2Z1bCBpbiBuYW1lIHJlZ2lzdHJhdGlvbjogQ29udHJvbFBhcmFtZXRlcnMoTmFtZTogL25kbiwgRmFjZUlkOiAyNjAsIE9yaWdpbjogMjU1LCBDb3N0OiAwLCBGbGFnczogMSwgKQorCitUaGUgYGAvbmRuYGAgbWVhbnMgdGhhdCBORkQgd2lsbCBmb3J3YXJkIGFsbCBJbnRlcmVzdHMgdGhhdCBzdGFydCB3aXRoIGBgL25kbmBgIHRocm91Z2gKK3RoZSBmYWNlIHRvIHRoZSBvdGhlciBob3N0LiAgSWYgeW91IG9ubHkgd2FudCB0byBmb3J3YXJkIEludGVyZXN0cyB3aXRoIGEgY2VydGFpbiBwcmVmaXgsCit1c2UgaXQgaW5zdGVhZCBvZiBgYC9uZG5gYC4gIFRoaXMgb25seSBmb3J3YXJkcyBJbnRlcmVzdHMgdG8gdGhlIG90aGVyIGhvc3QsIGJ1dCB0aGVyZSBpcworbm8gImJhY2sgcm91dGUiIGZvciB0aGUgb3RoZXIgaG9zdCB0byBmb3J3YXJkIEludGVyZXN0cyB0byB5b3UuICBGb3IgdGhhdCwgeW91IG11c3QgZ28gdG8KK3RoZSBvdGhlciBob3N0IGFuZCB1c2UgYGBuZmRjYGAgdG8gYWRkIHRoZSByb3V0ZS4KKworVGhlICJiYWNrIHJvdXRlIiBjYW4gYWxzbyBiZSBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgd2l0aCBgYG5mZC1hdXRvcmVnYGAuIEZvciBtb3JlCitpbmZvcm1hdGlvbiByZWZlciB0byA6ZG9jOmBtYW5wYWdlcy9uZmQtYXV0b3JlZ2AuCisKK1BsYXlpbmcgd2l0aCBORkQKKy0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgeW91IGhhdmVkIGluc3RhbGxlZCwgY29uZmlndXJlZCwgYW5kIHN0YXJ0ZWQgTkZELCB5b3UgY2FuIHRyeSB0byBpbnN0YWxsIGFuZCBwbGF5Cit3aXRoIHRoZSBmb2xsb3dpbmc6CisKK1NhbXBsZSBhcHBsaWNhdGlvbnM6CisKKy0gIGBTaW1wbGUgZXhhbXBsZXMgaW4gbmRuLWN4eAorICAgbGlicmFyeSA8aHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9uZG4tY3h4L2N1cnJlbnQvZXhhbXBsZXMuaHRtbD5gX18uCisgICBJZiB5b3UgaGF2ZSBpbnN0YWxsZWQgbmRuLWN4eCBmcm9tIHNvdXJjZSwgeW91IGFscmVhZHkgaGF2ZSBjb21waWxlZAorICAgdGhlc2U6CisKKyAgICsgIGV4YW1wbGVzL3Byb2R1Y2VyCisgICArICBleGFtcGxlcy9jb25zdW1lcgorICAgKyAgZXhhbXBsZXMvY29uc3VtZXItd2l0aC10aW1lcgorCisgICArICB0b29scy9uZG5jYXRjaHVua3MzCisgICArICB0b29scy9uZG5wdXRjaHVua3MzCisKKy0gIGBJbnRyb2R1Y3RvcnkgZXhhbXBsZXMgb2YKKyAgIE5ETi1DQ0wgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL0dldHRpbmdfU3RhcnRlZF8tX0NvbW1vbl9DbGllbnRfTGlicmFyaWVzI0luc3RhbGwtdGhlLUNvbW1vbi1DbGllbnQtTGlicmFyeT5gX18KKworUmVhbCBhcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllczoKKworICAgKyBgbmRuLXRsdi1waW5nIC0gUmVhY2hhYmlsaXR5IFRlc3RpbmcgVG9vbCBmb3IgTkROCisgICAgICA8aHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvbmRuLXRsdi1waW5nPmBfXworICAgKyAgYG5kbi10cmFmZmljLWdlbmVyYXRvciAtIFRyYWZmaWMgR2VuZXJhdG9yIEZvcgorICAgICAgTkROIDxodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG4tdHJhZmZpYy1nZW5lcmF0b3I+YF9fCisgICArICBgcmVwby1uZyAtIE5leHQgZ2VuZXJhdGlvbiBvZiBORE4KKyAgICAgIHJlcG9zaXRvcnkgPGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL3JlcG8tbmc+YF9fCisgICArICBgQ2hyb25vQ2hhdCAtIE11bHRpLXVzZXIgTkROIGNoYXQKKyAgICAgIGFwcGxpY2F0aW9uIDxodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9DaHJvbm9DaGF0PmBfXworICAgKyAgYENocm9ub1N5bmMgLSBTeW5jIGxpYnJhcnkgZm9yIG11bHRpdXNlciByZWFsdGltZSBhcHBsaWNhdGlvbnMgZm9yCisgICAgICBORE4gPGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL0Nocm9ub1N5bmM+YF9fCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9SRUxFQVNFX05PVEVTLnJzdCBiL05GRC9kb2NzL1JFTEVBU0VfTk9URVMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjQ3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9SRUxFQVNFX05PVEVTLnJzdApAQCAtMCwwICsxLDI2MyBAQAorLi4gX05GRCBSZWxlYXNlIE5vdGVzOgorCitORkQgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT0KKworTkZEIHZlcnNpb24gMC4yLjAgKGNoYW5nZXMgc2luY2UgdmVyc2lvbiAwLjEuMCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlbGVhc2UgZGF0ZTogQXVndXN0IDI1LCAyMDE0CisKKy0gKipEb2N1bWVudGF0aW9uKioKKworICArIGAiTkZEIERldmVsb3BlcidzIEd1aWRlIiBieSBORkQgYXV0aG9ycworICAgIDxodHRwOi8vbmFtZWQtZGF0YS5uZXQvd3AtY29udGVudC91cGxvYWRzLzIwMTQvMDcvTkZELWRldmVsb3Blci1ndWlkZS5wZGY+YF8gdGhhdAorICAgIGV4cGxhaW5zIE5GRCdzIGludGVybmFscyBpbmNsdWRpbmcgdGhlIG92ZXJhbGwgZGVzaWduLCBtYWpvciBtb2R1bGVzLCB0aGVpcgorICAgIGltcGxlbWVudGF0aW9uLCBhbmQgdGhlaXIgaW50ZXJhY3Rpb25zCisKKyAgKyBOZXcgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBlbmFibGUgYXV0by1zdGFydCBvZiBORkQgdXNpbmcgT1NYIGBgbGF1bmNoZGBgCisgICAgYW5kIFVidW50dSdzIGBgdXBzdGFydGBgIChzZWUgYGNvbnRyaWIvIGZvbGRlcgorICAgIDxodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9ORkQvdHJlZS9tYXN0ZXIvY29udHJpYj5gXykKKworLSAqKkNvcmUqKgorCisgICsgQWRkIHN1cHBvcnQgZm9yIHRlbXBvcmFyeSBwcml2aWxlZ2UgZHJvcCBhbmQgZWxldmF0aW9uIChgSXNzdWUgIzEzNzAKKyAgICA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzEzNzA+YF8pCisKKyAgKyBBZGQgc3VwcG9ydCB0byByZWluaXRpYWxpemUgbXVsdGljYXN0IEZhY2VzIGFuZCAocGFydGlhbGx5KSByZWxvYWQgY29uZmlnIGZpbGUKKyAgICAoYElzc3VlICMxNTg0IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTU4ND5gXykKKworICArIFJhbmRvbWl6YXRpb24gcm91dGluZXMgYXJlIG5vdyB1bmlmb3JtIGFjcm9zcyBhbGwgTkZEIG1vZHVsZXMKKyAgICAoYElzc3VlICMxMzY5IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTM2OT5gXykKKworICArIEVuYWJsZSB1c2Ugb2YgbmV3IE5ETiBuYW1pbmcgY29udmVudGlvbnMKKyAgICAoYElzc3VlICMxODM3IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTgzNz5gXyBhbmQKKyAgICBgIzE4MzggPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODM4PmBfKQorCistICoqRmFjZXMqKgorCisgICsgYFdlYlNvY2tldCA8aHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjQ1NT5gXyBGYWNlIHN1cHBvcnQKKyAgICAoYElzc3VlICMxNDY4IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTQ2OD5gXykKKworICArIEZpeCBFdGhlcm5ldCBGYWNlIHN1cHBvcnQgb24gTGludXggd2l0aCBgYGxpYnBjYXBgYCB2ZXJzaW9uID49MS41LjAKKyAgICAoYElzc3VlICMxNTExIDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTUxMT5gXykKKworICArIEZpeCB0byByZWNvZ25pemUgSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzZXMgaW4gYGBGYWNlVXJpYGAKKyAgICAoYElzc3VlICMxNjM1IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTYzNT5gXykKKworICArIEZpeCB0byBhdm9pZCBtdWx0aXBsZSBvbkZhaWwgZXZlbnRzCisgICAgKGBJc3N1ZSAjMTQ5NyA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzE0OTc+YF8pCisKKyAgKyBGaXggYnJva2VuIHN1cHBvcnQgb2YgbXVsdGljYXN0IFVEUCBGYWNlcyBvbiBPU1gKKyAgICAoYElzc3VlICMxNjY4IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTY2OD5gXykKKworICArIE9uIExpbnV4LCBwYXRoIE1UVSBkaXNjb3Zlcnkgb24gdW5pY2FzdCBVRFB2NCBmYWNlcyBpcyBub3cgZGlzYWJsZWQKKyAgICAoYElzc3VlICMxNjUxIDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTY1MT5gXykKKworICArIEFkZGVkIGxpbmsgbGF5ZXIgYnl0ZSBjb3VudHMgaW4gRmFjZUNvdW50ZXJzCisgICAgKGBJc3N1ZSAjMTcyOSA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzE3Mjk+YF8pCisKKyAgKyBGYWNlIElEcyAwLTI1NSBhcmUgbm93IHJlc2VydmVkIGZvciBpbnRlcm5hbCBORkQgdXNlCisgICAgKGBJc3N1ZSAjMTYyMCA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzE2MjA+YF8pCisKKyAgKyBTZXJpYWxpemVkIFN0cmVhbUZhY2U6OnNlbmQoSW50ZXJlc3R8RGF0YSkgb3BlcmF0aW9ucyB1c2luZyBxdWV1ZQorICAgIChgSXNzdWUgIzE3NzcgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xNzc3PmBfKQorCistICoqRm9yd2FyZGluZyoqCisKKyAgKyBPdXRnb2luZyBJbnRlcmVzdCBwaXBlbGluZSBub3cgYWxsb3dzIHN0cmF0ZWdpZXMgdG8gcmVxdWVzdCBhIGZyZXNoIGBgTm9uY2VgYAorICAgIChlLmcuLCB3aGVuIHRoZSBzdHJhdGVneSBuZWVkcyB0byByZS1leHByZXNzIHRoZSBJbnRlcmVzdCkKKyAgICAoYElzc3VlICMxNTk2IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTU5Nj5gXykKKworICArIEZpeCBpbiB0aGUgaW5jb21pbmcgRGF0YSBwaXBlbGluZSB0byBhdm9pZCBzZW5kaW5nIHBhY2tldHMgdG8gdGhlIGluY29taW5nIEZhY2UKKyAgICAoYElzc3VlICMxNTU2IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTU1Nj5gXykKKworICArIE5ldyBgYFJ0dEVzdGltYXRvcmBgIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgTWVhbi1EZXZpYXRpb24gUlRUIGVzdGltYXRvciB0byBiZSB1c2VkCisgICAgaW4gZm9yd2FyZGluZyBzdHJhdGVnaWVzCisKKyAgKyBGaXggbWVtb3J5IGxlYWsgY2F1c2VkIGJ5IG5vdCByZW1vdmluZyBQSVQgZW50cnkgd2hlbiBJbnRlcmVzdCBtYXRjaGVzIENTCisgICAgKGBJc3N1ZSAjMTg4MiA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzE4ODI+YF8pCisKKyAgKyBGaXggc3B1cmlvdXMgYXNzZXJ0aW9uIGluIE5DQyBzdHJhdGVneQorICAgIChgSXNzdWUgIzE4NTMgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODUzPmBfKQorCistICoqVGFibGVzKioKKworICArIEZpeCBpbiBDb250ZW50U3RvcmUgdG8gcHJvcGVybHkgYWRqdXN0IGludGVybmFsIHN0cnVjdHVyZSB3aGVuIGBgQ3M6OnNldExpbWl0YGAgaXMgY2FsbGVkCisgICAgKGBJc3N1ZSAjMTY0NiA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzE2NDY+YF8pCisKKyAgKyBOZXcgb3B0aW9uIGluIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBzZXQgYW4gdXBwZXIgYm91bmQgb24gQ29udGVudFN0b3JlIHNpemUKKyAgICAoYElzc3VlICMxNjIzIDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTYyMz5gXykKKworICArIEZpeCB0byBwcmV2ZW50IGluZmluaXRlIGxpZmV0aW1lIG9mIE1lYXN1cmVtZW50IGVudHJpZXMKKyAgICAoYElzc3VlICMxNjY1IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTY2NT5gXykKKworICArIEludHJvZHVjaW5nIGNhcGFjaXR5IGxpbWl0IGluIFBJVCBOb25jZUxpc3QKKyAgICAoYElzc3VlICMxNzcwIDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTc3MD5gXykKKworICArIEZpeCBtZW1vcnkgbGVhayBpbiBOYW1lVHJlZQorICAgIChgSXNzdWUgIzE4MDMgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODAzPmBfKQorCisgICsgRml4IHNlZ2ZhdWx0IGR1cmluZyBGaWI6OnJlbW92ZU5leHRIb3BGcm9tQWxsRW50cmllcworICAgIChgSXNzdWUgIzE4MTYgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODE2PmBfKQorCistICoqTWFuYWdlbWVudCoqCisKKyAgKyBSaWJNYW5hZ2VyIG5vdyBmdWxseSBzdXBwb3J0IGBgQ0hJTERfSU5IRVJJVGBgIGFuZCBgYENBUFRVUkVgYCBmbGFncworICAgIChgSXNzdWUgIzEzMjUgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xMzI1PmBfKQorCisgICsgRml4IGluIGBgRmFjZU1hbmFnZXJgYCB0byByZXNwb25kIHdpdGggY2Fub25pY2FsIGZvcm0gb2YgRmFjZSBVUkkgZm9yIEZhY2UgY3JlYXRpb24KKyAgICBjb21tYW5kIChgSXNzdWUgIzE2MTkgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xNjE5PmBfKQorCisgICsgRml4IHRvIHByZXZlbnQgY3JlYXRpb24gb2YgZHVwbGljYXRlIFRDUC9VRFAgRmFjZXMgZHVlIHRvIGFzeW5jIGNhbGxzCisgICAgKGBJc3N1ZSAjMTY4MCA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzE2ODA+YF8pCisKKyAgKyBGaXggdG8gcHJvcGVybHkgaGFuZGxlIG9wdGlvbmFsIEV4cGlyYXRpb25QZXJpb2QgaW4gUmliUmVnaXN0ZXIgY29tbWFuZAorICAgIChgSXNzdWUgIzE3NzIgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xNzcyPmBfKQorCisgICsgQWRkZWQgZnVuY3Rpb25hbGl0eSBvZiBwdWJsaXNoaW5nIFJJQiBzdGF0dXMgKFJJQiBkYXRhc2V0KSBieSBSaWJNYW5hZ2VyCisgICAgKGBJc3N1ZSAjMTY2MiA8aHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvaXNzdWVzLzE2NjI+YF8pCisKKyAgKyBGaXggaXNzdWUgb2Ygbm90IHByb3Blcmx5IGNhbmNlbGluZyByb3V0ZSBleHBpcmF0aW9uIGR1cmluZyBwcm9jZXNzaW5nIG9mCisgICAgYGB1bnJlZ2lzdGVyYGAgY29tbWFuZAorICAgIChgSXNzdWUgIzE5MDIgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xOTAyPmBfKQorCisgICsgRW5hYmxlIHBlcmlvZGljIGNsZWFuIHVwIG9mIHJvdXRlIGVudHJpZXMgdGhhdCByZWZlciB0byBub24tZXhpc3RpbmcgZmFjZXMKKyAgICAoYElzc3VlICMxODc1IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9pc3N1ZXMvMTg3NT5gXykKKworLSAqKlRvb2xzKioKKworICArIEV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkgb2YgYGBuZmQtc3RhdHVzYGAKKworICAgICAqIGBgLXhgYCB0byBvdXRwdXQgaW4gWE1MIGZvcm1hdCwgc2VlIDpyZWY6YG5mZC1zdGF0dXMgeG1sIHNjaGVtYWAKKyAgICAgKiBgYC1jYGAgdG8gcmV0cmlldmUgY2hhbm5lbCBzdGF0dXMgaW5mb3JtYXRpb24gKGVuYWJsZWQgYnkgZGVmYXVsdCkKKyAgICAgKiBgYC1zYGAgdG8gcmV0cmlldmUgY29uZmlndXJlZCBzdHJhdGVneSBjaG9pY2UgZm9yIE5ETiBuYW1lc3BhY2VzIChlbmFibGVkIGJ5IGRlZmF1bHQpCisgICAgICogRmFjZSBzdGF0dXMgbm93IGluY2x1ZGVzIHJlcG9ydGluZyBvZiBGYWNlIGZsYWdzIChgYGxvY2FsYGAgYW5kIGBgb24tZGVtYW5kYGApCisgICAgICogT24tZGVtYW5kIFVEUCBGYWNlcyBub3cgcmVwb3J0IHJlbWFpbmluZyBsaWZldGltZSAoYGBleHBpcmF0aW9uUGVyaW9kYGApCisgICAgICogYGAtcmBgIHRvIHJldHJpZXZlIFJJQiBpbmZvcm1hdGlvbgorCisgICsgSW1wcm92ZWQgYGBuZmQtc3RhdHVzLWh0dHAtc2VydmVyYGAKKworICAgICAqIEhUVFAgc2VydmVyIG5vdyBwcmVzZW50cyBzdGF0dXMgYXMgWFNMLWZvcm1hdHRlZCBYTUwgcGFnZQorICAgICAqIFhNTCBkYXRhc2V0IGFuZCBmb3JtYXR0ZWQgcGFnZSBub3cgaW5jbHVkZSBjZXJ0aWZpY2F0ZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIE5GRAorICAgICAgIChgSXNzdWUgIzE4MDcgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODA3PmBfKQorCisgICsgU2V2ZXJhbCBmaXhlcyBpbiBgYG5kbi1hdXRvY29uZmlnYGAgdG9vbAorICAgIChgSXNzdWUgIzE1OTUgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xNTk1PmBfKQorCisgICsgRXh0ZW5kZWQgb3B0aW9ucyBpbiBgYG5mZGNgYDoKKworICAgICogYGAtZWBgIHRvIHNldCBleHBpcmF0aW9uIHRpbWUgZm9yIHJlZ2lzdGVyZWQgcm91dGVzCisgICAgKiBgYC1vYGAgdG8gc3BlY2lmeSBvcmlnaW4gZm9yIHJlZ2lzdHJhdGlvbiBhbmQgdW5yZWdpc3RyYXRpb24gY29tbWFuZHMKKworICArIEVuYWJsZSBgYGFsbC1mYWNlcy1wcmVmaXgnJyBvcHRpb24gaW4gYGBuZmQtYXV0b3JlZ2BgIHRvIHJlZ2lzdGVyIHByZWZpeCBmb3IgYWxsIGZhY2UKKyAgICAob24tZGVtYW5kIGFuZCBub24tb24tZGVtYW5kKQorICAgIChgSXNzdWUgIzE4NjEgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODYxPmBfKQorCisgICsgRW5hYmxlIHByb2Nlc3NpbmcgYXV0by1yZWdpc3RyYXRpb24gaW4gYGBuZmQtYXV0b3JlZ2BgIGZvciBmYWNlcyB0aGF0IGV4aXN0ZWQKKyAgICBwcmlvciB0byBzdGFydCBvZiB0aGUgdG9vbAorICAgIChgSXNzdWUgIzE4NjMgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODYzPmBfKQorCistICoqQnVpbGQqKgorCisgICsgRW5hYmxlIHN1cHBvcnQgb2YgcHJlY29tcGlsZWQgaGVhZGVycyBmb3IgY2xhbmcgYW5kIGdjYyB0byBzcGVlZCB1cCBjb21waWxhdGlvbgorCistIGBPdGhlciBzbWFsbCBmaXhlcyBhbmQgZXh0ZW5zaW9ucworICA8aHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvTkZEL2NvbXBhcmUvTkZELTAuMS4wLi4ubWFzdGVyPmBfCisKK05GRCB2ZXJzaW9uIDAuMS4wCistLS0tLS0tLS0tLS0tLS0tLQorCitSZWxlYXNlIGRhdGU6IE1heSA3LCAyMDE0CisKK1RoaXMgaXMgYW4gaW5jb21wbGV0ZSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIE5GRCB2ZXJzaW9uIDAuMS4wLgorCistICoqUGFja2V0IEZvcm1hdCoqCisKKyAgKyBgTkROLVRMViA8aHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9uZG4tdGx2Lz5gXworICArIExvY2FsQ29udHJvbEhlYWRlciwgdG8gYWxsb3cgYXBwcyB0byBzZXQgb3V0Z29pbmcgZmFjZSBhbmQgbGVhcm4gaW5jb21pbmcgZmFjZS4KKworLSAqKkZhY2VzKioKKworICArIFVuaXggc3RyZWFtIHNvY2tldAorICArIFVEUCB1bmljYXN0CisgICsgVURQIG11bHRpY2FzdAorICArIFRDUAorICArIEV0aGVybmV0LCBjdXJyZW50bHkgd2l0aG91dCBmcmFnbWVudGF0aW9uLgorCisgICAgLi4gbm90ZTo6CisgICAgICAgICBFdGhlcm5ldCBzdXBwb3J0IHdpbGwgbm90IHdvcmsgcHJvcGVybHkgb24gTGludXgga2VybmVscyB3aXRoIFRQQUNLRVRfVjMgZmxleGlibGUKKyAgICAgICAgIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAoPj0gMy4yLjApIGFuZCBsaWJwY2FwID49IDEuNS4wIChlLmcuLCBVYnVudHUgTGludXggMTQuMDQpLgorICAgICAgICAgUmVmZXIgdG8gYElzc3VlIDE1NTEgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xNTExPmBfIGZvciBtb3JlCisgICAgICAgICBkZXRhaWwgYW5kIGltcGxlbWVudGF0aW9uIHByb2dyZXNzLgorCistICoqTWFuYWdlbWVudCoqCisKKyAgKyBVc2Ugb2Ygc2lnbmVkIEludGVyZXN0cyBhcyBjb21tYW5kcywgd2l0aCBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbi4KKyAgKyBGYWNlIG1hbmFnZW1lbnQKKyAgKyBGSUIgbWFuYWdlbWVudAorICArIFBlci1uYW1lc3BhY2Ugc3RyYXRlZ3kgc2VsZWN0aW9uCisgICsgTkZEIHN0YXR1cyBwdWJsaXNoaW5nCisgICsgTm90aWZpY2F0aW9uIHRvIGF1dGhvcml6ZWQgYXBwcyBvZiBpbnRlcm5hbCBldmVudHMsIGluY2x1ZGluZyBGYWNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbi4KKworLSAqKlRhYmxlcyBhbmQgZm9yd2FyZGluZyBwaXBlbGluZXMqKiBzdXBwb3J0IG1vc3QgSW50ZXJlc3QvRGF0YSBwcm9jZXNzaW5nLCBpbmNsdWRpbmcKKyAgc2VsZWN0b3JzLgorCistICoqUklCIE1hbmFnZW1lbnQqKiB0aGF0IHJ1bnMgYXMgYSBzZXBhcmF0ZSBwcm9jZXNzLCBgYG5yZGBgLiAgSXQgc3VwcG9ydHMgYmFzaWMgcHJlZml4CisgIHJlZ2lzdHJhdGlvbiBieSBhcHBsaWNhdGlvbnMsIGJ1dCBubyBmbGFncyB5ZXQuCisKKy0gKipTdHJhdGVnaWVzKioKKworICArIGBgYnJvYWRjYXN0YGAKKyAgKyBgYGJlc3Qtcm91dGVgYAorICArIGBgbmNjYGA6IGJhc2VkIG9uIGNjbnggMC43IGZvciBleHBlcmltZW50YXRpb24KKyAgKyBgYGNsaWVudC1jb250cm9sYGA6IGF1dGhvcml6ZWQgYXBwbGljYXRpb24gY2FuIGRpcmVjdGx5IGNvbnRyb2wgSW50ZXJlc3QgZm9yd2FyZGluZworCistICoqTmFtZS1iYXNlZCBzY29waW5nKioKKworICArIGBgL2xvY2FsaG9zdGBgOiBjb21tdW5pY2F0aW9uIG9ubHkgd2l0aGluIGxvY2FsaG9zdCB1c2luZyAibG9jYWwiIEZhY2VzCisgICAgKFVuaXhTdHJlYW1GYWNlLCBMb2NhbFRjcEZhY2UpLiAgTkZEIHdpbGwgc3RyaWN0bHkgZW5mb3JjZSB0aGlzIHNjb3BlIGZvciBJbnRlcmVzdHMKKyAgICBhbmQgRGF0YSBwYWNrZXRzCisgICsgYGAvbG9jYWxob3BgYDogb25lLWhvcCBjb21tdW5pY2F0aW9uIChlLmcuLCBpZiBhdCBsZWFzdCBvbmUgaW5jb21pbmcgb3Igb3V0Z29pbmcgRmFjZQorICAgIGluIFBJVCBlbnRyeSBpcyBub24tbG9jYWwsIHRoZSBJbnRlcmVzdCBjYW5ub3QgYmUgZm9yd2FyZGVkIHRvIGFueSBub24tbG9jYWwgRmFjZSkKKworLSAqKlN1cHBvcnQgY29uZmlndXJhdGlvbiBmaWxlKiosIHdoaWNoIGlzIGluIHRoZSBCb29zdCBJTkZPIGZvcm1hdC4KKworLSAqKkFwcGxpY2F0aW9ucyoqCisKKyAgKyBUb29scyB0byBkaXNjb3ZlciBodWJzIG9uIE5ETiB0ZXN0YmVkLgorICArIHBlZWsvcG9rZSBhbmQgdHJhZmZpYyBnZW5lcmF0b3JzIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCisgICsgYGBuZmRjYGAsIGEgY29tbWFuZC1saW5lIHRvb2wgdG8gY29uZmlndXJlIE5GRC4KKyAgKyBgYG5mZC1zdGF0dXNgYCwgYSBjb21tYW5kLWxpbmUgdG9vbCB0byBxdWVyeSBORkQgc3RhdHVzLgorICArIGBgbmZkLXN0YXR1cy1odHRwLXNlcnZlcmBgLCB3aGljaCByZWFkcyB0aGUgTkZEIHN0YXR1cyBhbmQgcHVibGlzaGVzIG92ZXIgSFRUUC4KKworCitQbGFubmVkIEZ1bmN0aW9ucyBhbmQgRmVhdHVyZXMgZm9yIE5leHQgUmVsZWFzZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIE5BQ0sKKyAgICBBIHBhY2tldCBzZW50IGJhY2sgYnkgYSBwcm9kdWNlciBvciBhIHJvdXRlciB0byBzaWduYWwgdGhlIHVuYXZhaWxhYmlsaXR5IG9mIGEgcmVxdWVzdGVkCisgICAgRGF0YSBwYWNrZXQuIFRoZSBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIGZvciBOQUNLIGlzIGluIHByb2dyZXNzLgorCistIE5ldyBzdHJhdGVnaWVzCisgICAgQWRkaXRpb25hbCBzdHJhdGVnaWVzLCBpbmNsdWRpbmcgc2VsZi1sZWFybmluZyB0aGF0IHBvcHVsYXRlcyB0aGUgRklCIGJ5IG9ic2VydmluZworICAgIEludGVyZXN0IGFuZCBEYXRhIGV4Y2hhbmdlLgorCistIEhvcC1ieS1ob3AgSW50ZXJlc3QgbGltaXQgbWVjaGFuaXNtCisgICAgRm9yIGNvbmdlc3Rpb24gY29udHJvbAorCistIEZhY2UgZW5oYW5jZW1lbnRzCisgICAgQWRkIGZyYWdtZW50YXRpb24gc3VwcG9ydCBmb3IgRXRoZXJuZXQgZmFjZSwgbWF5IGFkZCBzdXBwb3J0IGZvciBuZXcgdHlwZXMgc3VjaCBhcworICAgIFdpRmkgZGlyZWN0IGFuZCBXZWJTb2NrZXRzLgorCistIFRhYmxlcworICAgIEV4cGVyaW1lbnQgYW5kIGV2YWx1YXRlIGRpZmZlcmVudCBkYXRhIHN0cnVjdHVyZXMgYW5kIGFsZ29yaXRobXMuCisKKy0gUklCIG1hbmFnZW1lbnQKKyAgICBNb3ZlIHRvIG1vcmUgc2NhbGFibGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBzdXBwb3J0IGFsbCBmbGFncyBpbiBwcmVmaXggcmVnaXN0cmF0aW9ucy4KKworLSBUdW5uZWwgbWFuYWdlbWVudAorICAgIEZvciBodWIgbm9kZXMgdG8gYXV0aGVudGljYXRlIGluY29taW5nIHR1bm5lbCByZXF1ZXN0cyBhbmQgbWFpbnRhaW4gdGhlIHR1bm5lbHMuCisKKy0gRXh0ZW5zaWJsZSBuYW1lLWJhc2VkIHNjb3BpbmcKKyAgICBDb25maWd1cmFibGUgb3JnYW5pemF0aW9uLWJhc2VkIHNjb3BpbmcKZGlmZiAtLWdpdCBhL05GRC9kb2NzL19zdGF0aWMvLmdpdGlnbm9yZSBiL05GRC9kb2NzL19zdGF0aWMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvX3N0YXRpYy8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9fc3RhdGljL25mZC1zdGF0dXMueHNkIGIvTkZEL2RvY3MvX3N0YXRpYy9uZmQtc3RhdHVzLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRiMmYyCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvX3N0YXRpYy9uZmQtc3RhdHVzLnhzZApAQCAtMCwwICsxLDE3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgordGFyZ2V0TmFtZXNwYWNlPSJuZG46L2xvY2FsaG9zdC9uZmQvc3RhdHVzLzEiIHhtbG5zOm5mZD0ibmRuOi9sb2NhbGhvc3QvbmZkL3N0YXR1cy8xIgorZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCis8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5pZGlyZWN0aW9uYWxQYWNrZXRDb3VudGVyc1R5cGUiPgorICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiBuYW1lPSJuSW50ZXJlc3RzIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiBuYW1lPSJuRGF0YXMiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJiaWRpcmVjdGlvbmFsUGFja2V0Q291bnRlcnNUeXBlIj4KKyAgPHhzOnNlcXVlbmNlPgorICAgIDx4czplbGVtZW50IHR5cGU9Im5mZDp1bmlkaXJlY3Rpb25hbFBhY2tldENvdW50ZXJzVHlwZSIgbmFtZT0iaW5jb21pbmdQYWNrZXRzIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ibmZkOnVuaWRpcmVjdGlvbmFsUGFja2V0Q291bnRlcnNUeXBlIiBuYW1lPSJvdXRnb2luZ1BhY2tldHMiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJiaWRpcmVjdGlvbmFsQnl0ZUNvdW50ZXJzVHlwZSI+CisgIDx4czpzZXF1ZW5jZT4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIG5hbWU9ImluY29taW5nQnl0ZXMiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIG5hbWU9Im91dGdvaW5nQnl0ZXMiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmFsU3RhdHVzVHlwZSI+CisgIDx4czpzZXF1ZW5jZT4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czphbnlVUkkiIG5hbWU9Im5mZElkIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2ZXJzaW9uIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6ZGF0ZVRpbWUiIG5hbWU9InN0YXJ0VGltZSIvPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOmRhdGVUaW1lIiBuYW1lPSJjdXJyZW50VGltZSIvPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOmR1cmF0aW9uIiBuYW1lPSJ1cHRpbWUiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIG5hbWU9Im5OYW1lVHJlZUVudHJpZXMiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIG5hbWU9Im5GaWJFbnRyaWVzIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiBuYW1lPSJuUGl0RW50cmllcyIvPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgbmFtZT0ibk1lYXN1cmVtZW50c0VudHJpZXMiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIG5hbWU9Im5Dc0VudHJpZXMiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJuZmQ6YmlkaXJlY3Rpb25hbFBhY2tldENvdW50ZXJzVHlwZSIgbmFtZT0icGFja2V0Q291bnRlcnMiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJjaGFubmVsVHlwZSI+CisgIDx4czpzZXF1ZW5jZT4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czphbnlVUkkiIG5hbWU9ImxvY2FsVXJpIi8+CisgIDwveHM6c2VxdWVuY2U+Cis8L3hzOmNvbXBsZXhUeXBlPgorCis8eHM6Y29tcGxleFR5cGUgbmFtZT0iY2hhbm5lbHNUeXBlIj4KKyAgPHhzOnNlcXVlbmNlPgorICAgIDx4czplbGVtZW50IHR5cGU9Im5mZDpjaGFubmVsVHlwZSIgbmFtZT0iY2hhbm5lbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICA8L3hzOnNlcXVlbmNlPgorPC94czpjb21wbGV4VHlwZT4KKworPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VUeXBlIj4KKyAgPHhzOnNlcXVlbmNlPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgbmFtZT0iZmFjZUlkIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6YW55VVJJIiBuYW1lPSJyZW1vdGVVcmkiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czphbnlVUkkiIG5hbWU9ImxvY2FsVXJpIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6ZHVyYXRpb24iIG5hbWU9ImV4cGlyYXRpb25QZXJpb2QiIG1pbk9jY3Vycz0iMCIvPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmFjZVNjb3BlIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJmYWNlUGVyc2lzdGVuY3kiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImxpbmtUeXBlIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ibmZkOmJpZGlyZWN0aW9uYWxQYWNrZXRDb3VudGVyc1R5cGUiIG5hbWU9InBhY2tldENvdW50ZXJzIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ibmZkOmJpZGlyZWN0aW9uYWxCeXRlQ291bnRlcnNUeXBlIiBuYW1lPSJieXRlQ291bnRlcnMiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJmYWNlc1R5cGUiPgorICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ibmZkOmZhY2VUeXBlIiBuYW1lPSJmYWNlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgIDwveHM6c2VxdWVuY2U+Cis8L3hzOmNvbXBsZXhUeXBlPgorCis8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmV4dEhvcFR5cGUiPgorICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiBuYW1lPSJmYWNlSWQiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIG5hbWU9ImNvc3QiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJmaWJFbnRyeVR5cGUiPgorICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6YW55VVJJIiBuYW1lPSJwcmVmaXgiLz4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJuZXh0SG9wcyI+CisgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJuZmQ6bmV4dEhvcFR5cGUiIG5hbWU9Im5leHRIb3AiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJmaWJUeXBlIj4KKyAgPHhzOnNlcXVlbmNlPgorICAgIDx4czplbGVtZW50IHR5cGU9Im5mZDpmaWJFbnRyeVR5cGUiIG5hbWU9ImZpYkVudHJ5IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgIDwveHM6c2VxdWVuY2U+Cis8L3hzOmNvbXBsZXhUeXBlPgorCis8eHM6Y29tcGxleFR5cGUgbmFtZT0icmliRmxhZ3NUeXBlIj4KKyAgPHhzOnNlcXVlbmNlPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOnN0cmluZyIgbmFtZT0iY2hpbGRJbmhlcml0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJpYkNhcHR1cmUiIG1pbk9jY3Vycz0iMCIvPgorICA8L3hzOnNlcXVlbmNlPgorPC94czpjb21wbGV4VHlwZT4KKworPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJvdXRlVHlwZSI+CisgIDx4czpzZXF1ZW5jZT4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIG5hbWU9ImZhY2VJZCIvPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgbmFtZT0ib3JpZ2luIi8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiBuYW1lPSJjb3N0Ii8+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ibmZkOnJpYkZsYWdzVHlwZSIgbmFtZT0iZmxhZ3MiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpkdXJhdGlvbiIgbmFtZT0iZXhwaXJhdGlvblBlcmlvZCIgbWluT2NjdXJzPSIwIi8+CisgIDwveHM6c2VxdWVuY2U+Cis8L3hzOmNvbXBsZXhUeXBlPgorCis8eHM6Y29tcGxleFR5cGUgbmFtZT0icmliRW50cnlUeXBlIj4KKyAgPHhzOnNlcXVlbmNlPgorICAgIDx4czplbGVtZW50IHR5cGU9InhzOmFueVVSSSIgbmFtZT0icHJlZml4Ii8+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0icm91dGVzIj4KKyAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgIDx4czplbGVtZW50IHR5cGU9Im5mZDpyb3V0ZVR5cGUiIG5hbWU9InJvdXRlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgIDwveHM6c2VxdWVuY2U+Cis8L3hzOmNvbXBsZXhUeXBlPgorCis8eHM6Y29tcGxleFR5cGUgbmFtZT0icmliVHlwZSI+CisgIDx4czpzZXF1ZW5jZT4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJuZmQ6cmliRW50cnlUeXBlIiBuYW1lPSJyaWJFbnRyeSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICA8L3hzOnNlcXVlbmNlPgorPC94czpjb21wbGV4VHlwZT4KKworPHhzOmNvbXBsZXhUeXBlIG5hbWU9InN0cmF0ZWd5VHlwZSI+CisgIDx4czpzZXF1ZW5jZT4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czphbnlVUkkiIG5hbWU9Im5hbWUiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJzdHJhdGVneUNob2ljZVR5cGUiPgorICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6YW55VVJJIiBuYW1lPSJuYW1lc3BhY2UiLz4KKyAgICA8eHM6ZWxlbWVudCB0eXBlPSJuZmQ6c3RyYXRlZ3lUeXBlIiBuYW1lPSJzdHJhdGVneSIvPgorICA8L3hzOnNlcXVlbmNlPgorPC94czpjb21wbGV4VHlwZT4KKworPHhzOmNvbXBsZXhUeXBlIG5hbWU9InN0cmF0ZWd5Q2hvaWNlc1R5cGUiPgorICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmVsZW1lbnQgdHlwZT0ibmZkOnN0cmF0ZWd5Q2hvaWNlVHlwZSIgbmFtZT0ic3RyYXRlZ3lDaG9pY2UiCisgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICA8L3hzOnNlcXVlbmNlPgorPC94czpjb21wbGV4VHlwZT4KKworPHhzOmVsZW1lbnQgbmFtZT0ibmZkU3RhdHVzIj4KKyAgPHhzOmNvbXBsZXhUeXBlPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czplbGVtZW50IHR5cGU9Im5mZDpnZW5lcmFsU3RhdHVzVHlwZSIgbmFtZT0iZ2VuZXJhbFN0YXR1cyIvPgorICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ibmZkOmNoYW5uZWxzVHlwZSIgbmFtZT0iY2hhbm5lbHMiLz4KKyAgICAgIDx4czplbGVtZW50IHR5cGU9Im5mZDpmYWNlc1R5cGUiIG5hbWU9ImZhY2VzIi8+CisgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJuZmQ6ZmliVHlwZSIgbmFtZT0iZmliIi8+CisgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJuZmQ6cmliVHlwZSIgbmFtZT0icmliIi8+CisgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJuZmQ6c3RyYXRlZ3lDaG9pY2VzVHlwZSIgbmFtZT0ic3RyYXRlZ3lDaG9pY2VzIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgPC94czpjb21wbGV4VHlwZT4KKzwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9jb25mLnB5IGIvTkZEL2RvY3MvY29uZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjYxYTFkCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvY29uZi5weQpAQCAtMCwwICsxLDI2OCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgTkZEIC0gTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uIGRvY3VtZW50YXRpb24gYnVpbGQgY29uZmlndXJhdGlvbiBmaWxlLCBjcmVhdGVkIGJ5CisjIHNwaGlueC1xdWlja3N0YXJ0IG9uIFN1biBBcHIgIDYgMTk6NTg6MjIgMjAxNC4KKyMKKyMgVGhpcyBmaWxlIGlzIGV4ZWNmaWxlKClkIHdpdGggdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNldCB0byBpdHMKKyMgY29udGFpbmluZyBkaXIuCisjCisjIE5vdGUgdGhhdCBub3QgYWxsIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZSBwcmVzZW50IGluIHRoaXMKKyMgYXV0b2dlbmVyYXRlZCBmaWxlLgorIworIyBBbGwgY29uZmlndXJhdGlvbiB2YWx1ZXMgaGF2ZSBhIGRlZmF1bHQ7IHZhbHVlcyB0aGF0IGFyZSBjb21tZW50ZWQgb3V0CisjIHNlcnZlIHRvIHNob3cgdGhlIGRlZmF1bHQuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworCisjIElmIGV4dGVuc2lvbnMgKG9yIG1vZHVsZXMgdG8gZG9jdW1lbnQgd2l0aCBhdXRvZG9jKSBhcmUgaW4gYW5vdGhlciBkaXJlY3RvcnksCisjIGFkZCB0aGVzZSBkaXJlY3RvcmllcyB0byBzeXMucGF0aCBoZXJlLiBJZiB0aGUgZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZQorIyBkb2N1bWVudGF0aW9uIHJvb3QsIHVzZSBvcy5wYXRoLmFic3BhdGggdG8gbWFrZSBpdCBhYnNvbHV0ZSwgbGlrZSBzaG93biBoZXJlLgorI3N5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgoJy4nKSkKKworIyAtLSBHZW5lcmFsIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgeW91ciBkb2N1bWVudGF0aW9uIG5lZWRzIGEgbWluaW1hbCBTcGhpbnggdmVyc2lvbiwgc3RhdGUgaXQgaGVyZS4KKyNuZWVkc19zcGhpbnggPSAnMS4wJworCisjIEFkZCBhbnkgU3BoaW54IGV4dGVuc2lvbiBtb2R1bGUgbmFtZXMgaGVyZSwgYXMgc3RyaW5ncy4gVGhleSBjYW4gYmUKKyMgZXh0ZW5zaW9ucyBjb21pbmcgd2l0aCBTcGhpbnggKG5hbWVkICdzcGhpbnguZXh0LionKSBvciB5b3VyIGN1c3RvbQorIyBvbmVzLgorZXh0ZW5zaW9ucyA9IFsKKyAgICAnc3BoaW54LmV4dC50b2RvJywKK10KKworZGVmIGFkZEV4dGVuc2lvbklmRXhpc3RzKGV4dGVuc2lvbik6CisgICAgdHJ5OgorICAgICAgICBfX2ltcG9ydF9fKGV4dGVuc2lvbikKKyAgICAgICAgZXh0ZW5zaW9ucy5hcHBlbmQoZXh0ZW5zaW9uKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiRXh0ZW5zaW9uICclcycgaW4gbm90IGF2YWlsYWJsZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIGRvY3VtZW50YXRpb24gbWF5IG5vdCBidWlsZCBjb3JyZWN0bHkuXG4iICUgZXh0ZW5zaW9uKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJUbyBpbnN0YWxsLCB1c2UgXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgc3VkbyBwaXAgaW5zdGFsbCAlc1xuIiAlIGV4dGVuc2lvbi5yZXBsYWNlKCcuJywgJy0nKSkKKworYWRkRXh0ZW5zaW9uSWZFeGlzdHMoJ3NwaGlueGNvbnRyaWIuZG94eWxpbmsnKQorCitpZiBvcy5nZXRlbnYoJ0dPT0dMRV9BTkFMWVRJQ1MnLCBOb25lKToKKyAgICBhZGRFeHRlbnNpb25JZkV4aXN0cygnc3BoaW54Y29udHJpYi5nb29nbGVhbmFseXRpY3MnKQorCisjIEFkZCBhbnkgcGF0aHMgdGhhdCBjb250YWluIHRlbXBsYXRlcyBoZXJlLCByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KK3RlbXBsYXRlc19wYXRoID0gWydfdGVtcGxhdGVzJ10KKworIyBUaGUgc3VmZml4IG9mIHNvdXJjZSBmaWxlbmFtZXMuCitzb3VyY2Vfc3VmZml4ID0gJy5yc3QnCisKKyMgVGhlIGVuY29kaW5nIG9mIHNvdXJjZSBmaWxlcy4KKyNzb3VyY2VfZW5jb2RpbmcgPSAndXRmLTgtc2lnJworCisjIFRoZSBtYXN0ZXIgdG9jdHJlZSBkb2N1bWVudC4KK21hc3Rlcl9kb2MgPSAnaW5kZXgnCisKKyMgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvamVjdC4KK3Byb2plY3QgPSB1J05GRCAtIE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbicKK2NvcHlyaWdodCA9IHUnMjAxNCwgTmFtZWQgRGF0YSBOZXR3b3JraW5nIFByb2plY3QnCisKKyMgVGhlIHZlcnNpb24gaW5mbyBmb3IgdGhlIHByb2plY3QgeW91J3JlIGRvY3VtZW50aW5nLCBhY3RzIGFzIHJlcGxhY2VtZW50IGZvcgorIyB8dmVyc2lvbnwgYW5kIHxyZWxlYXNlfCwgYWxzbyB1c2VkIGluIHZhcmlvdXMgb3RoZXIgcGxhY2VzIHRocm91Z2hvdXQgdGhlCisjIGJ1aWx0IGRvY3VtZW50cy4KKworIyBUaGUgbGFuZ3VhZ2UgZm9yIGNvbnRlbnQgYXV0b2dlbmVyYXRlZCBieSBTcGhpbnguIFJlZmVyIHRvIGRvY3VtZW50YXRpb24KKyMgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLgorI2xhbmd1YWdlID0gTm9uZQorCisjIFRoZXJlIGFyZSB0d28gb3B0aW9ucyBmb3IgcmVwbGFjaW5nIHx0b2RheXw6IGVpdGhlciwgeW91IHNldCB0b2RheSB0byBzb21lCisjIG5vbi1mYWxzZSB2YWx1ZSwgdGhlbiBpdCBpcyB1c2VkOgorI3RvZGF5ID0gJycKKyMgRWxzZSwgdG9kYXlfZm10IGlzIHVzZWQgYXMgdGhlIGZvcm1hdCBmb3IgYSBzdHJmdGltZSBjYWxsLgorI3RvZGF5X2ZtdCA9ICclQiAlZCwgJVknCisKKyMgTGlzdCBvZiBwYXR0ZXJucywgcmVsYXRpdmUgdG8gc291cmNlIGRpcmVjdG9yeSwgdGhhdCBtYXRjaCBmaWxlcyBhbmQKKyMgZGlyZWN0b3JpZXMgdG8gaWdub3JlIHdoZW4gbG9va2luZyBmb3Igc291cmNlIGZpbGVzLgorZXhjbHVkZV9wYXR0ZXJucyA9IFtdCisKKyMgVGhlIHJlU1QgZGVmYXVsdCByb2xlICh1c2VkIGZvciB0aGlzIG1hcmt1cDogYHRleHRgKSB0byB1c2UgZm9yIGFsbAorIyBkb2N1bWVudHMuCisjZGVmYXVsdF9yb2xlID0gTm9uZQorCisjIElmIHRydWUsICcoKScgd2lsbCBiZSBhcHBlbmRlZCB0byA6ZnVuYzogZXRjLiBjcm9zcy1yZWZlcmVuY2UgdGV4dC4KKyNhZGRfZnVuY3Rpb25fcGFyZW50aGVzZXMgPSBUcnVlCisKKyMgSWYgdHJ1ZSwgdGhlIGN1cnJlbnQgbW9kdWxlIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gYWxsIGRlc2NyaXB0aW9uCisjIHVuaXQgdGl0bGVzIChzdWNoIGFzIC4uIGZ1bmN0aW9uOjopLgorI2FkZF9tb2R1bGVfbmFtZXMgPSBUcnVlCisKKyMgSWYgdHJ1ZSwgc2VjdGlvbmF1dGhvciBhbmQgbW9kdWxlYXV0aG9yIGRpcmVjdGl2ZXMgd2lsbCBiZSBzaG93biBpbiB0aGUKKyMgb3V0cHV0LiBUaGV5IGFyZSBpZ25vcmVkIGJ5IGRlZmF1bHQuCisjc2hvd19hdXRob3JzID0gRmFsc2UKKworIyBUaGUgbmFtZSBvZiB0aGUgUHlnbWVudHMgKHN5bnRheCBoaWdobGlnaHRpbmcpIHN0eWxlIHRvIHVzZS4KK3B5Z21lbnRzX3N0eWxlID0gJ3NwaGlueCcKKworIyBBIGxpc3Qgb2YgaWdub3JlZCBwcmVmaXhlcyBmb3IgbW9kdWxlIGluZGV4IHNvcnRpbmcuCisjbW9kaW5kZXhfY29tbW9uX3ByZWZpeCA9IFtdCisKKyMgSWYgdHJ1ZSwga2VlcCB3YXJuaW5ncyBhcyAic3lzdGVtIG1lc3NhZ2UiIHBhcmFncmFwaHMgaW4gdGhlIGJ1aWx0IGRvY3VtZW50cy4KKyNrZWVwX3dhcm5pbmdzID0gRmFsc2UKKworCisjIC0tIE9wdGlvbnMgZm9yIEhUTUwgb3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgdGhlbWUgdG8gdXNlIGZvciBIVE1MIGFuZCBIVE1MIEhlbHAgcGFnZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCisjIGEgbGlzdCBvZiBidWlsdGluIHRoZW1lcy4KKyMgaHRtbF90aGVtZSA9ICdkZWZhdWx0JworaHRtbF90aGVtZSA9ICduYW1lZF9kYXRhX3RoZW1lJworCisjIFRoZW1lIG9wdGlvbnMgYXJlIHRoZW1lLXNwZWNpZmljIGFuZCBjdXN0b21pemUgdGhlIGxvb2sgYW5kIGZlZWwgb2YgYSB0aGVtZQorIyBmdXJ0aGVyLiAgRm9yIGEgbGlzdCBvZiBvcHRpb25zIGF2YWlsYWJsZSBmb3IgZWFjaCB0aGVtZSwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uLgorI2h0bWxfdGhlbWVfb3B0aW9ucyA9IHt9CisKKyMgQWRkIGFueSBwYXRocyB0aGF0IGNvbnRhaW4gY3VzdG9tIHRoZW1lcyBoZXJlLCByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KK2h0bWxfdGhlbWVfcGF0aCA9IFsnLi8nXQorCisjIFRoZSBuYW1lIGZvciB0aGlzIHNldCBvZiBTcGhpbnggZG9jdW1lbnRzLiAgSWYgTm9uZSwgaXQgZGVmYXVsdHMgdG8KKyMgIjxwcm9qZWN0PiB2PHJlbGVhc2U+IGRvY3VtZW50YXRpb24iLgorI2h0bWxfdGl0bGUgPSBOb25lCisKKyMgQSBzaG9ydGVyIHRpdGxlIGZvciB0aGUgbmF2aWdhdGlvbiBiYXIuICBEZWZhdWx0IGlzIHRoZSBzYW1lIGFzIGh0bWxfdGl0bGUuCisjaHRtbF9zaG9ydF90aXRsZSA9IE5vbmUKKworIyBUaGUgbmFtZSBvZiBhbiBpbWFnZSBmaWxlIChyZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeSkgdG8gcGxhY2UgYXQgdGhlIHRvcAorIyBvZiB0aGUgc2lkZWJhci4KKyNodG1sX2xvZ28gPSBOb25lCisKKyMgVGhlIG5hbWUgb2YgYW4gaW1hZ2UgZmlsZSAod2l0aGluIHRoZSBzdGF0aWMgcGF0aCkgdG8gdXNlIGFzIGZhdmljb24gb2YgdGhlCisjIGRvY3MuICBUaGlzIGZpbGUgc2hvdWxkIGJlIGEgV2luZG93cyBpY29uIGZpbGUgKC5pY28pIGJlaW5nIDE2eDE2IG9yIDMyeDMyCisjIHBpeGVscyBsYXJnZS4KKyNodG1sX2Zhdmljb24gPSBOb25lCisKKyMgQWRkIGFueSBwYXRocyB0aGF0IGNvbnRhaW4gY3VzdG9tIHN0YXRpYyBmaWxlcyAoc3VjaCBhcyBzdHlsZSBzaGVldHMpIGhlcmUsCisjIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LiBUaGV5IGFyZSBjb3BpZWQgYWZ0ZXIgdGhlIGJ1aWx0aW4gc3RhdGljIGZpbGVzLAorIyBzbyBhIGZpbGUgbmFtZWQgImRlZmF1bHQuY3NzIiB3aWxsIG92ZXJ3cml0ZSB0aGUgYnVpbHRpbiAiZGVmYXVsdC5jc3MiLgoraHRtbF9zdGF0aWNfcGF0aCA9IFsnX3N0YXRpYyddCisKKyMgQWRkIGFueSBleHRyYSBwYXRocyB0aGF0IGNvbnRhaW4gY3VzdG9tIGZpbGVzIChzdWNoIGFzIHJvYm90cy50eHQgb3IKKyMgLmh0YWNjZXNzKSBoZXJlLCByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4gVGhlc2UgZmlsZXMgYXJlIGNvcGllZAorIyBkaXJlY3RseSB0byB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnRhdGlvbi4KKyNodG1sX2V4dHJhX3BhdGggPSBbXQorCisjIElmIG5vdCAnJywgYSAnTGFzdCB1cGRhdGVkIG9uOicgdGltZXN0YW1wIGlzIGluc2VydGVkIGF0IGV2ZXJ5IHBhZ2UgYm90dG9tLAorIyB1c2luZyB0aGUgZ2l2ZW4gc3RyZnRpbWUgZm9ybWF0LgorI2h0bWxfbGFzdF91cGRhdGVkX2ZtdCA9ICclYiAlZCwgJVknCisKKyMgSWYgdHJ1ZSwgU21hcnR5UGFudHMgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgcXVvdGVzIGFuZCBkYXNoZXMgdG8KKyMgdHlwb2dyYXBoaWNhbGx5IGNvcnJlY3QgZW50aXRpZXMuCisjaHRtbF91c2Vfc21hcnR5cGFudHMgPSBUcnVlCisKKyMgQ3VzdG9tIHNpZGViYXIgdGVtcGxhdGVzLCBtYXBzIGRvY3VtZW50IG5hbWVzIHRvIHRlbXBsYXRlIG5hbWVzLgorI2h0bWxfc2lkZWJhcnMgPSB7fQorCisjIEFkZGl0aW9uYWwgdGVtcGxhdGVzIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIHRvIHBhZ2VzLCBtYXBzIHBhZ2UgbmFtZXMgdG8KKyMgdGVtcGxhdGUgbmFtZXMuCisjaHRtbF9hZGRpdGlvbmFsX3BhZ2VzID0ge30KKworIyBJZiBmYWxzZSwgbm8gbW9kdWxlIGluZGV4IGlzIGdlbmVyYXRlZC4KKyNodG1sX2RvbWFpbl9pbmRpY2VzID0gVHJ1ZQorCisjIElmIGZhbHNlLCBubyBpbmRleCBpcyBnZW5lcmF0ZWQuCisjaHRtbF91c2VfaW5kZXggPSBUcnVlCisKKyMgSWYgdHJ1ZSwgdGhlIGluZGV4IGlzIHNwbGl0IGludG8gaW5kaXZpZHVhbCBwYWdlcyBmb3IgZWFjaCBsZXR0ZXIuCisjaHRtbF9zcGxpdF9pbmRleCA9IEZhbHNlCisKKyMgSWYgdHJ1ZSwgbGlua3MgdG8gdGhlIHJlU1Qgc291cmNlcyBhcmUgYWRkZWQgdG8gdGhlIHBhZ2VzLgorI2h0bWxfc2hvd19zb3VyY2VsaW5rID0gVHJ1ZQorCisjIElmIHRydWUsICJDcmVhdGVkIHVzaW5nIFNwaGlueCIgaXMgc2hvd24gaW4gdGhlIEhUTUwgZm9vdGVyLiBEZWZhdWx0IGlzIFRydWUuCisjaHRtbF9zaG93X3NwaGlueCA9IFRydWUKKworIyBJZiB0cnVlLCAiKEMpIENvcHlyaWdodCAuLi4iIGlzIHNob3duIGluIHRoZSBIVE1MIGZvb3Rlci4gRGVmYXVsdCBpcyBUcnVlLgorI2h0bWxfc2hvd19jb3B5cmlnaHQgPSBUcnVlCisKKyMgSWYgdHJ1ZSwgYW4gT3BlblNlYXJjaCBkZXNjcmlwdGlvbiBmaWxlIHdpbGwgYmUgb3V0cHV0LCBhbmQgYWxsIHBhZ2VzIHdpbGwKKyMgY29udGFpbiBhIDxsaW5rPiB0YWcgcmVmZXJyaW5nIHRvIGl0LiAgVGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIG11c3QgYmUgdGhlCisjIGJhc2UgVVJMIGZyb20gd2hpY2ggdGhlIGZpbmlzaGVkIEhUTUwgaXMgc2VydmVkLgorI2h0bWxfdXNlX29wZW5zZWFyY2ggPSAnJworCisjIFRoaXMgaXMgdGhlIGZpbGUgbmFtZSBzdWZmaXggZm9yIEhUTUwgZmlsZXMgKGUuZy4gIi54aHRtbCIpLgoraHRtbF9maWxlX3N1ZmZpeCA9ICIuaHRtbCIKKworIyBPdXRwdXQgZmlsZSBiYXNlIG5hbWUgZm9yIEhUTUwgaGVscCBidWlsZGVyLgoraHRtbGhlbHBfYmFzZW5hbWUgPSAnbmZkLWRvY3MnCisKKworIyAtLSBPcHRpb25zIGZvciBMYVRlWCBvdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2xhdGV4X2VsZW1lbnRzID0geworIyBUaGUgcGFwZXIgc2l6ZSAoJ2xldHRlcnBhcGVyJyBvciAnYTRwYXBlcicpLgorIydwYXBlcnNpemUnOiAnbGV0dGVycGFwZXInLAorCisjIFRoZSBmb250IHNpemUgKCcxMHB0JywgJzExcHQnIG9yICcxMnB0JykuCisjJ3BvaW50c2l6ZSc6ICcxMHB0JywKKworIyBBZGRpdGlvbmFsIHN0dWZmIGZvciB0aGUgTGFUZVggcHJlYW1ibGUuCisjJ3ByZWFtYmxlJzogJycsCit9CisKKyMgR3JvdXBpbmcgdGhlIGRvY3VtZW50IHRyZWUgaW50byBMYVRlWCBmaWxlcy4gTGlzdCBvZiB0dXBsZXMKKyMgKHNvdXJjZSBzdGFydCBmaWxlLCB0YXJnZXQgbmFtZSwgdGl0bGUsCisjICBhdXRob3IsIGRvY3VtZW50Y2xhc3MgW2hvd3RvLCBtYW51YWwsIG9yIG93biBjbGFzc10pLgorbGF0ZXhfZG9jdW1lbnRzID0gWworICAoJ2luZGV4JywgJ25mZC1kb2NzLnRleCcsIHUnTkZEIC0gTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uIERvY3VtZW50YXRpb24nLAorICAgdSdOYW1lZCBEYXRhIE5ldHdvcmtpbmcgUHJvamVjdCcsICdtYW51YWwnKSwKK10KKworIyBUaGUgbmFtZSBvZiBhbiBpbWFnZSBmaWxlIChyZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeSkgdG8gcGxhY2UgYXQgdGhlIHRvcCBvZgorIyB0aGUgdGl0bGUgcGFnZS4KKyNsYXRleF9sb2dvID0gTm9uZQorCisjIEZvciAibWFudWFsIiBkb2N1bWVudHMsIGlmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0b3BsZXZlbCBoZWFkaW5ncyBhcmUgcGFydHMsCisjIG5vdCBjaGFwdGVycy4KKyNsYXRleF91c2VfcGFydHMgPSBGYWxzZQorCisjIElmIHRydWUsIHNob3cgcGFnZSByZWZlcmVuY2VzIGFmdGVyIGludGVybmFsIGxpbmtzLgorI2xhdGV4X3Nob3dfcGFnZXJlZnMgPSBGYWxzZQorCisjIElmIHRydWUsIHNob3cgVVJMIGFkZHJlc3NlcyBhZnRlciBleHRlcm5hbCBsaW5rcy4KKyNsYXRleF9zaG93X3VybHMgPSBGYWxzZQorCisjIERvY3VtZW50cyB0byBhcHBlbmQgYXMgYW4gYXBwZW5kaXggdG8gYWxsIG1hbnVhbHMuCisjbGF0ZXhfYXBwZW5kaWNlcyA9IFtdCisKKyMgSWYgZmFsc2UsIG5vIG1vZHVsZSBpbmRleCBpcyBnZW5lcmF0ZWQuCisjbGF0ZXhfZG9tYWluX2luZGljZXMgPSBUcnVlCisKKworIyAtLSBPcHRpb25zIGZvciBtYW51YWwgcGFnZSBvdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgT25lIGVudHJ5IHBlciBtYW51YWwgcGFnZS4gTGlzdCBvZiB0dXBsZXMKKyMgKHNvdXJjZSBzdGFydCBmaWxlLCBuYW1lLCBkZXNjcmlwdGlvbiwgYXV0aG9ycywgbWFudWFsIHNlY3Rpb24pLgorbWFuX3BhZ2VzID0gWworICAgICgnbWFucGFnZXMvbmZkJywgJ25mZCcsIHUnTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uJywgTm9uZSwgMSksCisgICAgKCdtYW5wYWdlcy9ucmQnLCAnbnJkJywgdSdORkQgUklCIERhZW1vbicsIE5vbmUsIDEpLAorICAgICgnbWFucGFnZXMvbmRuLWF1dG9jb25maWctc2VydmVyJywgJ25kbi1hdXRvY29uZmlnLXNlcnZlcicsCisgICAgICAgIHUnTkZEIEF1dG8tY29uZmlndXJhdGlvbiBTZXJ2ZXInLCBOb25lLCAxKSwKKyAgICAoJ21hbnBhZ2VzL25kbi1hdXRvY29uZmlnJywgJ25kbi1hdXRvY29uZmlnJywKKyAgICAgICAgdSdORkQgQXV0by1jb25maWd1cmF0aW9uIENsaWVudCcsIE5vbmUsIDEpLAorICAgICgnbWFucGFnZXMvbmZkYycsICduZmRjJywKKyAgICAgICAgdSdORkQgdXRpbGl0eSB0byBtYW5pcHVsYXRlIHRoZSBmb3J3YXJkaW5nIHRhYmxlIChGSUIpJywgTm9uZSwgMSksCisgICAgKCdtYW5wYWdlcy9uZG4tdGx2LXBlZWsnLCAnbmRuLXRsdi1wZWVrJywgdSdORkQgY29uc3VtZXInLCBOb25lLCAxKSwKKyAgICAoJ21hbnBhZ2VzL25kbi10bHYtcG9rZScsICduZG4tdGx2LXBva2UnLCB1J05GRCBwcm9kdWNlcicsIE5vbmUsIDEpLAorICAgICgnbWFucGFnZXMvbmZkLWF1dG9yZWcnLCAnbmZkLWF1dG9yZWcnLCB1J05GRCBBdXRvLXJlZ2lzdHJhdGlvbiBTZXJ2ZXInLCBOb25lLCAxKSwKKyAgICAoJ21hbnBhZ2VzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXInLCAnbmZkLXN0YXR1cy1odHRwLXNlcnZlcicsCisgICAgICAgIHUnTkZEIHN0YXR1cyBIVFRQIHNlcnZlcicsIE5vbmUsIDEpLAorICAgICgnbWFucGFnZXMvbmZkLXN0YXR1cycsICduZmQtc3RhdHVzJywgdSdDb21tYW5kLWxpbmUgdXRpbGl0eSB0byBzaG93IE5GRCBzdGF0dXMnLCBOb25lLCAxKSwKK10KKworCisjIElmIHRydWUsIHNob3cgVVJMIGFkZHJlc3NlcyBhZnRlciBleHRlcm5hbCBsaW5rcy4KKyNtYW5fc2hvd191cmxzID0gRmFsc2UKKworZG94eWxpbmsgPSB7CisgICdORkQnIDogKCdORkQudGFnJywgJ2RveHlnZW4vJyksCit9CisKK2lmIG9zLmdldGVudignR09PR0xFX0FOQUxZVElDUycsIE5vbmUpOgorICAgIGdvb2dsZWFuYWx5dGljc19pZCA9IG9zLmVudmlyb25bJ0dPT0dMRV9BTkFMWVRJQ1MnXQorICAgIGdvb2dsZWFuYWx5dGljc19lbmFibGVkID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvTkZEL2RvY3MvZG94eWdlbi5jb25mLmluIGIvTkZEL2RvY3MvZG94eWdlbi5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNThhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9kb3h5Z2VuLmNvbmYuaW4KQEAgLTAsMCArMSwyMjg2IEBACisjIERveHlmaWxlIDEuOC41CisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0LgorIworIyBBbGwgdGV4dCBhZnRlciBhIGRvdWJsZSBoYXNoICgjIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIHBsYWNlZCBpbgorIyBmcm9udCBvZiB0aGUgVEFHIGl0IGlzIHByZWNlZGluZy4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBzaW5nbGUgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KKyMgVGhlIGZvcm1hdCBpczoKKyMgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cywgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoXCIgXCIpLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIHRleHQKKyMgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udgorIyBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYKKyMgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKKworIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBhIHNlcXVlbmNlIG9mIHdvcmRzIHN1cnJvdW5kZWQgYnkKKyMgZG91YmxlLXF1b3RlcywgdW5sZXNzIHlvdSBhcmUgdXNpbmcgRG94eXdpemFyZCkgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlCisjIHByb2plY3QgZm9yIHdoaWNoIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlCisjIHRpdGxlIG9mIG1vc3QgZ2VuZXJhdGVkIHBhZ2VzIGFuZCBpbiBhIGZldyBvdGhlciBwbGFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBNeSBQcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIk5GRCAtIE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbiIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSBAVkVSU0lPTkAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9CisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYW4gbG9nbyBvciBpY29uIHRoYXQgaXMgaW5jbHVkZWQgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NSBwaXhlbHMKKyMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBsb2dvCisjIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0KKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jcy9kb3h5Z2VuCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gWUVTCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLCBDaGluZXNlLQorIyBUcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoLCBFc3BlcmFudG8sIEZhcnNpLAorIyBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuLAorIyBLb3JlYW4sIEtvcmVhbi1lbiwgTGF0dmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLCBQb2xpc2gsCisjIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLCBTZXJiaWFuLCBTbG92YWssIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsCisjIFR1cmtpc2gsIFVrcmFpbmlhbiBhbmQgVmlldG5hbWVzZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEVuZ2xpc2guCisKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCisKKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIworIyBOb3RlOiBJZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciB0aGF0IGlzCisjIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kCisjIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIHRleHQKKyMgYW5kIHRoZSByZXN1bHQsIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIHVzZWQgYXMgdGhlIGFubm90YXRlZAorIyB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiBJZiBsZWZ0IGJsYW5rLCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoJG5hbWUgaXMgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mCisjIHRoZSBlbnRpdHkpOlRoZSAkbmFtZSBjbGFzcywgVGhlICRuYW1lIHdpZGdldCwgVGhlICRuYW1lIGZpbGUsIGlzLCBwcm92aWRlcywKKyMgc3BlY2lmaWVzLCBjb250YWlucywgcmVwcmVzZW50cywgYSwgYW4gYW5kIHRoZS4KKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9CisKKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5IRVJJVEVEX01FTUIgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBzaG93IGFsbAorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UKKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQKKyMgb3BlcmF0b3JzIG9mIHRoZSBiYXNlIGNsYXNzZXMgd2lsbCBub3QgYmUgc2hvd24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IFlFUworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PCisKKyMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KKyMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAorIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bworIyBzdHJpcC4KKyMKKyMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKKyMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9CisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyIChidXQKKyMgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIGRvZXNuJ3QKKyMgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZQorIyBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFkb2Mtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFkb2Mtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtCisjIHN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZgorIyBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUworCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdAorIyBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZgorIyBzZXQgdG8gTk8sIHRoZSBRdC1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cworIyByZXF1aXJpbmcgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1FUX0FVVE9CUklFRiAgICAgICAgICAgPSBOTworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQorIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcworIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcworIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KKyMKKyMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQorIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlIGEKKyMgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwgYmUKKyMgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8KKworIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4gRG94eWdlbgorIyB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMTYsIGRlZmF1bHQgdmFsdWU6IDQuCisKK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA0CisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0IGFzIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm06CisjIG5hbWU9dmFsdWUKKyMgRm9yIGV4YW1wbGUgYWRkaW5nCisjICJzaWRlZWZmZWN0PUBwYXIgU2lkZSBFZmZlY3RzOlxuIgorIyB3aWxsIGFsbG93IHlvdSB0byBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZworIyAiU2lkZSBFZmZlY3RzOiIuIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0CisjIG5ld2xpbmVzLgorCitBTElBU0VTICAgICAgICAgICAgICAgID0KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKKyMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAorIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAorIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKKyMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCisjIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETC4gRm9yIGluc3RhbmNlIHRvIG1ha2UKKyMgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMKKyMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlIEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQorCisjIElmIHRoZSBNQVJLRE9XTl9TVVBQT1JUIHRhZyBpcyBlbmFibGVkIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbCBjb21tZW50cworIyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlCisjIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4KKyMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdSBjYW4KKyMgbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLiBEaXNhYmxlIG9ubHkgaW4KKyMgY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTCisKKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZAorIyBjbGFzc2VzLCBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuCisjIGJlIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQKKyMgb3IgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTCisKKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudAorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQgc2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsKKyMgdmVyc3VzIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gWUVTCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCAoc2VlOgorIyBodHRwOi8vd3d3LnJpdmVyYmFua2NvbXB1dGluZy5jby51ay9zb2Z0d2FyZS9zaXAvaW50cm8pIHNvdXJjZXMgb25seS4gRG94eWdlbgorIyB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljIGluc3RlYWQKKyMgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZQorIyBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyB3aWxsIG1ha2UKKyMgZG94eWdlbiB0byByZXBsYWNlIHRoZSBnZXQgYW5kIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIHNldHRpbmcgYSBzaW1wbGUKKyMgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIG1ldGhvZHMgYW55d2F5LCB5b3UKKyMgc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUworCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MKKyMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgdG8gYWxsb3cgY2xhc3MgbWVtYmVyIGdyb3VwcyBvZiB0aGUgc2FtZSB0eXBlCisjIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYSBzdWJncm91cCBvZiB0aGF0CisjIHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0byBOTyB0byBwcmV2ZW50CisjIHN1Ymdyb3VwaW5nLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSBkb25lIHBlciBjbGFzcyB1c2luZyB0aGUKKyMgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIElOTElORV9HUk9VUEVEX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGNsYXNzZXMsIHN0cnVjdHMgYW5kIHVuaW9ucworIyBhcmUgc2hvd24gaW5zaWRlIHRoZSBncm91cCBpbiB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZCAoZS5nLiB1c2luZyBcaW5ncm91cCkKKyMgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWAorIyBhbmQgUlRGKS4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCB3b3JrIGluIGNvbWJpbmF0aW9uIHdpdGgKKyMgU0VQQVJBVEVfTUVNQkVSX1BBR0VTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTworCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucworIyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIG9yIHNpbXBsZSB0eXBlZGVmIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGdyb3VwIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldAorIyB0byBOTywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQKKyMgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCB0YWcgaXMgZW5hYmxlZCwgYSB0eXBlZGVmIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IKKyMgZW51bSBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28KKyMgdHlwZWRlZiBzdHJ1Y3QgVHlwZVMge30gVHlwZVQsIHdpbGwgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgc3RydWN0CisjIHdpdGggbmFtZSBUeXBlVC4gV2hlbiBkaXNhYmxlZCB0aGUgdHlwZWRlZiB3aWxsIGFwcGVhciBhcyBhIG1lbWJlciBvZiBhIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseSBiZQorIyB1c2VmdWwgZm9yIEMgY29kZSBpbiBjYXNlIHRoZSBjb2RpbmcgY29udmVudGlvbiBkaWN0YXRlcyB0aGF0IGFsbCBjb21wb3VuZAorIyB0eXBlcyBhcmUgdHlwZWRlZidlZCBhbmQgb25seSB0aGUgdHlwZWRlZiBpcyByZWZlcmVuY2VkLCBuZXZlciB0aGUgdGFnIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyB3aWxsCisjIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8KKyMgb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4gRG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0CisjIGZvciBKYXZhIHNvdXJjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKKworIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8gb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTworCisjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIG5hbWUgb2YKKyMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdCBhbm9ueW1vdXMgbmFtZXNwYWNlCisjIGFyZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIGluc2lkZSBkb2N1bWVudGVkIGNsYXNzZXMgb3IgZmlsZXMuIElmIHNldCB0byBOTyB0aGVzZQorIyBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIElmIHNldAorIyB0byBOTyB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMKKyMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTyB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHR5cGVkIGFmdGVyIGEKKyMgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gdGhlIGRvY3VtZW50YXRpb24KKyMgd2lsbCBiZSBleGNsdWRlZC4gU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHB1dCBhIGxpc3Qgb2YKKyMgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZpbGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbGlzdCBpbmNsdWRlCisjIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgdGFnIFtpbmxpbmVdIGlzIGluc2VydGVkIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgorIyBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdCBjb25zdHJ1Y3RvcnMgYW5kCisjIGRlc3RydWN0b3JzIGFyZSBsaXN0ZWQgZmlyc3QuIElmIHNldCB0byBOTyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZQorIyByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5IFNPUlRfQlJJRUZfRE9DUyBhbmQgU09SVF9NRU1CRVJfRE9DUy4KKyMgTm90ZTogSWYgU09SVF9CUklFRl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nIGJyaWVmCisjIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBOb3RlOiBJZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nCisjIGRldGFpbGVkIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTworCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGhpZXJhcmNoeQorIyBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PIHRoZSBncm91cCBuYW1lcyB3aWxsCisjIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQorIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKKyMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKKyMgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgorIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KKyMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKKyMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCisjIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCisjIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZQorIyB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8gY29tbWFuZHMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUKKyMgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUgYnVnCisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pCisjIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKKworIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgPHNlY3Rpb25fbGFiZWw+IC4uLiBcZW5kaWYgYW5kIFxjb25kIDxzZWN0aW9uX2xhYmVsPgorIyAuLi4gXGVuZGNvbmQgYmxvY2tzLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0KKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0aGF0IHRoZQorIyBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gLyBkZWZpbmUgY2FuIGhhdmUgZm9yIGl0IHRvIGFwcGVhciBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQgaGVyZQorIyBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiBUaGUKKyMgYXBwZWFyYW5jZSBvZiB0aGUgdmFsdWUgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyAvIGRlZmluZXMgY2FuIGJlCisjIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyIGNvbW1hbmQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiAzMC4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCisKKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGF0CisjIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUgbGlzdAorIyB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuIFRoaXMKKyMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3CisjIChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIGNvbW1hbmQgaW5wdXQtZmlsZSwgd2hlcmUgY29tbWFuZCBpcyB0aGUgdmFsdWUgb2YgdGhlCisjIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgaW5wdXQtZmlsZSBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlIHByb3ZpZGVkCisjIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZCBhcyB0aGUgZmlsZQorIyB2ZXJzaW9uLiBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPQorCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkCisjIGJ5IGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCisjIG91dHB1dCBmaWxlcyBpbiBhbiBvdXRwdXQgZm9ybWF0IGluZGVwZW5kZW50IHdheS4gVG8gY3JlYXRlIHRoZSBsYXlvdXQgZmlsZQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uIFlvdSBjYW4KKyMgb3B0aW9uYWxseSBzcGVjaWZ5IGEgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQgRG94eWdlbkxheW91dC54bWwKKyMgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgZmlsZS4KKyMKKyMgTm90ZSB0aGF0IGlmIHlvdSBydW4gZG94eWdlbiBmcm9tIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBmaWxlIGNhbGxlZAorIyBEb3h5Z2VuTGF5b3V0LnhtbCwgZG94eWdlbiB3aWxsIHBhcnNlIGl0IGF1dG9tYXRpY2FsbHkgZXZlbiBpZiB0aGUgTEFZT1VUX0ZJTEUKKyMgdGFnIGlzIGxlZnQgZW1wdHkuCisKK0xBWU9VVF9GSUxFICAgICAgICAgICAgPQorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gRG8gbm90IHVzZSBmaWxlIG5hbWVzIHdpdGggc3BhY2VzLCBiaWJ0ZXggY2Fubm90IGhhbmRsZSB0aGVtLiBTZWUKKyMgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIHRvCisjIHN0YW5kYXJkIG91dHB1dCBieSBkb3h5Z2VuLiBJZiBRVUlFVCBpcyBzZXQgdG8gWUVTIHRoaXMgaW1wbGllcyB0aGF0IHRoZQorIyBtZXNzYWdlcyBhcmUgb2ZmLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1FVSUVUICAgICAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoIHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUKKyMgd2FybmluZ3MgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnCisjIHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX0RPQ19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lIHBhcmFtZXRlcnMKKyMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcKKyMgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IgZnVuY3Rpb25zIHRoYXQKKyMgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMgb3IgcmV0dXJuCisjIHZhbHVlLiBJZiBzZXQgdG8gTk8gZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlcgorIyBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IFlFUworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgorIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKKyMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCisjIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKKyMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQorIyBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgorIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyMgZXJyb3IgKHN0ZGVycikuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSBteWZpbGUuY3BwIG9yCisjIGRpcmVjdG9yaWVzIGxpa2UgL3Vzci9zcmMvbXlwcm9qZWN0LiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgd2l0aAorIyBzcGFjZXMuCisjIE5vdGU6IElmIHRoaXMgdGFnIGlzIGVtcHR5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZC4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9IGNvcmUvIGRhZW1vbi8KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcworIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgorIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCisjIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayB0aGUKKyMgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsICouYysrLCAqLmphdmEsICouaWksCisjICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsICouaGgsICouaHh4LCAqLmhwcCwKKyMgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywgKi5tLCAqLm1hcmtkb3duLAorIyAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5mOTAsICouZiwgKi5mb3IsICoudGNsLCAqLnZoZCwgKi52aGRsLCAqLnVjZiwKKyMgKi5xc2YsICouYXMgYW5kICouanMuCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPQorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0KKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPQorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1NZTUJPTFMgICAgICAgID0KKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKKyMgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0KKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6CisjCisjIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgorIworIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCisjIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCisjIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKKyMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKKyMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCisjIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPQorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0KKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUiApIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0KKworIyBJZiB0aGUgVVNFX01ERklMRV9BU19NQUlOUEFHRSB0YWcgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIGEgbWFya2Rvd24gZmlsZSB0aGF0CisjIGlzIHBhcnQgb2YgdGhlIGlucHV0LCBpdHMgY29udGVudHMgd2lsbCBiZSBwbGFjZWQgb24gdGhlIG1haW4gcGFnZQorIyAoaW5kZXguaHRtbCkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2plY3Qgb24gZm9yIGluc3RhbmNlIEdpdEh1YgorIyBhbmQgd2FudCB0byByZXVzZSB0aGUgaW50cm9kdWN0aW9uIHBhZ2UgYWxzbyBmb3IgdGhlIGRveHlnZW4gb3V0cHV0LgorCitVU0VfTURGSUxFX0FTX01BSU5QQUdFID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQKKyMgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20gZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kCisjIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbAorIyBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSAuLworCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwgLnBocCwgLmFzcCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgaGVhZGVyIGZpbGUgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4KKyMKKyMgVG8gZ2V0IHZhbGlkIEhUTUwgdGhlIGhlYWRlciBmaWxlIHRoYXQgaW5jbHVkZXMgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cworIyB0aGF0IGRveHlnZW4gbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgKGUuZy4KKyMgdGhlIHNldHRpbmcgR0VORVJBVEVfVFJFRVZJRVcpLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gc3RhcnQgd2l0aCBhCisjIGRlZmF1bHQgaGVhZGVyIHVzaW5nCisjIGRveHlnZW4gLXcgaHRtbCBuZXdfaGVhZGVyLmh0bWwgbmV3X2Zvb3Rlci5odG1sIG5ld19zdHlsZXNoZWV0LmNzcworIyBZb3VyQ29uZmlnRmlsZQorIyBhbmQgdGhlbiBtb2RpZnkgdGhlIGZpbGUgbmV3X2hlYWRlci5odG1sLiBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIgorIyBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGhlYWRlciB0aGF0IGRveHlnZW4gbm9ybWFsbHkKKyMgdXNlcy4KKyMgTm90ZTogVGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5IGhhdmUgdG8gcmVnZW5lcmF0ZSB0aGUKKyMgZGVmYXVsdCBoZWFkZXIgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4uIEZvciBhIGRlc2NyaXB0aW9uCisjIG9mIHRoZSBwb3NzaWJsZSBtYXJrZXJzIGFuZCBibG9jayBuYW1lcyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfSEVBREVSICAgICAgICAgICAgPSAuLi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9oZWFkZXIuaHRtbAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSBASFRNTF9GT09URVJACisKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUKKyMgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBmaW5lLXR1bmUgdGhlIGxvb2sgb2YKKyMgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIHN0eWxlCisjIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBOb3RlOiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIGluc3RlYWQgb2YgdGhpcyB0YWcsIGFzCisjIGl0IGlzIG1vcmUgcm9idXN0IGFuZCB0aGlzIHRhZyAoSFRNTF9TVFlMRVNIRUVUKSB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lCisjIG9ic29sZXRlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCisjIEhUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAuLi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hbWVkX2RhdGFfZG94eWdlbi5jc3MKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgdXNlci0KKyMgZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdGhhdCBpcyBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCisjIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCisjIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCisjIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLgorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gRm9yIGFuIGV4YW1wbGUKKyMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0KKworIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQorIyAkcmVscGF0aF4gbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdCB0aGUKKyMgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9IC4uL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvZG94eWdlbi5jc3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC4uL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvYmFzZS5jc3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC4uL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvZm91bmRhdGlvbi5jc3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC4uL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvYmFyLXRvcC5wbmcKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgorIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZXNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcyBhY2NvcmRpbmcgdG8KKyMgdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsIHNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gRm9yIGluc3RhbmNlIHRoZSB2YWx1ZQorIyAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAKKyMgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzU5LCBkZWZhdWx0IHZhbHVlOiAyMjAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDkxCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YgZW50cmllcworIyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyIGNhbiBleHBhbmQKKyMgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQgdGhlIHRyZWUgdG8KKyMgc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZSB2aXNpYmxlICh1bmxlc3MKKyMgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLiBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YKKyMgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUKKyMgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQKKyMgdHJlZSBieSBkZWZhdWx0LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5OTk5LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDAKKworIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50CisjIGVudmlyb25tZW50IChzZWU6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL3hjb2RlLyksIGludHJvZHVjZWQgd2l0aAorIyBPU1ggMTAuNSAoTGVvcGFyZCkuIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBNYWtlZmlsZSBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4KKyMgdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgbWFrZSBpbnN0YWxsIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZCBpdCBhdAorIyBzdGFydHVwLiBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbAorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KKworIyBUaGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkb2NzZXQgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMKKyMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIKKyMgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpIGNhbiBiZSBncm91cGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRG94eWdlbiBnZW5lcmF0ZWQgZG9jcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uCisjIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4KKyMgY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbiB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkKKyMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUKKyMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyCisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBQdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcgorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gZ2VuZXJhdGVzIHRocmVlCisjIGFkZGl0aW9uYWwgSFRNTCBpbmRleCBmaWxlczogaW5kZXguaGhwLCBpbmRleC5oaGMsIGFuZCBpbmRleC5oaGsuIFRoZQorIyBpbmRleC5oaHAgaXMgYSBwcm9qZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVhZCBieSBNaWNyb3NvZnQncyBIVE1MIEhlbHAgV29ya3Nob3AKKyMgKHNlZTogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yMTEzOCkgb24KKyMgV2luZG93cy4KKyMKKyMgVGhlIEhUTUwgSGVscCBXb3Jrc2hvcCBjb250YWlucyBhIGNvbXBpbGVyIHRoYXQgY2FuIGNvbnZlcnQgYWxsIEhUTUwgb3V0cHV0CisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGludG8gYSBzaW5nbGUgY29tcGlsZWQgSFRNTCBmaWxlICguY2htKS4gQ29tcGlsZWQgSFRNTAorIyBmaWxlcyBhcmUgbm93IHVzZWQgYXMgdGhlIFdpbmRvd3MgOTggaGVscCBmb3JtYXQsIGFuZCB3aWxsIHJlcGxhY2UgdGhlIG9sZAorIyBXaW5kb3dzIGhlbHAgZm9ybWF0ICguaGxwKSBvbiBhbGwgV2luZG93cyBwbGF0Zm9ybXMgaW4gdGhlIGZ1dHVyZS4gQ29tcHJlc3NlZAorIyBIVE1MIGZpbGVzIGFsc28gY29udGFpbiBhbiBpbmRleCwgYSB0YWJsZSBvZiBjb250ZW50cywgYW5kIHlvdSBjYW4gc2VhcmNoIGZvcgorIyB3b3JkcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIEhUTUwgd29ya3Nob3AgYWxzbyBjb250YWlucyBhIHZpZXdlciBmb3IKKyMgY29tcHJlc3NlZCBIVE1MIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworCisjIFRoZSBDSE1fRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobQorIyBmaWxlLiBZb3UgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPQorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKCBoaGMuZXhlKS4gSWYgbm9uLWVtcHR5CisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0KKworIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkICgKKyMgWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoIE5PKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCisKKyMgVGhlIENITV9JTkRFWF9FTkNPRElORyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoIGhoayksIGNvbnRlbnQgKCBoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPQorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzICggTk8pIGluIHRoZSAuY2htIGZpbGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIHRvCisjIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0CisjIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwCisjICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorIyB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLiBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8KKyMgdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0KKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPQorCisjIFRoZSBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9CisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKKyMgcHJvamVjdCdzIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzIChzZWU6CisjIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9CisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCisjIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KKyMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCisjIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisjIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KKyMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KKworIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlIHRoaXMKKyMgbmFtZS4gRWFjaCBkb2N1bWVudGF0aW9uIHNldCBzaG91bGQgaGF2ZSBpdHMgb3duIGlkZW50aWZpZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRUNMSVBTRUhFTFAgaXMgc2V0IHRvIFlFUy4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBJZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGF5b3V0IG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBwYWdlcyBpdCBtaWdodAorIyBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgaW5kZXggYW5kIHJlcGxhY2UgaXQgd2l0aCB5b3VyIG93bi4gVGhlCisjIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpIGF0IHRvcAorIyBvZiBlYWNoIEhUTUwgcGFnZS4gQSB2YWx1ZSBvZiBOTyBlbmFibGVzIHRoZSBpbmRleCBhbmQgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcworIyBpdC4gU2luY2UgdGhlIHRhYnMgaW4gdGhlIGluZGV4IGNvbnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIG5hdmlnYXRpb24KKyMgdHJlZSwgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIGlmIHlvdSBhbHNvIHNldCBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZworIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQorIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcworIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAorIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQorIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZXNoZWV0cyAoc2VlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCkgb25lIGNhbgorIyBmdXJ0aGVyIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgaW5kZXguIEFzIGFuIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHN0eWxlCisjIHNoZWV0IGdlbmVyYXRlZCBieSBkb3h5Z2VuIGhhcyBhbiBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIHB1dCBhbiBpbWFnZSBhdAorIyB0aGUgcm9vdCBvZiB0aGUgdHJlZSBpbnN0ZWFkIG9mIHRoZSBQUk9KRUNUX05BTUUuIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMKKyMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCwgeW91IGNvdWxkIGNvbnNpZGVyIHNldHRpbmcKKyMgRElTQUJMRV9JTkRFWCB0byBZRVMgd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gWUVTCisKKyMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyB0aGF0CisjIGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0gdmFsdWVzIGZyb20gYXBwZWFyaW5nCisjIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSB1c2VkCisjIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUgaXMgc2hvd24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDE1MDAsIGRlZmF1bHQgdmFsdWU6IDI1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjIFdoZW4gdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KKyMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KKyMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisjIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAorIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCisjIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQorIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKKyMgaW5zdGVhZCBvZiB1c2luZyBwcmVyZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90IGhhdmUgTGFUZVgKKyMgaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwgb3V0cHV0LiBXaGVuCisjIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kIGNvbmZpZ3VyZSB0aGUgcGF0aAorIyB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitVU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8KKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgY2FuIHNldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCisjIHRoZSBNYXRoSmF4IG91dHB1dC4gU2VlIHRoZSBNYXRoSmF4IHNpdGUgKHNlZToKKyMgaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBIVE1MLUNTUyAod2hpY2ggaXMgc2xvd2VyLCBidXQgaGFzIHRoZSBiZXN0CisjIGNvbXBhdGliaWxpdHkpLCBOYXRpdmVNTUwgKGkuZS4gTWF0aE1MKSBhbmQgU1ZHLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSFRNTC1DU1MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0ZPUk1BVCAgICAgICAgID0gSFRNTC1DU1MKKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisjIHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheCBkaXJlY3RvcnkKKyMgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuCisjIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBNYXRoSmF4CisjIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dCBpbnN0YWxsaW5nCisjIE1hdGhKYXguIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbCBjb3B5IG9mCisjIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0CisKKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBNYXRoSmF4CisjIGV4dGVuc2lvbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4gRm9yIGV4YW1wbGUKKyMgTUFUSEpBWF9FWFRFTlNJT05TID0gVGVYL0FNU21hdGggVGVYL0FNU3N5bWJvbHMKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPQorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPQorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3VycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlCisjIEVYVEVSTkFMX1NFQVJDSCBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvcgorIyBzZWFyY2hpbmcgYW5kIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcworIyBlbmFibGVkIHRoZSBpbmRleGluZyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUKKyMgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKCBkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4KKyMKKyMgU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSCAgICAgICAgPSBOTworCisjIFRoZSBTRUFSQ0hFTkdJTkVfVVJMIHNob3VsZCBwb2ludCB0byBhIHNlYXJjaCBlbmdpbmUgaG9zdGVkIGJ5IGEgd2ViIHNlcnZlcgorIyB3aGljaCB3aWxsIHJldHVybiB0aGUgc2VhcmNoIHJlc3VsdHMgd2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZC4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPQorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlIHVuaW5kZXhlZAorIyBzZWFyY2ggZGF0YSBpcyB3cml0dGVuIHRvIGEgZmlsZSBmb3IgaW5kZXhpbmcgYnkgYW4gZXh0ZXJuYWwgdG9vbC4gV2l0aCB0aGUKKyMgU0VBUkNIREFUQV9GSUxFIHRhZyB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgY2FuIGJlIHNwZWNpZmllZC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogc2VhcmNoZGF0YS54bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIREFUQV9GSUxFICAgICAgICA9IHNlYXJjaGRhdGEueG1sCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUKKyMgRVhURVJOQUxfU0VBUkNIX0lEIHRhZyBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdC4gVGhpcyBpcworIyB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdG8gc2VhcmNoIHRocm91Z2ggbXVsdGlwbGUKKyMgcHJvamVjdHMgYW5kIHJlZGlyZWN0IHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIHJpZ2h0IHByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIX0lEICAgICA9CisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBMYVRlWCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQorIyBpbnZva2VkLgorIworIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvciBnZW5lcmF0aW5nCisjIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUgTWFrZWZpbGUgdGhhdCBpcworIyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0byBnZW5lcmF0ZQorIyBpbmRleCBmb3IgTGFUZVguCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IG1ha2VpbmRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IKKyMgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5CisjIEVYVFJBX1BBQ0tBR0VTPXRpbWVzCisjIElmIGxlZnQgYmxhbmsgbm8gZXh0cmEgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQorIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQorIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAorIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIuIERveHlnZW4gd2lsbAorIyByZXBsYWNlIHRoZW0gYnkgcmVzcGVjdGl2ZWx5IHRoZSB0aXRsZSBvZiB0aGUgcGFnZSwgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSwKKyMgb25seSB0aGUgY3VycmVudCBkYXRlLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgZG94eWdlbiwgdGhlIHByb2plY3QgbmFtZSAoc2VlCisjIFBST0pFQ1RfTkFNRSksIG9yIHRoZSBwcm9qZWN0IG51bWJlciAoc2VlIFBST0pFQ1RfTlVNQkVSKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgZm9vdGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIExBVEVYX09VVFBVVCBvdXRwdXQKKyMgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IKKyMgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9GSUxFUyAgICAgID0KKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcYmF0Y2htb2RlCisjIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAgcnVubmluZworIyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQKKyMgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9ISURFX0lORElDRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90IGluY2x1ZGUgdGhlCisjIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSBpbiB0aGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UKKyMgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KKworIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gU2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGFuZCBcY2l0ZSBmb3IgbW9yZSBpbmZvLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcGxhaW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQuIFRoZQorIyBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHRvbyBwcmV0dHkgd2l0aCBvdGhlciBSVEYKKyMgcmVhZGVycy9lZGl0b3JzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBydGYuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCisjIGNsYXNzZXMgYW5kIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorIyBNQU5fT1VUUFVULgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKKyMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCisjIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcworIyBvcHRpb25hbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIGRveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsIHRoZW4gaXQKKyMgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbAorIyBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQKKyMgdGhlbSB0aGUgbWFuIGNvbW1hbmQgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdAorIyBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8KKworIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCisKKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgc2NoZW1hLCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCisjIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX1NDSEVNQSAgICAgICAgICAgICA9CisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgRFRELCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCisjIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX0RURCAgICAgICAgICAgICAgICA9CisKKyMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcworIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KKworIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KKyMgZnJvbnQgb2YgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KKworRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gQXV0b0dlbgorIyBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YKKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsCisjIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZQorIyBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKKyMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCisjIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTyB0aGUKKyMgc2l6ZSBvZiB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbXVjaCBzbWFsbGVyIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQKKyMganVzdCB0aGUgc2FtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUworCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIGFyZQorIyBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIFRoaXMgaXMgdXNlZnVsCisjIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZSBNYWtlZmlsZSBkb24ndAorIyBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCisjIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvIG5hbWVzCisjIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQorIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKKyMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IE5PCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgaW5jbHVkZXMgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0KKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKKyMgdXNlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPQorCisjIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQgYXJlCisjIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mIGUuZy4KKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZSBvcgorIyBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgIj0iIGFyZSBvbWl0dGVkLCAiPTEiCisjIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IKKyMgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvciBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IE5GRF9MT0dfSU5JVCh4KT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIE5GRF9MT0dfSU5DTEFTU19URU1QTEFURV9TUEVDSUFMSVpBVElPTl9ERUZJTkUoeCx5KT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIE5GRF9MT0dfSU5DTEFTU18yVEVNUExBVEVfU1BFQ0lBTElaQVRJT05fREVGSU5FKHgseSx6KT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1NUQVRJQ19BU1NFUlQoeCk9CisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9CisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsCisjIHJlbW92ZSBhbGwgcmVmcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbgorIyBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zIGFyZQorIyB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYW4gdW5pcXVlIG5hbWUgKHdoZXJlIHRoZSBuYW1lIGRvZXMgTk9UIGluY2x1ZGUKKyMgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggZG94eWdlbiBpcworIyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLgorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0KKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSBORkQudGFnCisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlCisjIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkIGluCisjIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsIGJlCisjIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRFUk5BTF9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAorIyBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgorIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPQorCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzIGFsbG93ZWQKKyMgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwIGRveHlnZW4gd2lsbCBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZgorIyBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCBleHBsaWNpdGx5IHRvIGEgdmFsdWUKKyMgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3NpbmcKKyMgc3BlZWQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDMyLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IG4gdGhlIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4KKyMgZ2VuZXJhdGVzIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZQorIyBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYQorIyBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieQorIyBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIZWx2ZXRpY2EuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCisKKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgZGVmYXVsdCBmb250IGFzIHNwZWNpZmllZCB3aXRoCisjIERPVF9GT05UTkFNRS4gSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQKKyMgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9CisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4KKyMgU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGltcGxlbWVudGF0aW9uCisjIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZQorIyBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZSB0aGUKKyMgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlIGdyYXBoIG1heQorIyBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUyB0aHJlc2hvbGQgbGltaXRzIHRoZQorIyBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUgbWFuYWdlYWJsZS4gU2V0IHRoaXMgdG8gMAorIyBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZSBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdAorIyBpcyBlbmZvcmNlZC4gU28gd2hlbiB5b3Ugc2V0IHRoZSB0aHJlc2hvbGQgdG8gMTAsIHVwIHRvIDE1IGZpZWxkcyBtYXkgYXBwZWFyLAorIyBidXQgaWYgdGhlIG51bWJlciBleGNlZWRzIDE1LCB0aGUgdG90YWwgYW1vdW50IG9mIGZpZWxkcyBzaG93biBpcyBsaW1pdGVkIHRvCisjIDEwLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwCisKKyMgSWYgdGhlIFRFTVBMQVRFX1JFTEFUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZSByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyCisjIGluc3RhbmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuCisjIE5vdGU6IElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyCisjIHRvIG1ha2UgdGhlIFNWRyBmaWxlcyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzCisjIHJlcXVpcmVtZW50KS4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogcG5nLCBqcGcsIGdpZiBhbmQgc3ZnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcG5nLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHN2ZworCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bworIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLiBUZXN0ZWQKKyMgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuCisjIE5vdGU6IEZvciBJRSA5KyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlCisjIHRoZSBTVkcgZmlsZXMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTworCisjIFRoZSBET1RfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0KKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0KKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPQorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisjIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCisjIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKKyMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0CisjIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCisjIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCisjIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5CisjIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQorIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KKyMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAorCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQorIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCisjCisjIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KKyMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCisjIHJlYWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9pbmRleC5yc3QgYi9ORkQvZG9jcy9pbmRleC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmNTY4ZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL2luZGV4LnJzdApAQCAtMCwwICsxLDYwIEBACitORkQgLSBOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitORkQgaXMgYSBuZXR3b3JrIGZvcndhcmRlciB0aGF0IGltcGxlbWVudHMgYW5kIGV2b2x2ZXMgdG9nZXRoZXIgd2l0aCB0aGUgTmFtZWQgRGF0YQorTmV0d29ya2luZyAoTkROKSBgcHJvdG9jb2wgPGh0dHA6Ly9uYW1lZC1kYXRhLm5ldC9kb2MvbmRuLXRsdi8+YF9fLiBBZnRlciB0aGUgaW5pdGlhbAorcmVsZWFzZSwgTkZEIHdpbGwgYmVjb21lIGEgY29yZSBjb21wb25lbnQgb2YgdGhlIGBORE4gUGxhdGZvcm0KKzxodHRwOi8vbmFtZWQtZGF0YS5uZXQvY29kZWJhc2UvcGxhdGZvcm0vPmBfXyBhbmQgd2lsbCBmb2xsb3cgdGhlIHNhbWUgcmVsZWFzZSBjeWNsZS4KKworTkZEIERvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIHRvY3RyZWU6OgorICAgOmhpZGRlbjoKKyAgIDptYXhkZXB0aDogMworCisgICBvdmVydmlldworICAgSU5TVEFMTAorICAgRkFRCisgICBtYW5wYWdlcworCisqIDpkb2M6YG92ZXJ2aWV3YAorCisgIEEgYnJpZWYgb3ZlcnZpZXcgb2YgTkZEIGFuZCBpdHMgbWFqb3IgbW9kdWxlcy4KKworKiA6ZG9jOmBJTlNUQUxMYAorCisgIEluc3RydWN0aW9ucyBmb3Igb2J0YWluaW5nLCBpbnN0YWxsaW5nLCBhbmQgcnVubmluZyBORkQuCisKKyogOmRvYzpgRkFRYAorCisgIFN1Z2dlc3Rpb25zIGZvciBjb25maWd1cmluZyBhbmQgcnVubmluZyBub24tc3RhbmRhcmQgTkZEIHNldHVwcy4KKworKiA6ZG9jOmBtYW5wYWdlc2AKKworKipBZGRpdGlvbmFsIGRvY3VtZW50YXRpb24qKgorCisqIGBORkQgRGV2ZWxvcGVyJ3MgR3VpZGUgPGh0dHA6Ly9uYW1lZC1kYXRhLm5ldC93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8wNy9ORkQtZGV2ZWxvcGVyLWd1aWRlLnBkZj5gXworCisgIEEgY29tcHJlaGVuc2l2ZSBndWlkZSB0byB0aGUgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBORkQuIFRoZSBkZXZlbG9wZXIncyBndWlkZSBhbHNvIGNvbnRhaW5zCisgIHN1Z2dlc3Rpb25zIGFuZCBoaW50cyBmb3IgYW55b25lIHdhbnRpbmcgdG8gbW9kaWZ5IG9yIGV4dGVuZCBORkQuCisKKyogYE5GRCBXaWtpIDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraT5gXworCisgICsgYE5GRCBNYW5hZ2VtZW50IHByb3RvY29sIDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9NYW5hZ2VtZW50PmBfCisgICsgYE5GRCBDb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0IDxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9Db25maWdGaWxlRm9ybWF0PmBfCisKKyAgVGhlIE5GRCBXaWtpIGNvbnRhaW5zIGRldGFpbGVkIHByb3RvY29sIHNwZWNpZmljYXRpb25zIGFuZAorICBpbmZvcm1hdGlvbiBmb3IgYnVpbGRpbmcgb24gdW5zdXBwb3J0ZWQgcGxhdGZvcm1zLgorCisqIGBBUEkgRG9jdW1lbnRhdGlvbiAoZG94eWdlbikgPGRveHlnZW4vYW5ub3RhdGVkLmh0bWw+YF8KKworKiBgUmVsZWFzZSBOb3RlcyA8UkVMRUFTRV9OT1RFUy5odG1sPmBfCisKK0xpY2Vuc2UKKy0tLS0tLS0KKworTkZEIGlzIGFuIG9wZW4gYW5kIGZyZWUgc29mdHdhcmUgcGFja2FnZSBsaWNlbnNlZCB1bmRlciBHUEwgMy4wIGxpY2Vuc2UgYW5kIGlzIHRoZQorY2VudGVycGllY2Ugb2Ygb3VyIGNvbW1pdHRlbWVudCB0byBtYWtpbmcgTkROJ3MgY29yZSB0ZWNobm9sb2d5IG9wZW4gYW5kIGZyZWUgdG8gYWxsCitJbnRlcm5ldCB1c2VycyBhbmQgZGV2ZWxvcGVycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpY2Vuc2luZyBkZXRhaWxzIGFuZAorbGltaXRhdGlvbiwgcmVmZXIgdG8gYENPUFlJTkcubWQgPGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL05GRC9ibG9iL21hc3Rlci9DT1BZSU5HLm1kPmBfLgpkaWZmIC0tZ2l0IGEvTkZEL2RvY3MvbWFucGFnZXMucnN0IGIvTkZEL2RvY3MvbWFucGFnZXMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTI4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9tYW5wYWdlcy5yc3QKQEAgLTAsMCArMSwxOCBAQAorLi4gX01hbnBhZ2VzOgorCitNYW5wYWdlcworPT09PT09PT0KKworLi4gdG9jdHJlZTo6CisgICBtYW5wYWdlcy9uZmQKKyAgIG1hbnBhZ2VzL25yZAorICAgbWFucGFnZXMvbmZkYworICAgbWFucGFnZXMvbmZkLXN0YXR1cworICAgc2NoZW1hCisgICBtYW5wYWdlcy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyCisgICBtYW5wYWdlcy9uZG4tYXV0b2NvbmZpZworICAgbWFucGFnZXMvbmRuLWF1dG9jb25maWctc2VydmVyCisgICBtYW5wYWdlcy9uZmQtYXV0b3JlZworICAgbWFucGFnZXMvbmRuLXRsdi1wZWVrCisgICBtYW5wYWdlcy9uZG4tdGx2LXBva2UKKyAgIDptYXhkZXB0aDogMQpkaWZmIC0tZ2l0IGEvTkZEL2RvY3MvbWFucGFnZXMvbmRuLWF1dG9jb25maWctc2VydmVyLnJzdCBiL05GRC9kb2NzL21hbnBhZ2VzL25kbi1hdXRvY29uZmlnLXNlcnZlci5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4YjZjMQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL21hbnBhZ2VzL25kbi1hdXRvY29uZmlnLXNlcnZlci5yc3QKQEAgLTAsMCArMSw1MCBAQAorLi4gX25kbi1hdXRvY29uZmlnLXNlcnZlcjoKKworbmRuLWF1dG9jb25maWctc2VydmVyCis9PT09PT09PT09PT09PT09PT09PT0KKworVXNhZ2UKKy0tLS0tCisKKzo6CisKKyAgICBuZG4tYXV0b2NvbmZpZy1zZXJ2ZXIgWy1oXSBbLXAgcHJlZml4XSBbLXAgcHJlZml4XSAuLi4gRmFjZVVyaQorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitgYG5kbi1hdXRvY29uZmlnLXNlcnZlcmBgIGlzIGEgZGFlbW9uIHRoYXQgaW1wbGVtZW50cyBzZXJ2ZXIgcGFydCBmb3IgdGhlIHN0YWdlIDEgb2YKKzpyZWY6YE5ETiBodWIgZGlzY292ZXJ5IHByb2NlZHVyZWAuCisKK1RoaXMgZGFlbW9uIGVzc2VudGlhbGx5IHdhaXRzIGZvciBJbnRlcmVzdHMgZm9yIGBgL2xvY2FsaG9wL25kbi1hdXRvY29uZi9odWJgYCBhbmQKK3NhdGlzZmllcyB0aGVtIHdpdGggYSBEYXRhIHBhY2tldCB0aGF0IGNvbnRhaW5zIFRMVi1lbmNvZGVkIEZhY2VVcmkgYmxvY2suICBUaGUgdmFsdWUgb2YKK3RoaXMgYmxvY2sgaXMgdGhlIGBgVXJpYGAgZm9yIHRoZSBIVUIsIHByZWZlcnJhYmx5IGEgVURQIHR1bm5lbC4KKworYGAtaGBgCisgIHByaW50IHVzYWdlIGFuZCBleGl0LgorCitgYEZhY2VVcmlgYAorICBGYWNlVXJpIGZvciB0aGlzIE5ETiBodWIuCisKK2BgLXAgcHJlZml4YGAKKyAgQSBsb2NhbCBwcmVmaXggZm9yIHdoaWNoIHRoZSBsb2NhbCBodWIgYWxsb3cgZW5kIGFwcGxpY2F0aW9ucyB0byByZWdpc3RlciBwcmVmaXgKKyAgKFNlZSBtb3JlIGRldGFpbHMgaW4gOnJlZjpgbG9jYWwtcHJlZml4LWRpc2NvdmVyeWApLiAgT25lIGNhbiBzdXBwbHkgbW9yZSB0aGFuIG9uZQorICBwcmVmaXhlcy4gIEFsbCBzdXBwbGllZCBwcmVmaXhlcyB3aWxsIGJlIHB1dCBpbnRvIHRoZSBsb2NhbCBwcmVmaXggZGlzY292ZXJ5IGRhdGEKKyAgYXMgZGVzY3JpYmVkIGluIDpyZWY6YGxvY2FsLXByZWZpeC1kaXNjb3ZlcnlgLiAgSWYgbm8gcHJlZml4IGlzIHNwZWNpZmllZCwKKyAgYXV0by1jb25maWctc2VydmVyIHdpbGwgbm90IHNlcnZlIGFueSBsb2NhbCBwcmVmaXggZGlzY292ZXJ5IGRhdGEuCisKK0V4YW1wbGVzCistLS0tLS0tLQorCis6OgorCisgICAgbmRuLWF1dG9jb25maWctc2VydmVyIHRjcDovL3NwdXJzLmNzLnVjbGEuZWR1CisKKyAgICBuZG4tYXV0b2NvbmZpZy1zZXJ2ZXIgLXAgL25kbi9lZHUvdWNsYSB0Y3A6Ly9zcHVycy5jcy51Y2xhLmVkdQorCisKK1NlZSBhbHNvCistLS0tLS0tLQorCis6cmVmOmBuZG4tYXV0b2NvbmZpZ2AKZGlmZiAtLWdpdCBhL05GRC9kb2NzL21hbnBhZ2VzL25kbi1hdXRvY29uZmlnLnJzdCBiL05GRC9kb2NzL21hbnBhZ2VzL25kbi1hdXRvY29uZmlnLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTU2NDM1Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbWFucGFnZXMvbmRuLWF1dG9jb25maWcucnN0CkBAIC0wLDAgKzEsMTI5IEBACisuLiBfbmRuLWF1dG9jb25maWc6CisKK25kbi1hdXRvY29uZmlnCis9PT09PT09PT09PT09PQorCitVc2FnZQorLS0tLS0KKworOjoKKworICAgIG5kbi1hdXRvY29uZmlnCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitDbGllbnQgdG9vbCB0byBydW4gOnJlZjpgTkROIGh1YiBkaXNjb3ZlcnkgcHJvY2VkdXJlYC4KKworLi4gX05ETiBodWIgZGlzY292ZXJ5IHByb2NlZHVyZToKKworTkROIGh1YiBkaXNjb3ZlcnkgcHJvY2VkdXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiBhbiBlbmQgaG9zdCBzdGFydHMgdXAsIG9yIGRldGVjdHMgYSBjaGFuZ2UgaW4gaXRzIG5ldHdvcmsgZW52aXJvbm1lbnQsIGl0IE1BWSB1c2UKK3RoaXMgcHJvY2VkdXJlIHRvIGRpc2NvdmVyIGEgbG9jYWwgb3IgaG9tZSBORE4gcm91dGVyLCBpbiBvcmRlciB0byBnYWluIGNvbm5lY3Rpdml0eSB0bworYHRoZSBORE4gcmVzZWFyY2ggdGVzdGJlZCA8aHR0cDovL25hbWVkLWRhdGEubmV0L25kbi10ZXN0YmVkLz5gXy4KKworT3ZlcnZpZXcKK15eXl5eXl5eCisKK1RoaXMgcHJvY2VkdXJlIGNvbnRhaW5zIHRocmVlIG1ldGhvZHMgdG8gZGlzY292ZXIgYSBORE4gcm91dGVyOgorCisxLiAgTG9vayBmb3IgYSBsb2NhbCBORE4gcm91dGVyIGJ5IG11bHRpY2FzdC4KKyAgICBUaGlzIGlzIHVzZWZ1bCBpbiBhIGhvbWUgb3Igc21hbGwgb2ZmaWNlIG5ldHdvcmsuCisKKzIuICBMb29rIGZvciBhIGxvY2FsIE5ETiByb3V0ZXIgYnkgRE5TIHF1ZXJ5IHdpdGggZGVmYXVsdCBzdWZmaXguCisgICAgVGhpcyBhbGxvd3MgbmV0d29yayBhZG1pbmlzdHJhdG9yIHRvIGNvbmZpZ3VyZSBhIE5ETiByb3V0ZXIgaW4gYSBsYXJnZSBlbnRlcnByaXNlIG5ldHdvcmsuCisKKzMuICBDb25uZWN0IHRvIHRoZSBob21lIE5ETiByb3V0ZXIgYWNjb3JkaW5nIHRvIHVzZXIgY2VydGlmaWNhdGUuCisgICAgVGhpcyBlbnN1cmVzIGNvbm5lY3Rpdml0eSBmcm9tIGFueXdoZXJlLgorCitTdGFnZSAxOiBtdWx0aWNhc3QgZGlzY292ZXJ5CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1JlcXVlc3QKKysrKysrKysKKworVGhlIGVuZCBob3N0IHNlbmRzIGFuIEludGVyZXN0IG92ZXIgYSBtdWx0aWNhc3QgZmFjZS4KKworSW50ZXJlc3QgTmFtZSBpcyBgYC9sb2NhbGhvcC9uZG4tYXV0b2NvbmYvaHViYGAuCisKK1Jlc3BvbnNlCisrKysrKysrKworCitBIHByb2R1Y2VyIGFwcCBvbiB0aGUgSFVCIGFuc3dlciB0aGlzIEludGVyZXN0IHdpdGggYSBEYXRhIHBhY2tldCB0aGF0IGNvbnRhaW5zIGEKK1RMVi1lbmNvZGVkIGBVcmlgIGJsb2NrLiAgVGhlIHZhbHVlIG9mIHRoaXMgYmxvY2sgaXMgdGhlIFVSSSBmb3IgdGhlIEhVQiwgcHJlZmVycmFibHkgYQorVURQIHR1bm5lbC4KKworU3RhZ2UgMjogRE5TIHF1ZXJ5IHdpdGggZGVmYXVsdCBzdWZmaXgKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1JlcXVlc3QKKysrKysrKysKKworVGhlIGVuZCBob3N0IHNlbmRzIGEgRE5TIHF1ZXJ5IHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGlzIGNvbW1hbmQ6OgorCisgICAgZGlnICtzZWFyY2ggK3Nob3J0ICtjbWQgK3RyaWVzPTIgK25kb3RzPTEwIF9uZG4uX3VkcCBzcnYKKworUmVzcG9uc2UKKysrKysrKysrCisKK1RoZSBETlMgc2VydmVyIHNob3VsZCBhbnN3ZXIgd2l0aCBhbiBTUlYgcmVjb3JkIHRoYXQgY29udGFpbnMgdGhlIGhvc3RuYW1lIGFuZCBVRFAgcG9ydAorbnVtYmVyIG9mIHRoZSBORE4gcm91dGVyLgorCitTdGFnZSAzOiBmaW5kIGhvbWUgcm91dGVyCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1RoaXMgc3RhZ2UgYXNzdW1lcyB0aGF0IHVzZXIgaGFzIGNvbmZpZ3VyZWQgZGVmYXVsdCBjZXJ0aWZpY2F0ZSB1c2luZworYDxodHRwOi8vbmRuY2VydC5uYW1lZC1kYXRhLm5ldC8+YF8gYXMgZGVzY3JpYmVkIGluIGBDZXJ0aWZpY2F0aW9uIEFyY2hpdGVjdHVyZQorPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2F0dGFjaG1lbnRzL2Rvd25sb2FkLzIzL0NlcnRpZmljYXRpb25BcmNoaXRlY3R1cmUucHB0eD5gXy4KKworUmVxdWVzdAorKysrKysrKworCitUaGUgZW5kIGhvc3QgbG9hZHMgdGhlIGRlZmF1bHQgdXNlciBpZGVudGl0eSAoZWcuIGBgL25kbi9lZHUvdWNsYS9jcy9hZmFuYXNldmBgKSwgYW5kCitjb252ZXJ0cyBpdCB0byBETlMgZm9ybWF0LgorCitUaGUgZW5kIGhvc3Qgc2VuZHMgYSBETlMgcXVlcnkgZm9yIGFuIFNSViByZWNvcmQgb2YgbmFtZSBgYF9uZG4uX3VkcC5gYCArIHVzZXIgaWRlbnRpdHkgaW4KK0ROUyBmb3JtYXQgKyBgYF9ob21laHViLl9hdXRvY29uZi5uYW1lZC1kYXRhLm5ldGBgLiBGb3IgZXhhbXBsZTo6CisKKyAgICBfbmRuLl91ZHAuYWZhbmFzZXYuY3MudWNsYS5lZHUubmRuLl9ob21laHViLl9hdXRvY29uZi5uYW1lZC1kYXRhLm5ldAorCitSZXNwb25zZQorKysrKysrKysKKworVGhlIEROUyBzZXJ2ZXIgc2hvdWxkIGFuc3dlciB3aXRoIGFuIFNSViByZWNvcmQgdGhhdCBjb250YWlucyB0aGUgaG9zdG5hbWUgYW5kIFVEUCBwb3J0CitudW1iZXIgb2YgdGhlIGhvbWUgTkROIHJvdXRlciBvZiB0aGlzIHVzZXIncyBzaXRlLgorCitDbGllbnQgcHJvY2VkdXJlCistLS0tLS0tLS0tLS0tLS0tCisKK1N0YWdlIDEKK15eXl5eXl4KKworU2VuZCBhIG11bHRpY2FzdCBkaXNjb3ZlcnkgSW50ZXJlc3QuCisKK0lmIHRoaXMgSW50ZXJlc3QgaXMgYW5zd2VyZWQsIGNvbm5lY3QgdG8gdGhlIEhVQiBhbmQgdGVybWluYXRlIGF1dG8tZGlzY292ZXJ5LgorCitTdGFnZSAyCiteXl5eXl5eCisKK1NlbmQgYSBETlMgcXVlcnkgd2l0aCBkZWZhdWx0IHN1ZmZpeC4KKworSWYgdGhpcyBxdWVyeSBpcyBhbnN3ZXJlZCwgY29ubmVjdCB0byB0aGUgSFVCIGFuZCB0ZXJtaW5hdGUgYXV0by1kaXNjb3ZlcnkuCisKK1N0YWdlIDMKK15eXl5eXl4KKworKiBMb2FkIGRlZmF1bHQgdXNlciBpZGVudGl0eSwgYW5kIGNvbnZlcnQgaXQgdG8gRE5TIGZvcm1hdDsgaWYgZWl0aGVyIGZhaWxzLCB0aGUKKyAgYXV0by1kaXNjb3ZlcnkgZmFpbHMuCisKKyogU2VuZCBhIEROUyBxdWVyeSB0byBmaW5kIGhvbWUgSFVCLgorICBJZiB0aGlzIHF1ZXJ5IGlzIGFuc3dlcmVkLCBjb25uZWN0IHRvIHRoZSBob21lIEhVQiBhbmQgdGVybWluYXRlIGF1dG8tZGlzY292ZXJ5LgorICBPdGhlcndpc2UsIHRoZSBhdXRvLWRpc2NvdmVyeSBmYWlscy4KKworCitTZWUgYWxzbworLS0tLS0tLS0KKworOnJlZjpgbmRuLWF1dG9jb25maWctc2VydmVyYApkaWZmIC0tZ2l0IGEvTkZEL2RvY3MvbWFucGFnZXMvbmRuLXRsdi1wZWVrLnJzdCBiL05GRC9kb2NzL21hbnBhZ2VzL25kbi10bHYtcGVlay5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyYTdlNAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL21hbnBhZ2VzL25kbi10bHYtcGVlay5yc3QKQEAgLTAsMCArMSw1NiBAQAorbmRuLXRsdi1wZWVrCis9PT09PT09PT09PT0KKworVXNhZ2UKKy0tLS0tCisKKzo6CisKKyAgICBuZG4tdGx2LXBlZWsgWy1oXSBbLWZdIFstcl0gWy1tIG1pbl0gWy1NIG1heF0gWy1sIGxpZmV0aW1lXSBbLXBdIFstdyB0aW1lb3V0XSBuYW1lCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitgYG5kbi10bHYtcGVla2BgIGlzIGEgc2ltcGxlIGNvbnN1bWVyIHByb2dyYW0gdGhhdCBzZW5kcyBvbmUgSW50ZXJlc3QgYW5kIGV4cGVjdHMgb25lIERhdGEKK3BhY2tldCBpbiByZXNwb25zZS4gIFRoZSBmdWxsIERhdGEgcGFja2V0IChpbiBUTFYgZm9ybWF0KSBpcyB3cml0dGVuIHRvIHN0ZG91dC4gIFRoZQorcHJvZ3JhbSB0ZXJtaW5hdGVzIHdpdGggcmV0dXJuIGNvZGUgMCBpZiBEYXRhIGFycml2ZXMsIGFuZCB3aXRoIHJldHVybiBjb2RlIDEgd2hlbiB0aW1lb3V0CitvY2N1cnMuCisKK2BgbmFtZWBgIGlzIGludGVycHJldGVkIGFzIHRoZSBJbnRlcmVzdCBuYW1lLgorCitPcHRpb25zCistLS0tLS0tCisKK2BgLWhgYAorICBQcmludCBoZWxwIGFuZCBleGl0CisKK2BgLWZgYAorICBJZiBzcGVjaWZpZWQsIHNldCBgYE11c3RCZUZyZXNoYGAgc2VsZWN0b3IgaW4gdGhlIEludGVyZXN0IHBhY2tldC4KKworYGAtcmBgCisgIFNldCBgYENoaWxkU2VsZWN0b3I9MWBgICh0aGUgcmlnaHRtb3N0IGNoaWxkKSBzZWxlY3Rvci4KKworYGAtbWBgCisgIFNldCBgYG1pbmBgIGFzIHRoZSBgYE1pblN1ZmZpeENvbXBvbmVudHNgYCBzZWxlY3Rvci4KKworYGAtTWBgCisgIFNldCBgYG1heGBgIGFzIHRoZSBgYE1heFN1ZmZpeENvbXBvbmVudHNgYCBzZWxlY3Rvci4KKworYGAtbGBgCisgIFNldCBgYGxpZmV0aW1lYGAgKGluIG1pbGxpc2Vjb25kcykgYXMgdGhlIGBgSW50ZXJlc3RMaWZldGltZWBgLgorCitgYC1wYGAKKyAgSWYgc3BlY2lmaWVkLCBwcmludCB0aGUgcmVjZWl2ZWQgcGF5bG9hZCBvbmx5LCBub3QgdGhlIGZ1bGwgcGFja2V0LgorCitgYC13YGAKKyAgVGltZW91dCBhZnRlciBgYHRpbWVvdXRgYCBtaWxsaXNlY29uZHMuCisKKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK1NlbmQgSW50ZXJlc3QgZm9yIGBgbmRuOi9hcHAxL3ZpZGVvYGAgYW5kIHByaW50IHRoZSByZWNlaXZlZCBwYXlsb2FkIG9ubHkKKworOjoKKworICAgIG5kbi10bHYtcGVlayAtcCBuZG46L2FwcDEvdmlkZW8KZGlmZiAtLWdpdCBhL05GRC9kb2NzL21hbnBhZ2VzL25kbi10bHYtcG9rZS5yc3QgYi9ORkQvZG9jcy9tYW5wYWdlcy9uZG4tdGx2LXBva2UucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYWNiODIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9tYW5wYWdlcy9uZG4tdGx2LXBva2UucnN0CkBAIC0wLDAgKzEsNTQgQEAKK25kbi10bHYtcG9rZQorPT09PT09PT09PT09CisKK1VzYWdlCistLS0tLQorCis6OgorCisgICAgbmRuLXRsdi1wb2tlIFstaF0gWy1mXSBbLURdIFstaSBpZGVudGl0eV0gWy1GXSBbLXggZnJlc2huZXNzXSBbLXcgdGltZW91dF0gbmFtZQorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworYGBuZG4tdGx2LXBva2VgYCBpcyBhIHNpbXBsZSBwcm9kdWNlciBwcm9ncmFtIHRoYXQgcmVhZHMgcGF5bG9hZCBmcm9tIHN0ZGluIGFuZCBwdWJsaXNoZXMgaXQKK2FzIGEgc2luZ2xlIE5ETiBEYXRhIHBhY2tldC4gIFRoZSBEYXRhIHBhY2tldCBpcyBwdWJsaXNoZWQgZWl0aGVyIGFzIGEgcmVzcG9uc2UgdG8gdGhlCitpbmNvbWluZyBJbnRlcmVzdCBmb3IgdGhlIGdpdmVuIGBgbmFtZWBgLCBvciBmb3JjZWZ1bGx5IHB1c2hlZCB0byB0aGUgbG9jYWwgTkROCitmb3J3YXJkZXIncyBjYWNoZSBpZiBgYC1mYGAgZmxhZyBpcyBzcGVjaWZpZWQuCisKK1RoZSBwcm9ncmFtIHRlcm1pbmF0ZXMgd2l0aCByZXR1cm4gY29kZSAwIGlmIERhdGEgaXMgc2VudCBhbmQgd2l0aCByZXR1cm4gY29kZSAxIHdoZW4KK3RpbWVvdXQgb2NjdXJzLgorCitPcHRpb25zCistLS0tLS0tCisKK2BgLWhgYAorICBQcmludCB1c2FnZSBhbmQgZXhpdC4KKworYGAtZmBgCisgIElmIHNwZWNpZmllZCwgc2VuZCBEYXRhIHdpdGhvdXQgd2FpdGluZyBmb3IgSW50ZXJlc3QuCisKK2BgLURgYAorICBJZiBzcGVjaWZpZWQsIHVzZSBgYERpZ2VzdFNoYTI1NmBgIHNpZ25hdHVyZSBpbnN0ZWFkIG9mIGRlZmF1bHQgYGBTaWduYXR1cmVTaGEyNTZXaXRoUnNhYGAuCisKK2BgLWlgYAorICBVc2UgYGBpZGVudGl0eWBgIHRvIHNpZ24gdGhlIGNyZWF0ZWQgRGF0YSBwYWNrZXQuCisKK2BgLUZgYAorICBTZXQgYGBGaW5hbEJsb2NrSWRgYCB0byB0aGUgbGFzdCBjb21wb25lbnQgb2Ygc3BlY2lmaWVkIG5hbWUuCisKK2BgLXhgYAorICBTZXQgYGBGcmVzaG5lc3NQZXJpb2RgYCBpbiBtaWxsaXNlY29uZHMuCisKK2BgLXdgYAorICBXYWl0IGF0IG1vc3QgYGB0aW1lb3V0YGAgbWlsbGlzZWNvbmRzIGZvciB0aGUgaW5jb21pbmcgSW50ZXJlc3QuICBJZiBubyBJbnRlcmVzdCBhcnJpdmVzCisgIHdpdGhpbiB0aGUgYGB0aW1lb3V0YGAsIHRoZSBEYXRhIHBhY2tldCB3aWxsIG5vdCBiZSBwdWJsaXNoZWQuCisKKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK0NyZWF0ZSBEYXRhIHBhY2tldCB3aXRoIGNvbnRlbnQgYGBoZWxsb2BgIHdpdGggdGhlIG5hbWUgYGBuZG46L2FwcC92aWRlb2BgIGFuZCB3YWl0IGF0Cittb3N0IDMgc2Vjb25kcyBmb3IgdGhlIGluY29taW5nIEludGVyZXN0IGZvciBpdDo6CisKKyAgICBlY2hvICJIZWxsbyIgfCBidWlsZC9iaW4vbmRuLXRsdi1wb2tlIC13IDMwMDAgbmRuOi9hcHAvdmlkZW8KZGlmZiAtLWdpdCBhL05GRC9kb2NzL21hbnBhZ2VzL25mZC1hdXRvcmVnLnJzdCBiL05GRC9kb2NzL21hbnBhZ2VzL25mZC1hdXRvcmVnLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjg1MjhkCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbWFucGFnZXMvbmZkLWF1dG9yZWcucnN0CkBAIC0wLDAgKzEsNTcgQEAKK25kbi1hdXRvcmVnCis9PT09PT09PT09PQorCitVc2FnZQorLS0tLS0KKworOjoKKworICAgIG5mZC1hdXRvcmVnIC0tcHJlZml4PTwvYXV0b3JlZy9wcmVmaXg+IFstLXByZWZpeD08L2Fub3RoZXIvcHJlZml4Pl0gLi4uCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitgYGF1dG9yZWctc2VydmVyYGAgaXMgYSBkZWFtb24gYXBwbGljYXRpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkCitwcmVmaXgoZXMpIHdoZW4gbmV3IG9uLWRlbWFuZCBGYWNlIGlzIGNyZWF0ZWQgKGkuZS4sIHdoZW4gYSBuZXcgVURQIGZhY2UgaXMgY3JlYXRlZAorYXMgYSByZXN1bHQgb2YgYW4gaW5jb21pbmcgcGFja2V0IG9yIFRDUCBmYWNlIGlzIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgYW4gaW5jb21pbmcKK2Nvbm5lY3Rpb24pLgorCitPcHRpb25zCistLS0tLS0tCisKK2BgLWhgYCBvciBgYC0taGVscGBgCisgIFByb2R1Y2UgaGVscCBtZXNzYWdlLgorCitgYC1pYGAgb3IgYGAtLXByZWZpeGBgCisgIFByZWZpeCB0aGF0IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgd2hlbiBhIG5ldyByZW1vdGUgZmFjZSBpcyBjcmVhdGVkLgorICBDYW4gYmUgcmVwZWF0ZWQgbXVsdGlwbGUgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIHByZWZpeGVzLgorCitgYC1jYGAgb3IgYGAtLWNvc3RgYAorICBSSUIgY29zdCB0byBiZSBhc3NpZ25lZCB0byBhdXRvLXJlZ2lzdGVyZWQgcHJlZml4ZXMuICAgaWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdCBjb3N0CisgIGlzIHNldCB0byAyNTUuCisKK2BgLXdgYCBvciBgYC0td2hpdGVsaXN0YGAKKyAgV2hpdGVsaXN0ZWQgbmV0d29yaywgZS5nLiwgMTkyLjE2OC4yLjAvMjQgb3IgOjoxLzEyOC4gICBDYW4gYmUgcmVwZWF0ZWQgbXVsdGlwbGUgdGltZXMKKyAgdG8gc3BlY2lmeSBtdWx0aXBsZSB3aGl0ZWxpc3RlZCBuZXR3b3Jrcy4KKworICBQcmVmaXgoZXMpIHdpbGwgYmUgYXV0by1yZWdpc3RlcmVkIG9ubHkgd2hlbiByZW1vdGUgSVAgYWRkcmVzcyBpcyB3aXRoaW4gdGhlIHNwZWNpZmllZAorICByYW5nZShzKSwgZXhjZXB0IGJsYWNrbGlzdCByYW5nZXMuCisKKyAgRGVmYXVsdDogMC4wLjAuMC8wIGFuZCA6Oi8wCisKK2BgLWJgYCBvciBgYC0tYmxhY2tsaXN0YGAKKyAgQmxhY2tsaXN0ZWQgbmV0d29yaywgZS5nLiwgMTkyLjE2OC4yLjMyLzMwIG9yIDo6MS8xMjguICBDYW4gYmUgcmVwZWF0ZWQgbXVsdGlwbGUgdGltZXMKKyAgdG8gc3BlY2lmeSBtdWx0aXBsZSBibGFja2xpc3RlZCBuZXR3b3Jrcy4KKworICBQcmVmaXgoZXMpIHdpbGwgYmUgYXV0by1yZWdpc3RlcmVkIG9ubHkgd2hlbiByZW1vdGUgSVAgYWRkcmVzcyBpbiAqKk5PVCoqIHdpdGhpbiB0aGUKKyAgc3BlY2lmaWVkIHJhbmdlKHMpLCBidXQgaXMgd2l0aGluIHRoZSByYW5nZSBkZWZpbmUgYnkgdGhlIHdoaXRlbGlzdChzKS4KKworICBEZWZhdWx0OiBub25lCisKK0V4YW1wbGVzCistLS0tLS0tLQorCitBdXRvLXJlZ2lzdGVyIHR3byBwcmVmaXhlcyBmb3IgYW55IG5ld2x5IGNyZWF0ZWQgb24tZGVtYW5kIEZhY2UsIGV4Y2VwdCB0aG9zZSB0aGF0IGhhcworc291cmNlIElQIGFkZHJlc3MgaW4gYGAxMC4wLjAuMC84YGAgbmV0d29yazo6CisKKyAgICBuZmQtYXV0b3JlZyAtLXByZWZpeD0vYXBwMS92aWRlbyAtLXByZWZpeD0vYXBwMi9waWN0dXJlcyAtYiAxMC4wLjAuMC84CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9tYW5wYWdlcy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLnJzdCBiL05GRC9kb2NzL21hbnBhZ2VzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXIucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YWEwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9tYW5wYWdlcy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLnJzdApAQCAtMCwwICsxLDQzIEBACituZmQtc3RhdHVzLWh0dHAtc2VydmVyCis9PT09PT09PT09PT09PT09PT09PT09CisKK1VzYWdlCistLS0tLQorCis6OgorCisgICAgbmZkLXN0YXR1cy1odHRwLXNlcnZlciBbLWhdIFstcCBwb3J0IG51bWJlcl0gWy1hIElQIGFkZHJlc3NdIFstcl0gWy12XQorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworYGBuZmQtc3RhdHVzLWh0dHAtc2VydmVyYGAgaXMgYSBkYWVtb24gdGhhdCBlbmFibGVzIHJldHJpZXZhbCBvZiBORkQgc3RhdHVzIHZpYSBIVFRQIHByb3RvY29sLgorCitPcHRpb25zCistLS0tLS0tCisKK2BgLWhgYAorICBTaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCitgYC1wYGAKKyAgSFRUUCBzZXJ2ZXIgcG9ydCBudW1iZXIgKGRlZmF1bHQgaXMgODA4MCkuCisKK2BgLWFgYAorICBIVFRQIHNlcnZlciBJUCBhZGRyZXNzIChkZWZhdWx0IGlzIDEyNy4wLjAuMSkuCisKK2BgLXJgYAorICBFbmFibGUgSFRUUCByb2JvdHMgdG8gY3Jhd2wgKGRpc2FibGVkIGJ5IGRlZmF1bHQpLgorCitgYC12YGAKKyAgVmVyYm9zZSBtb2RlLgorCitFeGFtcGxlcworLS0tLS0tLS0KKworRW5hYmxlIE5GRCBIVFRQIHN0YXR1cyBzZXJ2ZXIgb24gYWxsIElQdjQgaW50ZXJmYWNlczo6CisKKyAgICBuZmQtc3RhdHVzLWh0dHAtc2VydmVyIC1wIDgwIC1hIDAuMC4wLjAKKworRW5hYmxlIE5GRCBIVFRQIHN0YXR1cyBzZXJ2ZXIgb24gYWxsIElQdjYgaW50ZXJmYWNlczo6CisKKyAgICBuZmQtc3RhdHVzLWh0dHAtc2VydmVyIC1wIDgwIC1hIDo6CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9tYW5wYWdlcy9uZmQtc3RhdHVzLnJzdCBiL05GRC9kb2NzL21hbnBhZ2VzL25mZC1zdGF0dXMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYWJlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9tYW5wYWdlcy9uZmQtc3RhdHVzLnJzdApAQCAtMCwwICsxLDk5IEBACituZmQtc3RhdHVzCis9PT09PT09PT09CisKK1VzYWdlCistLS0tLQorCis6OgorCisgICAgbmZkLXN0YXR1cyBbb3B0aW9uc10KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK2BgbmZkLXN0YXR1c2BgIGlzIGEgdG9vbCB0byByZXRyaWV2ZSBhbmQgcHJpbnQgb3V0IE5GRCB2ZXJzaW9uIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24uCisKK09wdGlvbnM6CistLS0tLS0tLQorCitgYC1oYGAKKyAgUHJpbnQgdXNhZ2UgaW5mb3JtYXRpb24uCisKK2BgLXZgYAorICBSZXRyaWV2ZSB2ZXJzaW9uIGluZm9ybWF0aW9uLgorCitgYC1jYGAKKyAgUmV0cmlldmUgY2hhbm5lbCBzdGF0dXMgaW5mb3JtYXRpb24uCisKK2BgLWZgYAorICBSZXRyaWV2ZSBmYWNlIHN0YXR1cyBpbmZvcm1hdGlvbi4KKworYGAtYmBgCisgIFJldHJpZXZlIEZJQiBpbmZvcm1hdGlvbi4KKworYGAtcmBgCisgIFJldHJpZXZlIFJJQiBpbmZvcm1hdGlvbi4KKworYGAtc2BgCisgIFJldHJpZXZlIGNvbmZpZ3VyZWQgc3RyYXRlZ3kgY2hvaWNlIGZvciBORE4gbmFtZXNwYWNlcy4KKworYGAteGBgCisgIE91dHB1dCBORkQgc3RhdHVzIGluZm9ybWF0aW9uIGluIFhNTCBmb3JtYXQuCisKK2BgLVZgYAorICBTaG93IHZlcnNpb24gaW5mb3JtYXRpb24gb2YgbmZkLXN0YXR1cyBhbmQgZXhpdC4KKworSWYgbm8gb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQuCisKK0lmIC14IGlzIHByb3ZpZGVkLCBvdGhlciBvcHRpb25zKC12LCAtYywgZXRjLikgYXJlIGlnbm9yZWQsIGFuZCBhbGwgaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBpbiBYTUwgZm9ybWF0LgorCitFeGFtcGxlcworLS0tLS0tLS0KKworR2V0IGFsbCBzdGF0dXMgaW5mb3JtYXRpb24gZnJvbSBORkQ6OgorCisgICAgJCBuZmQtc3RhdHVzCisKKyAgICBHZW5lcmFsIE5GRCBzdGF0dXM6CisgICAgICAgICAgICAgICAgICAgICBuZmRJZD0vY2hlbmd5dS9LRVkva3NrLTE0MDUxMzYzNzcwMTgvSUQtQ0VSVAorICAgICAgICAgICAgICAgICAgIHZlcnNpb249MjAwMAorICAgICAgICAgICAgICAgICBzdGFydFRpbWU9MjAxNDA3MjVUMjMyMzQxLjM3NDAwMAorICAgICAgICAgICAgICAgY3VycmVudFRpbWU9MjAxNDA3MjVUMjMzMjQwCisgICAgICAgICAgICAgICAgICAgIHVwdGltZT01Mzggc2Vjb25kcworICAgICAgICAgIG5OYW1lVHJlZUVudHJpZXM9MTAKKyAgICAgICAgICAgICAgIG5GaWJFbnRyaWVzPTMKKyAgICAgICAgICAgICAgIG5QaXRFbnRyaWVzPTIKKyAgICAgIG5NZWFzdXJlbWVudHNFbnRyaWVzPTAKKyAgICAgICAgICAgICAgICBuQ3NFbnRyaWVzPTU2CisgICAgICAgICAgICAgIG5JbkludGVyZXN0cz01NQorICAgICAgICAgICAgIG5PdXRJbnRlcmVzdHM9NTQKKyAgICAgICAgICAgICAgICAgIG5JbkRhdGFzPTU2CisgICAgICAgICAgICAgICAgIG5PdXREYXRhcz00NworICAgIENoYW5uZWxzOgorICAgICAgd3M6Ly9bOjpdOjk2OTYKKyAgICAgIHVuaXg6Ly8vcHJpdmF0ZS92YXIvcnVuL25mZC5zb2NrCisgICAgICB1ZHA2Oi8vWzo6XTo2MzYzCisgICAgICB1ZHA0Oi8vMC4wLjAuMDo2MzYzCisgICAgICB0Y3A2Oi8vWzo6XTo2MzYzCisgICAgICB0Y3A0Oi8vMC4wLjAuMDo2MzYzCisgICAgRmFjZXM6CisgICAgICBmYWNlaWQ9MSByZW1vdGU9aW50ZXJuYWw6Ly8gbG9jYWw9aW50ZXJuYWw6Ly8gY291bnRlcnM9e2luPXswaSA1MmQgMEJ9IG91dD17NTFpIDBkIDBCfX0gbG9jYWwKKyAgICAgIGZhY2VpZD0yNTQgcmVtb3RlPWNvbnRlbnRzdG9yZTovLyBsb2NhbD1jb250ZW50c3RvcmU6Ly8gY291bnRlcnM9e2luPXswaSAwZCAwQn0gb3V0PXswaSAwZCAwQn19IGxvY2FsCisgICAgICBmYWNlaWQ9MjU1IHJlbW90ZT1udWxsOi8vIGxvY2FsPW51bGw6Ly8gY291bnRlcnM9e2luPXswaSAwZCAwQn0gb3V0PXswaSAwZCAwQn19IGxvY2FsCisgICAgICBmYWNlaWQ9MjU2IHJlbW90ZT11ZHA0Oi8vMjI0LjAuMjMuMTcwOjU2MzYzIGxvY2FsPXVkcDQ6Ly8xMjkuODIuMTM4LjIxMTo1NjM2MyBjb3VudGVycz17aW49ezBpIDBkIDBCfSBvdXQ9ezBpIDBkIDBCfX0KKyAgICAgIGZhY2VpZD0yNTcgcmVtb3RlPXVkcDQ6Ly8yMjQuMC4yMy4xNzA6NTYzNjMgbG9jYWw9dWRwNDovLzEyNy4wLjAuMTo1NjM2MyBjb3VudGVycz17aW49ezBpIDBkIDBCfSBvdXQ9ezBpIDBkIDBCfX0KKyAgICAgIGZhY2VpZD0yNTggcmVtb3RlPWV0aGVyOi8vWzAxOjAwOjVlOjAwOjE3OmFhXSBsb2NhbD1kZXY6Ly9icmlkZ2UwIGNvdW50ZXJzPXtpbj17MGkgMGQgMEJ9IG91dD17MGkgMGQgMEJ9fQorICAgICAgZmFjZWlkPTI1OSByZW1vdGU9ZXRoZXI6Ly9bMDE6MDA6NWU6MDA6MTc6YWFdIGxvY2FsPWRldjovL2VuMCBjb3VudGVycz17aW49ezBpIDBkIDBCfSBvdXQ9ezBpIDBkIDBCfX0KKyAgICAgIGZhY2VpZD0yNjAgcmVtb3RlPWV0aGVyOi8vWzAxOjAwOjVlOjAwOjE3OmFhXSBsb2NhbD1kZXY6Ly9lbjEgY291bnRlcnM9e2luPXswaSAwZCAwQn0gb3V0PXswaSAwZCAwQn19CisgICAgICBmYWNlaWQ9MjYxIHJlbW90ZT1ldGhlcjovL1swMTowMDo1ZTowMDoxNzphYV0gbG9jYWw9ZGV2Oi8vZW4yIGNvdW50ZXJzPXtpbj17MGkgMGQgMEJ9IG91dD17MGkgMGQgMEJ9fQorICAgICAgZmFjZWlkPTI2MiByZW1vdGU9ZmQ6Ly8zMCBsb2NhbD11bml4Oi8vL3ByaXZhdGUvdmFyL3J1bi9uZmQuc29jayBjb3VudGVycz17aW49ezI0aSA2ZCA0ODgwQn0gb3V0PXs2aSAxNmQgODQxN0J9fSBsb2NhbCBvbi1kZW1hbmQKKyAgICAgIGZhY2VpZD0yNjggcmVtb3RlPWZkOi8vMzEgbG9jYWw9dW5peDovLy9wcml2YXRlL3Zhci9ydW4vbmZkLnNvY2sgY291bnRlcnM9e2luPXsxaSAwZCA0MTBCfSBvdXQ9ezBpIDFkIDc2NEJ9fSBsb2NhbCBvbi1kZW1hbmQKKyAgICAgIGZhY2VpZD0yNjkgcmVtb3RlPWZkOi8vMzIgbG9jYWw9dW5peDovLy9wcml2YXRlL3Zhci9ydW4vbmZkLnNvY2sgY291bnRlcnM9e2luPXszaSAwZCAxMzdCfSBvdXQ9ezBpIDJkIDkyNUJ9fSBsb2NhbCBvbi1kZW1hbmQKKyAgICBGSUI6CisgICAgICAvbG9jYWxob3N0L25mZCBuZXh0aG9wcz17ZmFjZWlkPTEgKGNvc3Q9MCl9CisgICAgICAvZXhhbXBsZS90ZXN0QXBwIG5leHRob3BzPXtmYWNlaWQ9MjY4IChjb3N0PTApfQorICAgICAgL2xvY2FsaG9zdC9uZmQvcmliIG5leHRob3BzPXtmYWNlaWQ9MjYyIChjb3N0PTApfQorICAgIFJJQjoKKyAgICAgIC9leGFtcGxlL3Rlc3RBcHAgcm91dGU9e2ZhY2VpZD0yNjggKG9yaWdpbj0wIGNvc3Q9MCBmbGFncz0xKX0KKyAgICBTdHJhdGVneSBjaG9pY2VzOgorICAgICAgLyBzdHJhdGVneT0vbG9jYWxob3N0L25mZC9zdHJhdGVneS9iZXN0LXJvdXRlCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9tYW5wYWdlcy9uZmQucnN0IGIvTkZEL2RvY3MvbWFucGFnZXMvbmZkLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmEwZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbWFucGFnZXMvbmZkLnJzdApAQCAtMCwwICsxLDM4IEBACituZmQKKz09PQorCitVc2FnZQorLS0tLS0KKworOjoKKworICAgIG5mZCBbb3B0aW9uc10KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworTkZEIGZvcndhcmRpbmcgZGFlbW9uLgorCisKK09wdGlvbnM6CistLS0tLS0tLQorCitgYC0taGVscGBgCisgIFByaW50IHRoaXMgaGVscCBtZXNzYWdlLgorCitgYC0tbW9kdWxlc2BgCisgIExpc3QgYXZhaWxhYmxlIGxvZ2dpbmcgbW9kdWxlcworCitgYC0tY29uZmlnIDxwYXRoL3RvL25mZC5jb25mPmBgCisgIFNwZWNpZnkgdGhlIHBhdGggdG8gbmZkIGNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdDogYGAke1NZU0NPTkZESVJ9L25kbi9uZmQuY29uZmBgKS4KKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK1N0YXJ0IE5GRCBmb3J3YXJkaW5nIGRhZW1vbiBhcyBzdXBlciB1c2VyIGFuZCB1c2UgYSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSB0aGUgY3VycmVudAord29ya2luZyBkaXJlY3RvcnkuCisKKzo6CisKKyAgICBzdWRvIG5mZCAtLWNvbmZpZyBuZmQuY29uZgpkaWZmIC0tZ2l0IGEvTkZEL2RvY3MvbWFucGFnZXMvbmZkYy5yc3QgYi9ORkQvZG9jcy9tYW5wYWdlcy9uZmRjLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q2OTFjCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbWFucGFnZXMvbmZkYy5yc3QKQEAgLTAsMCArMSwxOTAgQEAKK25mZGMKKz09PT0KKworVXNhZ2UKKy0tLS0tCisKKzo6CisKKyAgICBuZmRjIFstaF0gQ09NTUFORCBbPGNvbW1hbmQgb3B0aW9ucz5dCisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK2BgbmZkY2BgIGlzIGEgdG9vbCB0byBtYW5pcHVsYXRlIHJvdXRpbmcgaW5mb3JtYXRpb24gYmFzZSAoUklCKSwgZm9yd2FyZGluZyBpbmZvcm1hdGlvbgorYmFzZSAoRklCKSwgYW5kIFN0cmF0ZWd5Q2hvaWNlcyB0YWJsZSAoaS5lLiwgd2hpY2ggc3RyYXRlZ3kgc2hvdWxkIGJlIHVzZWQgYnkgd2hpY2gKK25hbWVzcGFjZXMpLgorCitPcHRpb25zCistLS0tLS0tCisKK2BgLWhgYAorICBQcmludCB1c2FnZSBpbmZvcm1hdGlvbi4KKworYGBDT01NQU5EYGAKKworICBgYHJlZ2lzdGVyYGAKKyAgICBSZWdpc3RlciBhIG5ldyBvciB1cGRhdGUgZXhpc3Rpbmcgcm91dGluZyBlbnRyeSBpbiBSb3V0aW5nIEluZm9ybWF0aW9uIEJhc2UgKFJJQikuCisKKyAgICBgYHJlZ2lzdGVyIFstSV0gWy1DXSBbLWMgPGNvc3Q+XSBbLWUgZXhwaXJhdGlvbiB0aW1lXSBbLW8gb3JpZ2luXSA8cHJlZml4PiA8ZmFjZUlkIHwgZmFjZVVyaT5gYAorCisgICAgICBgYC1JYGAKKyAgICAgICAgVW5zZXQgQ0hJTERfSU5IRVJJVCBmbGFnIGZyb20gdGhlIHJvdXRpbmcgZW50cnkuCisKKyAgICAgIGBgLUNgYAorICAgICAgICBTZXQgQ0FQVFVSRSBmbGFnIGluIHRoZSByb3V0aW5nIGVudHJ5LgorCisgICAgICBgYC1jIDxjb3N0PmBgCisgICAgICAgIENvc3QgZm9yIHRoZSBSSUIgZW50cnkgKGRlZmF1bHQgaXMgMCkuCisKKyAgICAgIGBgLWUgPGV4cGlyYXRpb24gdGltZT5gYAorICAgICAgICBFeHBpcmF0aW9uIHRpbWUgb2YgdGhlIFJJQiBlbnRyeSBpbiBtaWxsaXNlY29uZHMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBlbnRyeSByZW1haW5zIGluIEZJQgorICAgICAgICBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhc3NvY2lhdGVkIGZhY2UuCisKKyAgICAgICBgYC1vIDxvcmlnaW4+YGAKKyAgICAgICAgT3JpZ2luIG9mIHRoZSByZWdpc3RyYXRpb24gcmVxdWVzdCAoZGVmYXVsdCBpcyAyNTUpLgorICAgICAgICAwIGZvciBMb2NhbCBwcm9kdWNlciBhcHBsaWNhdGlvbnMsIDEyOCBmb3IgTkxTUiwgMjU1IGZvciBzdGF0aWMgcm91dGVzLgorCisgICAgICBgYHByZWZpeGBgCisgICAgICAgIEEgcHJlZml4IG9mIGFuIGV4aXN0aW5nIG9yIHRvIGJlIGNyZWF0ZWQgUklCIGVudHJ5LCBmb3Igd2hpY2ggcm91dGluZyBlbnRyeSBpcworICAgICAgICByZXF1ZXN0ZWQgdG8gYmUgYWRkZWQgb3IgdXBkYXRlZC4KKworICAgICAgYGBmYWNlSWRgYAorICAgICAgICBBbiBleGlzdGluZyBORkQgRmFjZSBJRCBudW1iZXIsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCwgZm9yIGV4YW1wbGUsIHVzaW5nCisgICAgICAgIGBgbmZkLXN0YXR1c2BgIGNvbW1hbmQuCisKKyAgICAgIGBgZmFjZVVyaWBgCisgICAgICAgIFVSSSBvZiB0aGUgZXhpc3Rpbmcgb3IgdG8gYmUgY3JlYXRlZCBGYWNlLgorCisgIGBgdW5yZWdpc3RlcmBgCisgICAgVW5yZWdpc3RlciBhbiBleGlzdGluZyByb3V0aW5nIGVudHJ5IGZyb20gUm91dGluZyBJbmZvcm1hdGlvbiBCYXNlIChSSUIpLgorCisgICAgYGB1bnJlZ2lzdGVyIFstbyBvcmlnaW5dIDxwcmVmaXg+IDxmYWNlSWQ+YGAKKworICAgICAgIGBgLW8gPG9yaWdpbj5gYAorICAgICAgICBPcmlnaW4gb2YgdGhlIHVucmVnaXN0cmF0aW9uIHJlcXVlc3QgKGRlZmF1bHQgaXMgMjU1KS4KKworICAgICAgIGBgcHJlZml4YGAKKyAgICAgICAgQSBwcmVmaXggb2YgYW4gZXhpc3RpbmcgUklCIGVudHJ5LCBmcm9tIHdoaWNoIHJvdXRpbmcgZW50cnkgaXMgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIHJlbW92ZWQuCisKKyAgICAgIGBgZmFjZUlkYGAKKyAgICAgICAgQW4gZXhpc3RpbmcgTkZEIEZhY2UgSUQgbnVtYmVyLCB3aGljaCBjYW4gYmUgb2J0YWluZWQsIGZvciBleGFtcGxlLCB1c2luZworICAgICAgICBgYG5mZC1zdGF0dXNgYCBjb21tYW5kLgorCisgIGBgY3JlYXRlYGAKKyAgICBDcmVhdGUgYSBVRFAgdW5pY2FzdCBvciBUQ1AgRmFjZQorCisgICAgYGBjcmVhdGUgPGZhY2VVcmk+YGAKKworICAgICAgYGBmYWNlVXJpYGAKKyAgICAgICAgVURQIHVuaWNhc3Qgb3IgVENQIEZhY2UgVVJJOjoKKworICAgICAgICAgICAgVURQIHVuaWNhc3Q6ICAgIHVkcFs0fDZdOi8vPHJlbW90ZS1JUC1vci1ob3N0Pls6PHJlbW90ZS1wb3J0Pl0KKyAgICAgICAgICAgIFRDUDogICAgICAgICAgICB0Y3BbNHw2XTovLzxyZW1vdGUtSVAtb3ItaG9zdD5bOjxyZW1vdGUtcG9ydD5dCisKKyAgYGBkZXN0cm95YGAKKyAgICBDcmVhdGUgYW4gZXhpc3RpbmcgVURQIHVuaWNhc3Qgb3IgVENQIEZhY2UuCisKKyAgICBgYGRlc3Ryb3kgPGZhY2VJZCB8IGZhY2VVcmk+YGAKKworICAgICAgYGBmYWNlSWRgYAorICAgICAgICBBbiBleGlzdGluZyBORkQgRmFjZSBJRCBudW1iZXIsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCwgZm9yIGV4YW1wbGUsIHVzaW5nCisgICAgICAgIGBgbmZkLXN0YXR1c2BgIGNvbW1hbmQuCisKKyAgICAgIGBgZmFjZVVyaWBgCisgICAgICAgIFVEUCB1bmljYXN0IG9yIFRDUCBGYWNlIFVSSTo6CisKKyAgICAgICAgICAgIFVEUCB1bmljYXN0OiAgICB1ZHBbNHw2XTovLzxyZW1vdGUtSVAtb3ItaG9zdD5bOjxyZW1vdGUtcG9ydD5dCisgICAgICAgICAgICBUQ1A6ICAgICAgICAgICAgdGNwWzR8Nl06Ly88cmVtb3RlLUlQLW9yLWhvc3Q+Wzo8cmVtb3RlLXBvcnQ+XQorCisgIGBgc2V0LXN0cmF0ZWd5YGAKKyAgICBTZWxlY3Qgc3RyYXRlZ3kgdG8gYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UKKworICAgIGBgc2V0LXN0cmF0ZWd5IDxuYW1lc3BhY2U+IDxzdHJhdGVneS1uYW1lPmBgCisKKyAgICAgIGBgbmFtZXNwYWNlYGAKKyAgICAgICAgTmFtZXNwYWNlIHRoYXQgd2lsbCB1c2UgdGhlIHNwZWNpZmllZCBzdHJhdGVneS4KKworICAgICAgICBOb3RlIHRoYXQgbW9yZSBzcGVjaWZpYyBuYW1lc3BhY2UocykgY2FuIHVzZSBkaWZmZXJlbnQgc3RyYXRlZ3kgb3Igc3RyYXRlZ2llcy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIGlmIG5hbWVzcGFjZSBgYC9BL0IvQ2BgIHdhcyB1c2luZyBzdHJhdGVneQorICAgICAgICBgYG5kbjovbG9jYWxob3N0L25mZC9zdHJhdGVneS9iZXN0LXJvdXRlYGAgYmVmb3JlIHJ1bm5pbmcgYGBzZXQtc3RyYXRlZ3lgYCBvbgorICAgICAgICBgYC9BYGAgbmFtZXNwYWNlLCBpdCB3aWxsIGNvbnRpbnVlIHVzaW5nIHRoZSBzYW1lIHN0cmF0ZWd5IG5vIG1hdHRlciB3aGljaAorICAgICAgICBuYW1lc3BhY2Ugd2FzIHNwZWNpZmllZCBmb3IgYGAvQWBgLgorCisgICAgICBgYHN0cmF0ZWd5LW5hbWVgYAorICAgICAgICBOYW1lIG9mIG9uZSBvZiB0aGUgYXZhaWxhYmxlIHN0cmF0ZWdpZXMuCisKKyAgICAgICAgQ3VycmVudGx5LCBORkQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzOjoKKworICAgICAgICAgICAgbmRuOi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jlc3Qtcm91dGUKKyAgICAgICAgICAgIG5kbjovbG9jYWxob3N0L25mZC9zdHJhdGVneS9icm9hZGNhc3QKKyAgICAgICAgICAgIG5kbjovbG9jYWxob3N0L25mZC9zdHJhdGVneS9jbGllbnQtY29udHJvbAorICAgICAgICAgICAgbmRuOi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L25jYworCisgIGBgdW5zZXQtc3RyYXRlZ3lgYAorICAgIFVuc2V0IHRoZSBzdHJhdGVneSBmb3IgYSBnaXZlbiBgYG5hbWVzcGFjZWBgLgorCisgICAgRWZmZWN0aXZlbHksIHRoaXMgY29tbWFuZCBzZWxlY3QgcGFyZW50J3MgbmFtZXNwYWNlIHN0cmF0ZWd5IHRvIGJlIHVzZWQgZm9yIHRoZQorICAgIHNwZWNpZmllZCBgYG5hbWVzcGFjZWBgLgorCisgICAgYGB1bnNldC1zdHJhdGVneSA8bmFtZXNwYWNlPmBgCisKKyAgICAgIGBgbmFtZXNwYWNlYGAKKyAgICAgICAgTmFtZXNwYWNlIGZyb20gd2hpY2ggbmFtZXNwYWNlIGN1c3RvbWl6YXRpb24gc2hvdWxkIGJlIHJlbW92ZWQuCisKKyAgYGBhZGQtbmV4dGhvcGBgCisgICAgRGlyZWN0bHkgYWRkIG5leHRob3AgZW50cnkgaW5mbyBORkQncyBGb3J3YXJkaW5nIEluZm9ybWF0aW9uIEJhc2UgKEZJQikuICBUaGlzIGNvbW1hbmQKKyAgICBpcyBpbnRlbmRlZCBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBOb3JtYWxseSwgcHJlZml4LW5leGhvcCBhc3NvY2lhdGlvbiBzaG91bGQKKyAgICBiZSByZWdpc3RlcmVkIGluIFJvdXRpbmcgSW5mb3JtYXRpb24gQmFzZSB1c2luZyBgYHJlZ2lzdGVyYGAgY29tbWFuZC4KKworICAgIGBgYWRkLW5leHRob3AgWy1jIDxjb3N0Pl0gPHByZWZpeD4gPGZhY2VJZCB8IGZhY2VVcmk+YGAKKworICAgICAgYGAtYyA8Y29zdD5gYAorICAgICAgICBDb3N0IGZvciB0aGUgbmV4dGhvcCBlbnRyeSB0byBiZSBpbnNlcnRlZCAoZGVmYXVsdCBpcyAwKS4KKworICAgICAgYGBwcmVmaXhgYAorICAgICAgICBBIHByZWZpeCBvZiBhbiBleGlzdGluZyBvciB0byBiZSBjcmVhdGVkIEZJQiBlbnRyeSwgdG8gd2hpY2ggbmV4dGhvcAorICAgICAgICBlbnRyeSBpcyByZXF1ZXN0ZWQgdG8gYmUgYWRkZWQuCisKKyAgICAgIGBgZmFjZUlkYGAKKyAgICAgICAgQW4gZXhpc3RpbmcgTkZEIEZhY2UgSUQgbnVtYmVyLCB3aGljaCBjYW4gYmUgb2J0YWluZWQsIGZvciBleGFtcGxlLCB1c2luZworICAgICAgICBgYG5mZC1zdGF0dXNgYCBjb21tYW5kCisKKyAgICAgIGBgZmFjZVVyaWBgCisgICAgICAgIFVSSSBvZiB0aGUgZXhpc3Rpbmcgb3IgdG8gYmUgY3JlYXRlZCBGYWNlLgorCisgIGBgcmVtb3ZlLW5leHRob3BgYAorICAgIERpcmVjdGx5IHJlbW92ZSBuZXh0aG9wIGVudHJ5IGZyb20gTkZEJ1MgRklCLiAgVGhpcyBjb21tYW5kCisgICAgaXMgaW50ZW5kZWQgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAgTm9ybWFsbHksIHByZWZpeC1uZXhob3AgYXNzb2NpYXRpb24gc2hvdWxkCisgICAgYmUgdW5yZWdpc3RlcmVkIGZyb20gUm91dGluZyBJbmZvcm1hdGlvbiBCYXNlIHVzaW5nIGBgdW5yZWdpc3RlcmBgIGNvbW1hbmQuCisKKyAgICBgYHJlbW92ZS1uZXh0aG9wIDxwcmVmaXg+IDxmYWNlSWQ+YGAKKworICAgICAgYGBwcmVmaXhgYAorICAgICAgICBBIHByZWZpeCBvZiBhbiBleGlzdGluZyBGSUIgZW50cnksIGZyb20gd2hpY2ggbmV4dGhvcCBlbnRyeSBpcyByZXF1ZXN0ZWQgdG8gYmUgcmVtb3ZlZC4KKworICAgICAgYGBmYWNlSWRgYAorICAgICAgICBBbiBleGlzdGluZyBORkQgRmFjZSBJRCBudW1iZXIsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCwgZm9yIGV4YW1wbGUsIHVzaW5nCisgICAgICAgIGBgbmZkLXN0YXR1c2BgIGNvbW1hbmQuCisKKyAgICAgICAgTm90ZSB0aGF0IHdoZW4gYGBmYWNlSWRgYCBpcyB0aGUgbGFzdCBGYWNlIGFzc29jaWF0ZWQgd2l0aCBgYHByZWZpeGBgIEZJQiBlbnRyeSwKKyAgICAgICAgdGhlIHdob2xlIEZJQiBlbnRyeSB3aWxsIGJlIHJlbW92ZWQuCisKKworCitFeGFtcGxlcworLS0tLS0tLS0KKworQWRkIGEgbmFtZXNwYWNlIHRvIGEgZmFjZSB1cmk6CisKKzo6CisKKyAgICBuZmRjIHJlZ2lzdGVyIG5kbjovYXBwMS92aWRlbyB1ZHA6Ly8xOTIuMTY4LjEuMgorCitTZXQgc3RyYXRlZ3kgdG8gYSBuYW1lOgorCis6OgorCisgICAgbmZkYyBzZXQtc3RyYXRlZ3kgbmRuOi9hcHAxL3ZpZGVvIG5kbjovbG9jYWxob3N0L25mZC9zdHJhdGVneS9icm9hZGNhc3QKZGlmZiAtLWdpdCBhL05GRC9kb2NzL21hbnBhZ2VzL25yZC5yc3QgYi9ORkQvZG9jcy9tYW5wYWdlcy9ucmQucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZmIzODQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9tYW5wYWdlcy9ucmQucnN0CkBAIC0wLDAgKzEsMzQgQEAKK05SRCAoTkZEIFJJQiBEYWVtb24pCis9PT09PT09PT09PT09PT09PT09PQorCitVc2FnZQorLS0tLS0KKworOjoKKworICAgIG5yZCBbb3B0aW9uc10KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworTlJEIGlzIGEgY29tcGxlbWVudGFyeSBkYWVtb24gZGVzaWduZWQgdG8gd29yayBpbiBwYXJhbGxlbCB3aXRoIE5GRCBhbmQgdG8gcHJvdmlkZQorc2VydmljZXMgZm9yIFJvdXRpbmcgSW5mb3JtYXRpb24gQmFzZSBtYW5hZ2VtZW50IGFuZCBjb25zdHJ1Y3RpbmcgTkZEJ3MgRklCOgorCisqIHByZWZpeCByZWdpc3RyYXRpb24gZnJvbSBhcHBsaWNhdGlvbnM7CisqIG1hbnVhbCBwcmVmaXggcmVnaXN0cmF0aW9uOworKiBwcmVmaXggcmVnaXN0cmF0aW9ucyBmcm9tIG11bHRpcGxlIGR5bmFtaWMgcm91dGluZyBwcm90b2NvbHMuCisKK05SRCdzIHJ1bnRpbWUgc2V0dGluZ3MgbWF5IGJlIG1vZGlmaWVkIHZpYSBgcmliXypgIHNlY3Rpb25zIGluIE5GRCdzIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworT3B0aW9uczoKKy0tLS0tLS0tCisKK2BgLS1oZWxwYGAKKyAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UuCisKK2BgLS1tb2R1bGVzYGAKKyAgTGlzdCBhdmFpbGFibGUgbG9nZ2luZyBtb2R1bGVzCisKK2BgLS1jb25maWcgPHBhdGgvdG8vbmZkLmNvbmY+YGAKKyAgU3BlY2lmeSB0aGUgcGF0aCB0byBuZmQgY29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiBgYCR7U1lTQ09ORkRJUn0vbmRuL25mZC5jb25mYGApLgpkaWZmIC0tZ2l0IGEvTkZEL2RvY3MvbWlzYy9sb2NhbC1wcmVmaXgtZGlzY292ZXJ5LnJzdCBiL05GRC9kb2NzL21pc2MvbG9jYWwtcHJlZml4LWRpc2NvdmVyeS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiY2E4NAotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL21pc2MvbG9jYWwtcHJlZml4LWRpc2NvdmVyeS5yc3QKQEAgLTAsMCArMSwzMiBAQAorLi4gX2xvY2FsLXByZWZpeC1kaXNjb3Zlcnk6CisKK0Rpc2NvdmVyIGxvY2FsIGh1YiBwcmVmaXgKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworU29tZSBhcHBsaWNhdGlvbnMgbmVlZCB0byBkaXNjb3ZlciBwcmVmaXgoZXMpIHVuZGVyIHdoaWNoIHRoZXkgY2FuIHB1Ymxpc2ggZGF0YQorLyB3aGljaCBJbnRlcmVzdHMgbG9jYWwgaHViIHdpbGwgYmUgYWJsZSB0byBmb3J3YXJkIGRvd24gdG8gdGhlIGFwcGxpY2F0aW9uLgorSW4gb3JkZXIgdG8gZGlzY292ZXIgdGhhdCwgYXBwbGljYXRpb25zIG5lZWQgdG8gc2VuZCBhbiBpbnRlcmVzdCBmb3IKK2BgL2xvY2FsaG9wL25kbi1hdXRvY29uZi9yb3V0YWJsZS1wcmVmaXhlc2BgIHByZWZpeC4gUmVzcG9uc2UgZGF0YSB0byB0aGUKK2ludGVyZXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBwcmVmaXhlcyBhbmQgc2hvdWxkIGJlIGVuY29kZWQgYXM6CisKKzo6CisKKyAgICBSZXNwb25zZSA6Oj0gREFUQS1UWVBFIFRMVi1MRU5HVEgKKyAgICAgICAgICAgICAgICAgTmFtZSAoPSAvbG9jYWxob3AvbmRuLWF1dG9jb25mL3JvdXRhYmxlLXByZWZpeGVzL1t2ZXJzaW9uXSkKKyAgICAgICAgICAgICAgICAgTWV0YUluZm8gKD0gUmVzcG9uc2VNZXRhSW5mbykKKyAgICAgICAgICAgICAgICAgQ29udGVudCAoPSBSZXNwb25zZUNvbnRlbnQpCisgICAgICAgICAgICAgICAgIFNpZ25hdHVyZQorCisgICAgUmVzcG9uc2VNZXRhSW5mbyA6Oj0gTUVUQS1JTkZPLVRZUEUgVExWLUxFTkdUSAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICg9IERBVEEpCisgICAgICAgICAgICAgICAgICAgICAgICAgRnJlc2huZXNzUGVyaW9kICg9IDUwMDApCisKKyAgICBSZXNwb25zZUNvbnRlbnQgOjo9IE5hbWUrCisKKy4uIG5vdGU6OgorUmVzcG9uc2VDb250ZW50IHNob3VsZCBjb250YWluIGF0IGxlYXN0IG9uZSBOYW1lLCB3aGljaCBzaG91bGQgYmUgcm91dGFibGUKK3Rvd2FyZHMgdGhlIGZhY2UgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCBoYXMgYmVlbiByZWNlaXZlZC4gIFRoZSByZXF1ZXN0ZXIgbWF5Citwcm9jZXNzIGxpc3Qgb2YgdGhlIHJldHVybmVkIG5hbWVzIGFuZCBwaWNrIHdoaWNoZXZlciBpdCB3YW50cyB0byB1c2UuCisKK0ZvciBub3csIHRoZSBgYC9sb2NhbGhvcC9uZG4tYXV0b2NvbmYvcm91dGFibGUtcHJlZml4ZXNgYCBkYXRhIGlzIHNlcnZlZCBieQorOnJlZjpgbmRuLWF1dG9jb25maWctc2VydmVyYC4KZGlmZiAtLWdpdCBhL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbGF5b3V0Lmh0bWwgYi9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL2xheW91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YWU1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL2xheW91dC5odG1sCkBAIC0wLDAgKzEsODUgQEAKK3sjCisgICAgbmFtZWRfZGF0YV90aGVtZS9sYXlvdXQuaHRtbAorICAgIH5+fn5+fn5+fn5+fn5+fn5+CisjfQoreyUgZXh0ZW5kcyAiYmFzaWMvbGF5b3V0Lmh0bWwiICV9CisKK3slIGJsb2NrIGhlYWRlciAlfQorICAgIDwhLS1oZWFkZXJjb250YWluZXItLT4KKyAgICA8ZGl2IGlkPSJoZWFkZXJfY29udGFpbmVyIj4KKworICAgICAgICA8IS0taGVhZGVyLS0+CisgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGhyZWUgY29sdW1ucyI+CisgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJsb2dvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9uYW1lZC1kYXRhLm5ldCIgdGl0bGU9IkEgRnV0dXJlIEludGVybmV0IEFyY2hpdGVjdHVyZSI+PGltZyBzcmM9Imh0dHA6Ly9uYW1lZC1kYXRhLm5ldC93cC1jb250ZW50L3VwbG9hZHMvY3JvcHBlZC0yMDEzMDcyMl9Mb2dvMi5wbmciIGFsdD0iIiAvPjwvYT4KKyAgICAgICAgICAgICAgICAgIDwvZGl2PjwhLS1sb2dvIGVuZC0tPgorICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgPCEtLXRvcCBtZW51LS0+CisgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmluZSBjb2x1bW5zIiBpZD0ibWVudV9jb250YWluZXIiID4KKyAgICAgICAgICAgICAgIDxoMT48YSBocmVmPSJ7eyBwYXRodG8obWFzdGVyX2RvYykgfX0iPnt7IHNob3J0dGl0bGV8ZSB9fTwvYT48L2gxPgorICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj48IS0taGVhZGVyIGNvbnRhaW5lciBlbmQtLT4KKworeyUgZW5kYmxvY2sgJX0KKworeyUgYmxvY2sgY29udGVudCAlfQorICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtd3JhcHBlciI+CisgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQiPgorICAgICAgICAgIHslLSBibG9jayBkb2N1bWVudCAlfQorICAgICAgICAgICAge3sgc3VwZXIoKSB9fQorICAgICAgICAgIHslLSBlbmRibG9jayAlfQorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciI+CisgICAgICAgICAgeyUtIGJsb2NrIHNpZGViYXJ0b2MgJX0KKyAgICAgICAgICA8aDM+e3sgXygnVGFibGUgT2YgQ29udGVudHMnKSB9fTwvaDM+CisgICAgICAgICAge3sgdG9jdHJlZShpbmNsdWRlaGlkZGVuPVRydWUpIH19CisKKyAgICAgICAgICA8aDM+e3sgXygnQWRkaXRpb25hbCBkb2N1bWVuYXRpb24nKSB9fTwvaDM+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpIGNsYXNzPSJ0b2N0cmVlLWwxIj48YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraSI+TkZEIFdpa2k8L2E+PC9saT4KKyAgICAgICAgICAgIDxsaSBjbGFzcz0idG9jdHJlZS1sMSI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iZG94eWdlbi9hbm5vdGF0ZWQuaHRtbCI+QVBJIGRvY3VtZW50YXRpb24gKGRveHlnZW4pPC9hPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgICB7JS0gZW5kYmxvY2sgJX0KKyAgICAgICAgICB7JS0gYmxvY2sgc2lkZWJhcnNlYXJjaCAlfQorICAgICAgICAgIDxoMyBzdHlsZT0ibWFyZ2luLXRvcDogMS41ZW07Ij57eyBfKCdTZWFyY2gnKSB9fTwvaDM+CisgICAgICAgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJ7eyBwYXRodG8oJ3NlYXJjaCcpIH19IiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgLz4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJ7eyBfKCdHbycpIH19IiAvPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hlY2tfa2V5d29yZHMiIHZhbHVlPSJ5ZXMiIC8+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhcmVhIiB2YWx1ZT0iZGVmYXVsdCIgLz4KKyAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgPHAgY2xhc3M9InNlYXJjaHRpcCIgc3R5bGU9ImZvbnQtc2l6ZTogOTAlIj4KKyAgICAgICAgICAgIHt7IF8oJ0VudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4nKSB9fQorICAgICAgICAgIDwvcD4KKyAgICAgICAgICB7JS0gZW5kYmxvY2sgJX0KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBmb290ZXIgJX0KKyAgICA8ZGl2IGlkPSJmb290ZXItY29udGFpbmVyIj4KKyAgICAgICAgPCEtLWZvb3RlciBjb250YWluZXItLT4KKyAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICAgICAgPC9kaXY+PCEtLSBmb290ZXIgY29udGFpbmVyLS0+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGlkPSJmb290ZXItaW5mbyI+CisgICAgICAgIDwhLS1mb290ZXIgY29udGFpbmVyLS0+CisgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0d2VsdmUgY29sdW1ucyI+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjb3B5cmlnaHQiPlRoaXMgcmVzZWFyY2ggaXMgcGFydGlhbGx5IHN1cHBvcnRlZCBieSBOU0YgKEF3YXJkIDxhIGhyZWY9Imh0dHA6Ly93d3cubnNmLmdvdi9hd2FyZHNlYXJjaC9zaG93QXdhcmQ/QVdEX0lEPTEwNDA4NjgiIHRhcmdldD0iX2JsYW5rPiI+Q05TLTEwNDA4Njg8L2E+KTxici8+PGJyLz48YSByZWw9ImxpY2Vuc2UiIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC9kZWVkLmVuX1VTIiB0YXJnZXQ9Il9ibGFuayI+Q3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgVW5wb3J0ZWQgTGljZW5zZTwvYT4gZXhjZXB0IHdoZXJlIG5vdGVkLjwvZGl2PgorCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+PCEtLWZvb3RlciBpbmZvIGVuZC0tPgoreyUgZW5kYmxvY2sgJX0KKworeyUgYmxvY2sgcmVsYmFyMSAlfXslIGVuZGJsb2NrICV9Cit7JSBibG9jayByZWxiYXIyICV9eyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9mb290ZXItd2l0aC1hbmFseXRpY3MuaHRtbC5pbiBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9mb290ZXItd2l0aC1hbmFseXRpY3MuaHRtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE0YTlkCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci13aXRoLWFuYWx5dGljcy5odG1sLmluCkBAIC0wLDAgKzEsMzIgQEAKKzwhLS0gc3RhcnQgZm9vdGVyIHBhcnQgLS0+Cis8IS0tQkVHSU4gR0VORVJBVEVfVFJFRVZJRVctLT4KKzxkaXYgaWQ9Im5hdi1wYXRoIiBjbGFzcz0ibmF2cGF0aCI+PCEtLSBpZCBpcyBuZWVkZWQgZm9yIHRyZWV2aWV3IGZ1bmN0aW9uISAtLT4KKyAgPHVsPgorICAgICRuYXZwYXRoCisgICAgPGxpIGNsYXNzPSJmb290ZXIiPiRnZW5lcmF0ZWRieQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+CisgICAgPGltZyBjbGFzcz0iZm9vdGVyIiBzcmM9IiRyZWxwYXRoJGRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iLz48L2E+ICRkb3h5Z2VudmVyc2lvbiA8L2xpPgorICA8L3VsPgorPC9kaXY+Cis8IS0tRU5EIEdFTkVSQVRFX1RSRUVWSUVXLS0+Cis8IS0tQkVHSU4gIUdFTkVSQVRFX1RSRUVWSUVXLS0+Cis8aHIgY2xhc3M9ImZvb3RlciIvPgorPGFkZHJlc3MgY2xhc3M9ImZvb3RlciI+PHNtYWxsPgorJGdlbmVyYXRlZGJ5ICYjMTYwOzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+Cis8aW1nIGNsYXNzPSJmb290ZXIiIHNyYz0iJHJlbHBhdGgkZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIvPgorPC9hPiAkZG94eWdlbnZlcnNpb24KKzwvc21hbGw+PC9hZGRyZXNzPgorPCEtLUVORCAhR0VORVJBVEVfVFJFRVZJRVctLT4KKworPHNjcmlwdD4KKyAgKGZ1bmN0aW9uKGkscyxvLGcscixhLG0pe2lbJ0dvb2dsZUFuYWx5dGljc09iamVjdCddPXI7aVtyXT1pW3JdfHxmdW5jdGlvbigpeworICAoaVtyXS5xPWlbcl0ucXx8W10pLnB1c2goYXJndW1lbnRzKX0saVtyXS5sPTEqbmV3IERhdGUoKTthPXMuY3JlYXRlRWxlbWVudChvKSwKKyAgbT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKG8pWzBdO2EuYXN5bmM9MTthLnNyYz1nO20ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxtKQorICB9KSh3aW5kb3csZG9jdW1lbnQsJ3NjcmlwdCcsJy8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2FuYWx5dGljcy5qcycsJ2dhJyk7CisKKyAgZ2EoJ2NyZWF0ZScsICdAR09PR0xFX0FOQUxZVElDU0AnLCAnYXV0bycpOworICBnYSgnc2VuZCcsICdwYWdldmlldycpOworPC9zY3JpcHQ+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9mb290ZXIuaHRtbCBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9mb290ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2ZjMzI3Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0gc3RhcnQgZm9vdGVyIHBhcnQgLS0+Cis8IS0tQkVHSU4gR0VORVJBVEVfVFJFRVZJRVctLT4KKzxkaXYgaWQ9Im5hdi1wYXRoIiBjbGFzcz0ibmF2cGF0aCI+PCEtLSBpZCBpcyBuZWVkZWQgZm9yIHRyZWV2aWV3IGZ1bmN0aW9uISAtLT4KKyAgPHVsPgorICAgICRuYXZwYXRoCisgICAgPGxpIGNsYXNzPSJmb290ZXIiPiRnZW5lcmF0ZWRieQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+CisgICAgPGltZyBjbGFzcz0iZm9vdGVyIiBzcmM9IiRyZWxwYXRoJGRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iLz48L2E+ICRkb3h5Z2VudmVyc2lvbiA8L2xpPgorICA8L3VsPgorPC9kaXY+Cis8IS0tRU5EIEdFTkVSQVRFX1RSRUVWSUVXLS0+Cis8IS0tQkVHSU4gIUdFTkVSQVRFX1RSRUVWSUVXLS0+Cis8aHIgY2xhc3M9ImZvb3RlciIvPgorPGFkZHJlc3MgY2xhc3M9ImZvb3RlciI+PHNtYWxsPgorJGdlbmVyYXRlZGJ5ICYjMTYwOzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+Cis8aW1nIGNsYXNzPSJmb290ZXIiIHNyYz0iJHJlbHBhdGgkZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIvPgorPC9hPiAkZG94eWdlbnZlcnNpb24KKzwvc21hbGw+PC9hZGRyZXNzPgorPCEtLUVORCAhR0VORVJBVEVfVFJFRVZJRVctLT4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorPC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfaGVhZGVyLmh0bWwgYi9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiMjkzMgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9oZWFkZXIuaHRtbApAQCAtMCwwICsxLDQxIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC94aHRtbDtjaGFyc2V0PVVURi04Ii8+Cis8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTkiLz4KKzwhLS1CRUdJTiBQUk9KRUNUX05BTUUtLT48dGl0bGU+JHByb2plY3RuYW1lOiAkdGl0bGU8L3RpdGxlPjwhLS1FTkQgUFJPSkVDVF9OQU1FLS0+Cis8IS0tQkVHSU4gIVBST0pFQ1RfTkFNRS0tPjx0aXRsZT4kdGl0bGU8L3RpdGxlPjwhLS1FTkQgIVBST0pFQ1RfTkFNRS0tPgorPGxpbmsgaHJlZj0iJHJlbHBhdGgkdGFicy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRyZWxwYXRoJGpxdWVyeS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIkcmVscGF0aCRkeW5zZWN0aW9ucy5qcyI+PC9zY3JpcHQ+CiskdHJlZXZpZXcKKyRzZWFyY2gKKyRtYXRoamF4Cis8bGluayBocmVmPSIkcmVscGF0aCRkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPgorPGxpbmsgaHJlZj0iJHJlbHBhdGgkbmFtZWRfZGF0YV9kb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKzxsaW5rIGhyZWY9IiRyZWxwYXRoJGZhdmljb24uaWNvIiByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL2ljbyIgLz4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBpZD0idG9wIj48IS0tIGRvIG5vdCByZW1vdmUgdGhpcyBkaXYsIGl0IGlzIGNsb3NlZCBieSBkb3h5Z2VuISAtLT4KKworPCEtLUJFR0lOIFRJVExFQVJFQS0tPgorPCEtLWhlYWRlcmNvbnRhaW5lci0tPgorPGRpdiBpZD0iaGVhZGVyX2NvbnRhaW5lciI+CisKKyAgICA8IS0taGVhZGVyLS0+CisgICAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICAgICAgIDxkaXYgY2xhc3M9InRocmVlIGNvbHVtbnMiPgorICAgICAgICAgICAgICA8ZGl2IGlkPSJsb2dvIj4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL25hbWVkLWRhdGEubmV0IiB0aXRsZT0iQSBGdXR1cmUgSW50ZXJuZXQgQXJjaGl0ZWN0dXJlIj48aW1nIHNyYz0iaHR0cDovL25hbWVkLWRhdGEubmV0L3dwLWNvbnRlbnQvdXBsb2Fkcy9jcm9wcGVkLTIwMTMwNzIyX0xvZ28yLnBuZyIgYWx0PSIiIC8+PC9hPgorICAgICAgICAgICAgICA8L2Rpdj48IS0tbG9nbyBlbmQtLT4KKyAgICAgICAgIDwvZGl2PgorCisgICAgICAgICA8IS0tdG9wIG1lbnUtLT4KKyAgICAgICAgIDxkaXYgY2xhc3M9Im5pbmUgY29sdW1ucyIgaWQ9Im1lbnVfY29udGFpbmVyIiA+CisgICAgICAgICAgIDxoMT48YSBocmVmPSJodHRwOi8vbmFtZWQtZGF0YS5uZXQvZG9jL05GRC8kcHJvamVjdG51bWJlci8iPiRwcm9qZWN0bmFtZSAkcHJvamVjdG51bWJlciBkb2N1bWVudGF0aW9uPC9hPjwvaDE+CisgICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PjwhLS1oZWFkZXIgY29udGFpbmVyIGVuZC0tPgorPCEtLUVORCBUSVRMRUFSRUEtLT4KKworPCEtLSBlbmQgaGVhZGVyIHBhcnQgLS0+CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXItdG9wLnBuZyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhci10b3AucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2FmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXItdG9wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXNlLmNzcyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhc2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGQxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXNlLmNzcwpAQCAtMCwwICsxLDcxIEBACisqIHsKKyAgbWFyZ2luOiAwcHg7CisgIHBhZGRpbmc6IDBweDsKK30KKworaHRtbCB7IGZvbnQtc2l6ZTogNjIuNSU7IH0KKworYm9keSB7CisgIGZvbnQtZmFtaWx5OiAiVmVyZGFuYSIsIEFyaWFsLCBzYW5zLXNlcmlmOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVjOworICBjb2xvcjogIzc3NzsKKyAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICNmZDc4MDA7Cit9CisKK2JvZHkgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOyBjb2xvcjogIzIyMjIyMjsgcG9zaXRpb246IHJlbGF0aXZlOyAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsgfQorCisuY2xlYXJlciB7CisgIGNsZWFyOiBib3RoOworfQorCisubGVmdCB7CisgIGZsb2F0OiBsZWZ0OworfQorCisucmlnaHQgeworICBmbG9hdDogcmlnaHQ7Cit9CisKKy5saW5lLWJsb2NrIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tdG9wOiAxZW07CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisubGluZS1ibG9jayAubGluZS1ibG9jayB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIG1hcmdpbi1sZWZ0OiAxLjVlbTsKK30KKworaDEsIGgyLCBoMywgaDQgeworICBmb250LWZhbWlseTogIkdlb3JnaWEiLCAiVGltZXMgTmV3IFJvbWFuIiwgc2VyaWY7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIGNvbG9yOiAjMzQ2NWE0OworICBtYXJnaW4tYm90dG9tOiAuOGVtOworfQorCitoMSB7CisgIGNvbG9yOiAjMjA0YTg3OworfQorCitoMiB7CisgIHBhZGRpbmctYm90dG9tOiAuNWVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzM0NjVhNDsKK30KKworYS5oZWFkZXJsaW5rIHsKKyAgdmlzaWJpbGl0eTogaGlkZGVuOworICBjb2xvcjogI2RkZGRkZDsKKyAgcGFkZGluZy1sZWZ0OiAuM2VtOworfQorCitoMTpob3ZlciA+IGEuaGVhZGVybGluaywKK2gyOmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDM6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoNDpob3ZlciA+IGEuaGVhZGVybGluaywKK2g1OmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDY6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitkdDpob3ZlciA+IGEuaGVhZGVybGluayB7CisgIHZpc2liaWxpdHk6IHZpc2libGU7Cit9CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXNlLmNzc190IGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvYmFzZS5jc3NfdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQzOTczCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvYmFzZS5jc3NfdApAQCAtMCwwICsxLDQ1OSBAQAorKiB7CisgIG1hcmdpbjogMHB4OworICBwYWRkaW5nOiAwcHg7Cit9CisKK2h0bWwgeyBmb250LXNpemU6IDYyLjUlOyB9CisKK2JvZHkgeworICBmb250LWZhbWlseToge3sgdGhlbWVfYm9keWZvbnQgfX07CisgIGJhY2tncm91bmQtY29sb3I6IHt7IHRoZW1lX2JnY29sb3IgfX07CisgIGNvbG9yOiAjNzc3OworICBib3JkZXItdG9wOiA0cHggc29saWQgI2ZkNzgwMDsKK30KKworYm9keSB7IGJhY2tncm91bmQ6IHdoaXRlOyBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgIkhlbHZldGljYSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE7IGNvbG9yOiAjMjIyMjIyOyBwb3NpdGlvbjogcmVsYXRpdmU7IC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOyB9CisKKy8qIFBhZ2UgbGF5b3V0ICovCisKK2Rpdi5oZWFkZXIsIGRpdi5jb250ZW50LCBkaXYuZm9vdGVyIHsKKyAgd2lkdGg6IDkwJTsKKyAgbWFyZ2luLWxlZnQ6IGF1dG87CisgIG1hcmdpbi1yaWdodDogYXV0bzsKK30KKworZGl2LmhlYWRlci13cmFwcGVyIHsKKyAgYmFja2dyb3VuZDoge3sgdGhlbWVfaGVhZGVyYmcgfX07CisgIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjMmUzNDM2OworfQorCisKKy8qIERlZmF1bHQgYm9keSBzdHlsZXMgKi8KK2EgeworICBjb2xvcjoge3sgdGhlbWVfbGlua2NvbG9yIH19OworfQorCitkaXYuYm9keXdyYXBwZXIgYSwgZGl2LmZvb3RlciBhIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuY2xlYXJlciB7CisgIGNsZWFyOiBib3RoOworfQorCisubGVmdCB7CisgIGZsb2F0OiBsZWZ0OworfQorCisucmlnaHQgeworICBmbG9hdDogcmlnaHQ7Cit9CisKKy5saW5lLWJsb2NrIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tdG9wOiAxZW07CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisubGluZS1ibG9jayAubGluZS1ibG9jayB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIG1hcmdpbi1sZWZ0OiAxLjVlbTsKK30KKworaDEsIGgyLCBoMywgaDQgeworICBmb250LWZhbWlseToge3sgdGhlbWVfaGVhZGVyZm9udCB9fTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgY29sb3I6IHt7IHRoZW1lX2hlYWRlcmNvbG9yMiB9fTsKKyAgbWFyZ2luLWJvdHRvbTogLjhlbTsKK30KKworaDEgeworICBjb2xvcjoge3sgdGhlbWVfaGVhZGVyY29sb3IxIH19OworfQorCitoMiB7CisgIHBhZGRpbmctYm90dG9tOiAuNWVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQge3sgdGhlbWVfaGVhZGVyY29sb3IyIH19OworfQorCithLmhlYWRlcmxpbmsgeworICB2aXNpYmlsaXR5OiBoaWRkZW47CisgIGNvbG9yOiAjZGRkZGRkOworICBwYWRkaW5nLWxlZnQ6IC4zZW07Cit9CisKK2gxOmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDI6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoMzpob3ZlciA+IGEuaGVhZGVybGluaywKK2g0OmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDU6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoNjpob3ZlciA+IGEuaGVhZGVybGluaywKK2R0OmhvdmVyID4gYS5oZWFkZXJsaW5rIHsKKyAgdmlzaWJpbGl0eTogdmlzaWJsZTsKK30KKworaW1nIHsKKyAgYm9yZGVyOiAwOworfQorCitkaXYuYWRtb25pdGlvbiB7CisgIG1hcmdpbi10b3A6IDEwcHg7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgIHBhZGRpbmc6IDJweCA3cHggMXB4IDdweDsKKyAgYm9yZGVyLWxlZnQ6IDAuMmVtIHNvbGlkIGJsYWNrOworfQorCitwLmFkbW9uaXRpb24tdGl0bGUgeworICBtYXJnaW46IDBweCAxMHB4IDVweCAwcHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitkdDp0YXJnZXQsIC5oaWdobGlnaHRlZCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYmU1NGU7Cit9CisKKy8qIEhlYWRlciAqLworCitkaXYuaGVhZGVyIHsKKyAgcGFkZGluZy10b3A6IDEwcHg7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworfQorCitkaXYuaGVhZGVyIC5oZWFkZXJ0aXRsZSB7CisgIGZvbnQtZmFtaWx5OiB7eyB0aGVtZV9oZWFkZXJmb250IH19OworICBmb250LXdlaWdodDogbm9ybWFsOworICBmb250LXNpemU6IDE4MCU7CisgIGxldHRlci1zcGFjaW5nOiAuMDhlbTsKKyAgbWFyZ2luLWJvdHRvbTogLjhlbTsKK30KKworZGl2LmhlYWRlciAuaGVhZGVydGl0bGUgYSB7CisgIGNvbG9yOiB3aGl0ZTsKK30KKworZGl2LmhlYWRlciBkaXYucmVsIHsKKyAgbWFyZ2luLXRvcDogMWVtOworfQorCitkaXYuaGVhZGVyIGRpdi5yZWwgYSB7CisgIGNvbG9yOiB7eyB0aGVtZV9oZWFkZXJsaW5rY29sb3IgfX07CisgIGxldHRlci1zcGFjaW5nOiAuMWVtOworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworfQorCitwLmxvZ28geworICAgIGZsb2F0OiByaWdodDsKK30KKworaW1nLmxvZ28geworICAgIGJvcmRlcjogMDsKK30KKworCisvKiBDb250ZW50ICovCitkaXYuY29udGVudC13cmFwcGVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisgIHBhZGRpbmctdG9wOiAyMHB4OworICBwYWRkaW5nLWJvdHRvbTogMjBweDsKK30KKworZGl2LmRvY3VtZW50IHsKKyAgd2lkdGg6IDcwJTsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKK2Rpdi5ib2R5IHsKKyAgcGFkZGluZy1yaWdodDogMmVtOworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCitkaXYuZG9jdW1lbnQgaDEgeworICBsaW5lLWhlaWdodDogMTIwJTsKK30KKworZGl2LmRvY3VtZW50IHVsIHsKKyAgbWFyZ2luLWxlZnQ6IDEuNWVtOworICBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKK30KKworZGl2LmRvY3VtZW50IGRkIHsKKyAgbWFyZ2luLWxlZnQ6IDEuMmVtOworICBtYXJnaW4tdG9wOiAuNGVtOworICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKK2Rpdi5kb2N1bWVudCAuc2VjdGlvbiB7CisgIG1hcmdpbi10b3A6IDEuN2VtOworfQorZGl2LmRvY3VtZW50IC5zZWN0aW9uOmZpcnN0LWNoaWxkIHsKKyAgbWFyZ2luLXRvcDogMHB4OworfQorCitkaXYuZG9jdW1lbnQgZGl2LmhpZ2hsaWdodCB7CisgIHBhZGRpbmc6IDNweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlYzsKKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICNkZGRkZGQ7CisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZGRkZGRkOworICBtYXJnaW4tYm90dG9tOiAuOGVtOworfQorCitkaXYuZG9jdW1lbnQgaDIgeworICBtYXJnaW4tdG9wOiAuN2VtOworfQorCitkaXYuZG9jdW1lbnQgcCB7CisgIG1hcmdpbi1ib3R0b206IC41ZW07Cit9CisKK2Rpdi5kb2N1bWVudCBsaS50b2N0cmVlLWwxIHsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCitkaXYuZG9jdW1lbnQgLmRlc2NuYW1lIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2Rpdi5kb2N1bWVudCAuZG9jdXRpbHMubGl0ZXJhbCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWM7CisgIHBhZGRpbmc6IDFweDsKK30KKworZGl2LmRvY3VtZW50IC5kb2N1dGlscy54cmVmLmxpdGVyYWwgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgcGFkZGluZzogMHB4OworfQorCitkaXYuZG9jdW1lbnQgb2wgeworICBtYXJnaW46IDEuNWVtOworfQorCisKKy8qIFNpZGViYXIgKi8KKworZGl2LnNpZGViYXIgeworICB3aWR0aDogMjAlOworICBmbG9hdDogcmlnaHQ7CisgIGZvbnQtc2l6ZTogLjllbTsKK30KKworZGl2LnNpZGViYXIgYSwgZGl2LmhlYWRlciBhIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCitkaXYuc2lkZWJhciBhOmhvdmVyLCBkaXYuaGVhZGVyIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2Rpdi5zaWRlYmFyIGgzIHsKKyAgY29sb3I6ICMyZTM0MzY7CisgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgIGZvbnQtc2l6ZTogMTMwJTsKKyAgbGV0dGVyLXNwYWNpbmc6IC4xZW07Cit9CisKK2Rpdi5zaWRlYmFyIHVsIHsKKyAgbGlzdC1zdHlsZS10eXBlOiBub25lOworfQorCitkaXYuc2lkZWJhciBsaS50b2N0cmVlLWwxIGEgeworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZzogMXB4OworICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVjOworICBtYXJnaW4tYm90dG9tOiAuNGVtOworICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgY29sb3I6ICMyZTM0MzY7Cit9CisKK2Rpdi5zaWRlYmFyIGxpLnRvY3RyZWUtbDIgYSB7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICBib3JkZXI6IG5vbmU7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkOworfQorCitkaXYuc2lkZWJhciBsaS50b2N0cmVlLWwzIGEgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgYm9yZGVyOiBub25lOworICBtYXJnaW4tbGVmdDogMmVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZGRkZDsKK30KKworZGl2LnNpZGViYXIgbGkudG9jdHJlZS1sMjpsYXN0LWNoaWxkIGEgeworICBib3JkZXItYm90dG9tOiBub25lOworfQorCitkaXYuc2lkZWJhciBsaS50b2N0cmVlLWwxLmN1cnJlbnQgYSB7CisgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHt7IHRoZW1lX2hlYWRlcmxpbmtjb2xvciB9fTsKK30KKworZGl2LnNpZGViYXIgbGkudG9jdHJlZS1sMS5jdXJyZW50IGxpLnRvY3RyZWUtbDIgYSB7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKworZGl2LnNpZGViYXIgaW5wdXRbdHlwZT0idGV4dCJdIHsKKyAgd2lkdGg6IDE3MHB4OworfQorCitkaXYuc2lkZWJhciBpbnB1dFt0eXBlPSJzdWJtaXQiXSB7CisgIHdpZHRoOiAzMHB4OworfQorCisKKy8qIEZvb3RlciAqLworCitkaXYuZm9vdGVyLXdyYXBwZXIgeworICBiYWNrZ3JvdW5kOiB7eyB0aGVtZV9mb290ZXJiZyB9fTsKKyAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICNiYWJkYjY7CisgIHBhZGRpbmctdG9wOiAxMHB4OworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKKyAgbWluLWhlaWdodDogODBweDsKK30KKworZGl2LmZvb3RlciwgZGl2LmZvb3RlciBhIHsKKyAgY29sb3I6ICM4ODhhODU7Cit9CisKK2Rpdi5mb290ZXIgLnJpZ2h0IHsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK2Rpdi5mb290ZXIgLmxlZnQgeworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworfQorCisKKy8qIFN0eWxlcyBjb3BpZWQgZnJvbSBiYXNpYyB0aGVtZSAqLworCitpbWcuYWxpZ24tbGVmdCwgLmZpZ3VyZS5hbGlnbi1sZWZ0LCBvYmplY3QuYWxpZ24tbGVmdCB7CisgICAgY2xlYXI6IGxlZnQ7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luLXJpZ2h0OiAxZW07Cit9CisKK2ltZy5hbGlnbi1yaWdodCwgLmZpZ3VyZS5hbGlnbi1yaWdodCwgb2JqZWN0LmFsaWduLXJpZ2h0IHsKKyAgICBjbGVhcjogcmlnaHQ7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIG1hcmdpbi1sZWZ0OiAxZW07Cit9CisKK2ltZy5hbGlnbi1jZW50ZXIsIC5maWd1cmUuYWxpZ24tY2VudGVyLCBvYmplY3QuYWxpZ24tY2VudGVyIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiBhdXRvOworICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9CisKKy5hbGlnbi1sZWZ0IHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuYWxpZ24tY2VudGVyIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy5hbGlnbi1yaWdodCB7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy8qIC0tIHNlYXJjaCBwYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3VsLnNlYXJjaCB7CisgICAgbWFyZ2luOiAxMHB4IDAgMCAyMHB4OworICAgIHBhZGRpbmc6IDA7Cit9CisKK3VsLnNlYXJjaCBsaSB7CisgICAgcGFkZGluZzogNXB4IDAgNXB4IDIwcHg7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGZpbGUucG5nKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgN3B4OworfQorCit1bC5zZWFyY2ggbGkgYSB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3VsLnNlYXJjaCBsaSBkaXYuY29udGV4dCB7CisgICAgY29sb3I6ICM4ODg7CisgICAgbWFyZ2luOiAycHggMCAwIDMwcHg7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKwordWwua2V5d29yZG1hdGNoZXMgbGkuZ29vZG1hdGNoIGEgeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisvKiAtLSBpbmRleCBwYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0YWJsZS5jb250ZW50c3RhYmxlIHsKKyAgICB3aWR0aDogOTAlOworfQorCit0YWJsZS5jb250ZW50c3RhYmxlIHAuYmlnbGluayB7CisgICAgbGluZS1oZWlnaHQ6IDE1MCU7Cit9CisKK2EuYmlnbGluayB7CisgICAgZm9udC1zaXplOiAxLjNlbTsKK30KKworc3Bhbi5saW5rZGVzY3IgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBwYWRkaW5nLXRvcDogNXB4OworICAgIGZvbnQtc2l6ZTogOTAlOworfQorCisvKiAtLSBnZW5lcmFsIGluZGV4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0YWJsZS5pbmRleHRhYmxlIHRkIHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK3RhYmxlLmluZGV4dGFibGUgZGwsIHRhYmxlLmluZGV4dGFibGUgZGQgeworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKK30KKwordGFibGUuaW5kZXh0YWJsZSB0ci5wY2FwIHsKKyAgICBoZWlnaHQ6IDEwcHg7Cit9CisKK3RhYmxlLmluZGV4dGFibGUgdHIuY2FwIHsKKyAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7Cit9CisKK2ltZy50b2dnbGVyIHsKKyAgICBtYXJnaW4tcmlnaHQ6IDNweDsKKyAgICBtYXJnaW4tdG9wOiAzcHg7CisgICAgY3Vyc29yOiBwb2ludGVyOworfQorCisvKiAtLSB2aWV3Y29kZSBleHRlbnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisudmlld2NvZGUtbGluayB7CisgICAgZmxvYXQ6IHJpZ2h0OworfQorCisudmlld2NvZGUtYmFjayB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIGZvbnQtZmFtaWx5Ojoge3sgdGhlbWVfYm9keWZvbnQgfX07Cit9CisKK2Rpdi52aWV3Y29kZS1ibG9jazp0YXJnZXQgeworICAgIG1hcmdpbjogLTFweCAtM3B4OworICAgIHBhZGRpbmc6IDAgM3B4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGRlYmY7CisgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhYzk7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhYzk7Cit9CisKK3RkLmxpbmVub3MgcHJlIHsKKyAgICBwYWRkaW5nOiA1cHggMHB4OworICAgIGJvcmRlcjogMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICBjb2xvcjogI2FhYTsKKyAgICBtYXJnaW4tdG9wOiAtMTBwdDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iY19zLnBuZyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2JjX3MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYmY4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iY19zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9kZWZhdWx0LmNzc190IGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvZGVmYXVsdC5jc3NfdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgyNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvZGVmYXVsdC5jc3NfdApAQCAtMCwwICsxLDE0IEBACitAaW1wb3J0IHVybCgiYWdvZ28uY3NzIik7CisKK3ByZSB7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOworICAgIGNvbG9yOiAjMjIyOworICAgIGxpbmUtaGVpZ2h0OiAxLjJlbTsKKyAgICBib3JkZXI6IDJweCBzb2xpZCAjQzZDOUNCOworICAgIGZvbnQtc2l6ZTogMS4xZW07CisgICAgLyogbWFyZ2luOiAxLjVlbSAwIDEuNWVtIDA7ICovCisgICAgbWFyZ2luOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKK30KZGlmZiAtLWdpdCBhL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2RveHlnZW4uY3NzIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvZG94eWdlbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjNzk2ZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2RveHlnZW4uY3NzCkBAIC0wLDAgKzEsMTE1NyBAQAorLyogVGhlIHN0YW5kYXJkIENTUyBmb3IgZG94eWdlbiAqLworCitib2R5LCB0YWJsZSwgZGl2LCBwLCBkbCB7CisJZm9udC1mYW1pbHk6IEx1Y2lkYSBHcmFuZGUsIFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxM3B4OworCWxpbmUtaGVpZ2h0OiAxLjM7Cit9CisKKy8qIEBncm91cCBIZWFkaW5nIExldmVscyAqLworCitoMSB7CisJZm9udC1zaXplOiAxNTAlOworfQorCisudGl0bGUgeworCWZvbnQtc2l6ZTogMTUwJTsKKwlmb250LXdlaWdodDogYm9sZDsKKwltYXJnaW46IDEwcHggMnB4OworfQorCitoMiB7CisJZm9udC1zaXplOiAxMjAlOworfQorCitoMyB7CisJZm9udC1zaXplOiAxMDAlOworfQorCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKKwktd2Via2l0LXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCS1tb3otdHJhbnNpdGlvbjogdGV4dC1zaGFkb3cgMC41cyBsaW5lYXI7CisJLW1zLXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCS1vLXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCW1hcmdpbi1yaWdodDogMTVweDsKK30KKworaDEuZ2xvdywgaDIuZ2xvdywgaDMuZ2xvdywgaDQuZ2xvdywgaDUuZ2xvdywgaDYuZ2xvdyB7CisJdGV4dC1zaGFkb3c6IDAgMCAxNXB4IGN5YW47Cit9CisKK2R0IHsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworZGl2Lm11bHRpY29sIHsKKwktbW96LWNvbHVtbi1nYXA6IDFlbTsKKwktd2Via2l0LWNvbHVtbi1nYXA6IDFlbTsKKwktbW96LWNvbHVtbi1jb3VudDogMzsKKwktd2Via2l0LWNvbHVtbi1jb3VudDogMzsKK30KKworcC5zdGFydGxpLCBwLnN0YXJ0ZGQsIHAuc3RhcnR0ZCB7CisJbWFyZ2luLXRvcDogMnB4OworfQorCitwLmVuZGxpIHsKKwltYXJnaW4tYm90dG9tOiAwcHg7Cit9CisKK3AuZW5kZGQgeworCW1hcmdpbi1ib3R0b206IDRweDsKK30KKworcC5lbmR0ZCB7CisJbWFyZ2luLWJvdHRvbTogMnB4OworfQorCisvKiBAZW5kICovCisKK2NhcHRpb24geworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitzcGFuLmxlZ2VuZCB7CisgICAgICAgIGZvbnQtc2l6ZTogNzAlOworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK2gzLnZlcnNpb24geworICAgICAgICBmb250LXNpemU6IDkwJTsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCitkaXYucWluZGV4LCBkaXYubmF2dGFieworCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7CisJYm9yZGVyOiAxcHggc29saWQgI0I1QjVCNTsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK2Rpdi5xaW5kZXgsIGRpdi5uYXZwYXRoIHsKKwl3aWR0aDogMTAwJTsKKwlsaW5lLWhlaWdodDogMTQwJTsKK30KKworZGl2Lm5hdnRhYiB7CisJbWFyZ2luLXJpZ2h0OiAxNXB4OworfQorCisvKiBAZ3JvdXAgTGluayBTdHlsaW5nICovCisKK2EgeworCWNvbG9yOiAjNTg1ODU4OworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisvKi5jb250ZW50cyBhOnZpc2l0ZWQgeworCWNvbG9yOiAjNjg2ODY4OworfSovCisKK2E6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCithLnFpbmRleCB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2EucWluZGV4SEwgeworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNCMEIwQjA7CisJY29sb3I6ICNmZmZmZmY7CisJYm9yZGVyOiAxcHggZG91YmxlICM5RjlGOUY7Cit9CisKKy5jb250ZW50cyBhLnFpbmRleEhMOnZpc2l0ZWQgeworICAgICAgICBjb2xvcjogI2ZmZmZmZjsKK30KKworYS5lbCB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2EuZWxSZWYgeworfQorCithLmNvZGUsIGEuY29kZTp2aXNpdGVkIHsKKwljb2xvcjogIzQ2NjVBMjsKK30KKworYS5jb2RlUmVmLCBhLmNvZGVSZWY6dmlzaXRlZCB7CisJY29sb3I6ICM0NjY1QTI7Cit9CisKKy8qIEBlbmQgKi8KKworZGwuZWwgeworCW1hcmdpbi1sZWZ0OiAtMWNtOworfQorCitwcmUuZnJhZ21lbnQgeworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQzRDRkU1OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkJGQ0ZEOworICAgICAgICBwYWRkaW5nOiA0cHggNnB4OworICAgICAgICBtYXJnaW46IDRweCA4cHggNHB4IDJweDsKKyAgICAgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgZm9udC1zaXplOiAgOXB0OworICAgICAgICBsaW5lLWhlaWdodDogMTI1JTsKKyAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgZml4ZWQ7CisgICAgICAgIGZvbnQtc2l6ZTogMTA1JTsKK30KKworZGl2LmZyYWdtZW50IHsKKyAgICAgICAgcGFkZGluZzogNHB4OworICAgICAgICBtYXJnaW46IDRweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkNGQ0ZDOworCWJvcmRlcjogMXB4IHNvbGlkICNEMEQwRDA7Cit9CisKK2Rpdi5saW5lIHsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlLCBmaXhlZDsKKyAgICAgICAgZm9udC1zaXplOiAxM3B4OworCW1pbi1oZWlnaHQ6IDEzcHg7CisJbGluZS1oZWlnaHQ6IDEuMDsKKwl0ZXh0LXdyYXA6IHVucmVzdHJpY3RlZDsKKwl3aGl0ZS1zcGFjZTogLW1vei1wcmUtd3JhcDsgLyogTW96ICovCisJd2hpdGUtc3BhY2U6IC1wcmUtd3JhcDsgICAgIC8qIE9wZXJhIDQtNiAqLworCXdoaXRlLXNwYWNlOiAtby1wcmUtd3JhcDsgICAvKiBPcGVyYSA3ICovCisJd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICAgIC8qIENTUzMgICovCisJd29yZC13cmFwOiBicmVhay13b3JkOyAgICAgIC8qIElFIDUuNSsgKi8KKwl0ZXh0LWluZGVudDogLTUzcHg7CisJcGFkZGluZy1sZWZ0OiA1M3B4OworCXBhZGRpbmctYm90dG9tOiAwcHg7CisJbWFyZ2luOiAwcHg7CisJLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yLCBib3gtc2hhZG93OworCS13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czsKKwktbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLW1vei10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCS1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yLCBib3gtc2hhZG93OworCS1tcy10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCS1vLXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLW8tdHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czsKKwl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yLCBib3gtc2hhZG93OworCXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7Cit9CisKK2Rpdi5saW5lLmdsb3cgeworCWJhY2tncm91bmQtY29sb3I6IGN5YW47CisJYm94LXNoYWRvdzogMCAwIDEwcHggY3lhbjsKK30KKworCitzcGFuLmxpbmVubyB7CisJcGFkZGluZy1yaWdodDogNHB4OworCXRleHQtYWxpZ246IHJpZ2h0OworCWJvcmRlci1yaWdodDogMnB4IHNvbGlkICMwRjA7CisJYmFja2dyb3VuZC1jb2xvcjogI0U4RThFODsKKyAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKK30KK3NwYW4ubGluZW5vIGEgeworCWJhY2tncm91bmQtY29sb3I6ICNEOEQ4RDg7Cit9CisKK3NwYW4ubGluZW5vIGE6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNDOEM4Qzg7Cit9CisKK2Rpdi5haCB7CisJYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJY29sb3I6ICNmZmZmZmY7CisJbWFyZ2luLWJvdHRvbTogM3B4OworCW1hcmdpbi10b3A6IDNweDsKKwlwYWRkaW5nOiAwLjJlbTsKKwlib3JkZXI6IHNvbGlkIHRoaW4gIzMzMzsKKwlib3JkZXItcmFkaXVzOiAwLjVlbTsKKwktd2Via2l0LWJvcmRlci1yYWRpdXM6IC41ZW07CisJLW1vei1ib3JkZXItcmFkaXVzOiAuNWVtOworCWJveC1zaGFkb3c6IDJweCAycHggM3B4ICM5OTk7CisJLXdlYmtpdC1ib3gtc2hhZG93OiAycHggMnB4IDNweCAjOTk5OworCS1tb3otYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjE1KSAycHggMnB4IDJweDsKKwliYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNlZWUpLCB0bygjMDAwKSxjb2xvci1zdG9wKDAuMywgIzQ0NCkpOworCWJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KGNlbnRlciB0b3AsICNlZWUgMCUsICM0NDQgNDAlLCAjMDAwKTsKK30KKworZGl2Lmdyb3VwSGVhZGVyIHsKKwltYXJnaW4tbGVmdDogMTZweDsKKwltYXJnaW4tdG9wOiAxMnB4OworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitkaXYuZ3JvdXBUZXh0IHsKKwltYXJnaW4tbGVmdDogMTZweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2JvZHkgeworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworCWNvbG9yOiBibGFjazsKKyAgICAgICAgbWFyZ2luOiAwOworfQorCitkaXYuY29udGVudHMgeworCW1hcmdpbi10b3A6IDEwcHg7CisJbWFyZ2luLWxlZnQ6IDEycHg7CisJbWFyZ2luLXJpZ2h0OiA4cHg7Cit9CisKK3RkLmluZGV4a2V5IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJvcmRlcjogMXB4IHNvbGlkICNEMEQwRDA7CisJbWFyZ2luOiAycHggMHB4IDJweCAwOworCXBhZGRpbmc6IDJweCAxMHB4OworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0ZC5pbmRleHZhbHVlIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOworCWJvcmRlcjogMXB4IHNvbGlkICNEMEQwRDA7CisJcGFkZGluZzogMnB4IDEwcHg7CisJbWFyZ2luOiAycHggMHB4OworfQorCit0ci5tZW1saXN0IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjFGMUYxOworfQorCitwLmZvcm11bGFEc3AgeworCXRleHQtYWxpZ246IGNlbnRlcjsKK30KKworaW1nLmZvcm11bGFEc3AgeworCit9CisKK2ltZy5mb3JtdWxhSW5sIHsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCitkaXYuY2VudGVyIHsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgIG1hcmdpbi10b3A6IDBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMHB4OworICAgICAgICBwYWRkaW5nOiAwcHg7Cit9CisKK2Rpdi5jZW50ZXIgaW1nIHsKKwlib3JkZXI6IDBweDsKK30KKworYWRkcmVzcy5mb290ZXIgeworCXRleHQtYWxpZ246IHJpZ2h0OworCXBhZGRpbmctcmlnaHQ6IDEycHg7Cit9CisKK2ltZy5mb290ZXIgeworCWJvcmRlcjogMHB4OworCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy8qIEBncm91cCBDb2RlIENvbG9yaXphdGlvbiAqLworCitzcGFuLmtleXdvcmQgeworCWNvbG9yOiAjMDA4MDAwCit9CisKK3NwYW4ua2V5d29yZHR5cGUgeworCWNvbG9yOiAjNjA0MDIwCit9CisKK3NwYW4ua2V5d29yZGZsb3cgeworCWNvbG9yOiAjZTA4MDAwCit9CisKK3NwYW4uY29tbWVudCB7CisJY29sb3I6ICM4MDAwMDAKK30KKworc3Bhbi5wcmVwcm9jZXNzb3IgeworCWNvbG9yOiAjODA2MDIwCit9CisKK3NwYW4uc3RyaW5nbGl0ZXJhbCB7CisJY29sb3I6ICMwMDIwODAKK30KKworc3Bhbi5jaGFybGl0ZXJhbCB7CisJY29sb3I6ICMwMDgwODAKK30KKworc3Bhbi52aGRsZGlnaXQgeworCWNvbG9yOiAjZmYwMGZmCit9CisKK3NwYW4udmhkbGNoYXIgeworCWNvbG9yOiAjMDAwMDAwCit9CisKK3NwYW4udmhkbGtleXdvcmQgeworCWNvbG9yOiAjNzAwMDcwCit9CisKK3NwYW4udmhkbGxvZ2ljIHsKKwljb2xvcjogI2ZmMDAwMAorfQorCitibG9ja3F1b3RlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODsKKyAgICAgICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQjBCMEIwOworICAgICAgICBtYXJnaW46IDAgMjRweCAwIDRweDsKKyAgICAgICAgcGFkZGluZzogMCAxMnB4IDAgMTZweDsKK30KKworLyogQGVuZCAqLworCisvKgorLnNlYXJjaCB7CisJY29sb3I6ICMwMDMzOTk7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2Zvcm0uc2VhcmNoIHsKKwltYXJnaW4tYm90dG9tOiAwcHg7CisJbWFyZ2luLXRvcDogMHB4OworfQorCitpbnB1dC5zZWFyY2ggeworCWZvbnQtc2l6ZTogNzUlOworCWNvbG9yOiAjMDAwMDgwOworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJYmFja2dyb3VuZC1jb2xvcjogI2U4ZWVmMjsKK30KKyovCisKK3RkLnRpbnkgeworCWZvbnQtc2l6ZTogNzUlOworfQorCisuZGlydGFiIHsKKwlwYWRkaW5nOiA0cHg7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKwlib3JkZXI6IDFweCBzb2xpZCAjQjVCNUI1OworfQorCit0aC5kaXJ0YWIgeworCWJhY2tncm91bmQ6ICNFRkVGRUY7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2hyIHsKKwloZWlnaHQ6IDBweDsKKwlib3JkZXI6IG5vbmU7CisJYm9yZGVyLXRvcDogMXB4IHNvbGlkICM2RTZFNkU7Cit9CisKK2hyLmZvb3RlciB7CisJaGVpZ2h0OiAxcHg7Cit9CisKKy8qIEBncm91cCBNZW1iZXIgRGVzY3JpcHRpb25zICovCisKK3RhYmxlLm1lbWJlcmRlY2xzIHsKKwlib3JkZXItc3BhY2luZzogMHB4OworCXBhZGRpbmc6IDBweDsKK30KKworLm1lbWJlcmRlY2xzIHRkIHsKKwktd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCS1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgYm94LXNoYWRvdzsKKwktbW96LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7CisJLW1zLXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLW1zLXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7CisJLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgYm94LXNoYWRvdzsKKwktby10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJdHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czsKK30KKworLm1lbWJlcmRlY2xzIHRkLmdsb3cgeworCWJhY2tncm91bmQtY29sb3I6IGN5YW47CisJYm94LXNoYWRvdzogMCAwIDE1cHggY3lhbjsKK30KKworLm1kZXNjTGVmdCwgLm1kZXNjUmlnaHQsCisubWVtSXRlbUxlZnQsIC5tZW1JdGVtUmlnaHQsCisubWVtVGVtcGxJdGVtTGVmdCwgLm1lbVRlbXBsSXRlbVJpZ2h0LCAubWVtVGVtcGxQYXJhbXMgeworCWJhY2tncm91bmQtY29sb3I6ICNGQUZBRkE7CisJYm9yZGVyOiBub25lOworCW1hcmdpbjogNHB4OworCXBhZGRpbmc6IDFweCAwIDAgOHB4OworfQorCisubWRlc2NMZWZ0LCAubWRlc2NSaWdodCB7CisJcGFkZGluZzogMHB4IDhweCA0cHggOHB4OworCWNvbG9yOiAjNTU1OworfQorCisubWVtSXRlbUxlZnQsIC5tZW1JdGVtUmlnaHQsIC5tZW1UZW1wbFBhcmFtcyB7CisJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNEMEQwRDA7Cit9CisKKy5tZW1JdGVtTGVmdCwgLm1lbVRlbXBsSXRlbUxlZnQgeworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisubWVtSXRlbVJpZ2h0IHsKKwl3aWR0aDogMTAwJTsKK30KKworLm1lbVRlbXBsUGFyYW1zIHsKKwljb2xvcjogIzY4Njg2ODsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLyogQGVuZCAqLworCisvKiBAZ3JvdXAgTWVtYmVyIERldGFpbHMgKi8KKworLyogU3R5bGVzIGZvciBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbiAqLworCisubWVtdGVtcGxhdGUgeworCWZvbnQtc2l6ZTogODAlOworCWNvbG9yOiAjNjg2ODY4OworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJbWFyZ2luLWxlZnQ6IDlweDsKK30KKworLm1lbW5hdiB7CisJYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKKwlib3JkZXI6IDFweCBzb2xpZCAjQjVCNUI1OworCXRleHQtYWxpZ246IGNlbnRlcjsKKwltYXJnaW46IDJweDsKKwltYXJnaW4tcmlnaHQ6IDE1cHg7CisJcGFkZGluZzogMnB4OworfQorCisubWVtcGFnZSB7CisJd2lkdGg6IDEwMCU7Cit9CisKKy5tZW1pdGVtIHsKKwlwYWRkaW5nOiAwOworCW1hcmdpbi1ib3R0b206IDEwcHg7CisJbWFyZ2luLXJpZ2h0OiA1cHg7CisgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgLW1vei10cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuNXMgbGluZWFyOworICAgICAgICAtbXMtdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgLW8tdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsKKyAgICAgICAgd2lkdGg6IDEwMCU7Cit9CisKKy5tZW1pdGVtLmdsb3cgeworICAgICAgICAgYm94LXNoYWRvdzogMCAwIDE1cHggY3lhbjsKK30KKworLm1lbW5hbWUgeworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDZweDsKK30KKworLm1lbW5hbWUgdGQgeworCXZlcnRpY2FsLWFsaWduOiBib3R0b207Cit9CisKKy5tZW1wcm90bywgZGwucmVmbGlzdCBkdCB7CisgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjQjlCOUI5OworICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIHBhZGRpbmc6IDZweCAwcHggNnB4IDBweDsKKyAgICAgICAgY29sb3I6ICMzMjMyMzI7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICB0ZXh0LXNoYWRvdzogMHB4IDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOnVybCgnbmF2X2YucG5nJyk7CisgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRThFOEU4OworICAgICAgICAvKiBvcGVyYSBzcGVjaWZpYyBtYXJrdXAgKi8KKyAgICAgICAgYm94LXNoYWRvdzogNXB4IDVweCA1cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICAgICAgICAvKiBmaXJlZm94IHNwZWNpZmljIG1hcmt1cCAqLworICAgICAgICAtbW96LWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xNSkgNXB4IDVweCA1cHg7CisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNHB4OworICAgICAgICAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogNHB4OworICAgICAgICAvKiB3ZWJraXQgc3BlY2lmaWMgbWFya3VwICovCisgICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCA1cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgICAgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OworICAgICAgICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKKworfQorCisubWVtZG9jLCBkbC5yZWZsaXN0IGRkIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI0I5QjlCOTsKKyAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0I5QjlCOTsKKyAgICAgICAgcGFkZGluZzogNnB4IDEwcHggMnB4IDEwcHg7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGQ0ZDRkM7CisgICAgICAgIGJvcmRlci10b3Atd2lkdGg6IDA7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCduYXZfZy5wbmcnKTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgICAgICAgIC8qIG9wZXJhIHNwZWNpZmljIG1hcmt1cCAqLworICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgICAgIGJveC1zaGFkb3c6IDVweCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CisgICAgICAgIC8qIGZpcmVmb3ggc3BlY2lmaWMgbWFya3VwICovCisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7CisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OworICAgICAgICAtbW96LWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xNSkgNXB4IDVweCA1cHg7CisgICAgICAgIC8qIHdlYmtpdCBzcGVjaWZpYyBtYXJrdXAgKi8KKyAgICAgICAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgICAgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsKKyAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiA1cHggNXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTUpOworfQorCitkbC5yZWZsaXN0IGR0IHsKKyAgICAgICAgcGFkZGluZzogNXB4OworfQorCitkbC5yZWZsaXN0IGRkIHsKKyAgICAgICAgbWFyZ2luOiAwcHggMHB4IDEwcHggMHB4OworICAgICAgICBwYWRkaW5nOiA1cHg7Cit9CisKKy5wYXJhbWtleSB7CisJdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy5wYXJhbXR5cGUgeworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5wYXJhbW5hbWUgeworCWNvbG9yOiAjNjAyMDIwOworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisucGFyYW1uYW1lIGVtIHsKKwlmb250LXN0eWxlOiBub3JtYWw7Cit9CisucGFyYW1uYW1lIGNvZGUgeworICAgICAgICBsaW5lLWhlaWdodDogMTRweDsKK30KKworLnBhcmFtcywgLnJldHZhbCwgLmV4Y2VwdGlvbiwgLnRwYXJhbXMgeworICAgICAgICBtYXJnaW4tbGVmdDogMHB4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworLnBhcmFtcyAucGFyYW1uYW1lLCAucmV0dmFsIC5wYXJhbW5hbWUgeworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworLnBhcmFtcyAucGFyYW10eXBlIHsKKyAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCisucGFyYW1zIC5wYXJhbWRpciB7CisgICAgICAgIGZvbnQtZmFtaWx5OiAiY291cmllciBuZXciLGNvdXJpZXIsbW9ub3NwYWNlOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0YWJsZS5tbGFiZWxzIHsKKwlib3JkZXItc3BhY2luZzogMHB4OworfQorCit0ZC5tbGFiZWxzLWxlZnQgeworCXdpZHRoOiAxMDAlOworCXBhZGRpbmc6IDBweDsKK30KKwordGQubWxhYmVscy1yaWdodCB7CisJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKwlwYWRkaW5nOiAwcHg7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworc3Bhbi5tbGFiZWxzIHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDsKK30KKworc3Bhbi5tbGFiZWwgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEY4RjhGOworICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjNzg3ODc4OworICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgIzc4Nzg3ODsKKyAgICAgICAgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjRDBEMEQwOworICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRDBEMEQwOworCXRleHQtc2hhZG93OiBub25lOworICAgICAgICBjb2xvcjogd2hpdGU7CisgICAgICAgIG1hcmdpbi1yaWdodDogNHB4OworICAgICAgICBwYWRkaW5nOiAycHggM3B4OworICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICAgIGZvbnQtc2l6ZTogN3B0OworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKworCisvKiBAZW5kICovCisKKy8qIHRoZXNlIGFyZSBmb3IgdHJlZSB2aWV3IHdoZW4gbm90IHVzZWQgYXMgbWFpbiBpbmRleCAqLworCitkaXYuZGlyZWN0b3J5IHsKKyAgICAgICAgbWFyZ2luOiAxMHB4IDBweDsKKyAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNBOEI4RDk7CisgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQThCOEQ5OworICAgICAgICB3aWR0aDogMTAwJTsKK30KKworLmRpcmVjdG9yeSB0YWJsZSB7CisgICAgICAgIGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKKyAgICAgICAgd2lkdGg6IDEwMCU7Cit9CisKKy5kaXJlY3RvcnkgdGQgeworICAgICAgICBtYXJnaW46IDBweDsKKyAgICAgICAgcGFkZGluZzogMHB4OworCXZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKKy5kaXJlY3RvcnkgdGQuZW50cnkgeworICAgICAgICB3aWR0aDogMjAlOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7Cit9CisKKy5kaXJlY3RvcnkgdGQuZW50cnkgYSB7CisgICAgICAgIG91dGxpbmU6bm9uZTsKK30KKworLmRpcmVjdG9yeSB0ZC5lbnRyeSBhIGltZyB7CisgICAgICAgIGJvcmRlcjogbm9uZTsKK30KKworLmRpcmVjdG9yeSB0ZC5kZXNjIHsKKyAgICAgICAgd2lkdGg6IDgwJTsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiA2cHg7CisJcGFkZGluZy1yaWdodDogNnB4OworCWJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjA1KTsKK30KKworLmRpcmVjdG9yeSB0ci5ldmVuIHsKKwlwYWRkaW5nLWxlZnQ6IDZweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4OworfQorCisuZGlyZWN0b3J5IGltZyB7CisJdmVydGljYWwtYWxpZ246IC0zMCU7Cit9CisKKy5kaXJlY3RvcnkgLmxldmVscyB7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICAgICAgZm9udC1zaXplOiA5cHQ7Cit9CisKKy5kaXJlY3RvcnkgLmxldmVscyBzcGFuIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKKyAgICAgICAgcGFkZGluZy1yaWdodDogMnB4OworCWNvbG9yOiAjNTg1ODU4OworfQorCitkaXYuZHluaGVhZGVyIHsKKyAgICAgICAgbWFyZ2luLXRvcDogOHB4OworCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKKwktd2Via2l0LXVzZXItc2VsZWN0OiBub25lOworCS1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsKKwktbW96LXVzZXItc2VsZWN0OiBub25lOworCS1tcy11c2VyLXNlbGVjdDogbm9uZTsKKwl1c2VyLXNlbGVjdDogbm9uZTsKK30KKworYWRkcmVzcyB7CisJZm9udC1zdHlsZTogbm9ybWFsOworCWNvbG9yOiAjM0EzQTNBOworfQorCit0YWJsZS5kb3h0YWJsZSB7CisJYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOworICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKK30KKwordGFibGUuZG94dGFibGUgdGQsIHRhYmxlLmRveHRhYmxlIHRoIHsKKwlib3JkZXI6IDFweCBzb2xpZCAjM0YzRjNGOworCXBhZGRpbmc6IDNweCA3cHggMnB4OworfQorCit0YWJsZS5kb3h0YWJsZSB0aCB7CisJYmFja2dyb3VuZC1jb2xvcjogIzRGNEY0RjsKKwljb2xvcjogI0ZGRkZGRjsKKwlmb250LXNpemU6IDExMCU7CisJcGFkZGluZy1ib3R0b206IDRweDsKKwlwYWRkaW5nLXRvcDogNXB4OworfQorCit0YWJsZS5maWVsZHRhYmxlIHsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIGJvcmRlci1zcGFjaW5nOiAwcHg7CisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAtbW96LWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xNSkgMnB4IDJweCAycHg7CisgICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogMnB4IDJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgICAgYm94LXNoYWRvdzogMnB4IDJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKK30KKworLmZpZWxkdGFibGUgdGQsIC5maWVsZHRhYmxlIHRoIHsKKyAgICAgICAgcGFkZGluZzogM3B4IDdweCAycHg7Cit9CisKKy5maWVsZHRhYmxlIHRkLmZpZWxkdHlwZSwgLmZpZWxkdGFibGUgdGQuZmllbGRuYW1lIHsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0I5QjlCOTsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKKy5maWVsZHRhYmxlIHRkLmZpZWxkZG9jIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIHdpZHRoOiAxMDAlOworfQorCisuZmllbGR0YWJsZSB0cjpsYXN0LWNoaWxkIHRkIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKK30KKworLmZpZWxkdGFibGUgdGggeworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOnVybCgnbmF2X2YucG5nJyk7CisgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRThFOEU4OworICAgICAgICBmb250LXNpemU6IDkwJTsKKyAgICAgICAgY29sb3I6ICMzMjMyMzI7CisgICAgICAgIHBhZGRpbmctYm90dG9tOiA0cHg7CisgICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CisgICAgICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDRweDsKKyAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiA0cHg7CisgICAgICAgIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICAgICAgICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7Cit9CisKKworLnRhYnNlYXJjaCB7CisJdG9wOiAwcHg7CisJbGVmdDogMTBweDsKKwloZWlnaHQ6IDM2cHg7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYi5wbmcnKTsKKwl6LWluZGV4OiAxMDE7CisJb3ZlcmZsb3c6IGhpZGRlbjsKKwlmb250LXNpemU6IDEzcHg7Cit9CisKKy5uYXZwYXRoIHVsCit7CisJZm9udC1zaXplOiAxMXB4OworCWJhY2tncm91bmQtaW1hZ2U6dXJsKCd0YWJfYi5wbmcnKTsKKwliYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsKKwloZWlnaHQ6MzBweDsKKwlsaW5lLWhlaWdodDozMHB4OworCWNvbG9yOiNBMkEyQTI7CisJYm9yZGVyOnNvbGlkIDFweCAjQ0VDRUNFOworCW92ZXJmbG93OmhpZGRlbjsKKwltYXJnaW46MHB4OworCXBhZGRpbmc6MHB4OworfQorCisubmF2cGF0aCBsaQoreworCWxpc3Qtc3R5bGUtdHlwZTpub25lOworCWZsb2F0OmxlZnQ7CisJcGFkZGluZy1sZWZ0OjEwcHg7CisJcGFkZGluZy1yaWdodDoxNXB4OworCWJhY2tncm91bmQtaW1hZ2U6dXJsKCdiY19zLnBuZycpOworCWJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKKwliYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0OworCWNvbG9yOiM0RDRENEQ7Cit9CisKKy5uYXZwYXRoIGxpLm5hdmVsZW0gYQoreworCWhlaWdodDozMnB4OworCWRpc3BsYXk6YmxvY2s7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCW91dGxpbmU6IG5vbmU7Cit9CisKKy5uYXZwYXRoIGxpLm5hdmVsZW0gYTpob3ZlcgoreworCWNvbG9yOiM4ODg4ODg7Cit9CisKKy5uYXZwYXRoIGxpLmZvb3RlcgoreworICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKKyAgICAgICAgZmxvYXQ6cmlnaHQ7CisgICAgICAgIHBhZGRpbmctbGVmdDoxMHB4OworICAgICAgICBwYWRkaW5nLXJpZ2h0OjE1cHg7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0OworICAgICAgICBjb2xvcjojNEQ0RDREOworICAgICAgICBmb250LXNpemU6IDhwdDsKK30KKworCitkaXYuc3VtbWFyeQoreworCWZsb2F0OiByaWdodDsKKwlmb250LXNpemU6IDhwdDsKKwlwYWRkaW5nLXJpZ2h0OiA1cHg7CisJd2lkdGg6IDUwJTsKKwl0ZXh0LWFsaWduOiByaWdodDsKK30KKworZGl2LnN1bW1hcnkgYQoreworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKK2Rpdi5pbmdyb3VwcworeworCWZvbnQtc2l6ZTogOHB0OworCXdpZHRoOiA1MCU7CisJdGV4dC1hbGlnbjogbGVmdDsKK30KKworZGl2LmluZ3JvdXBzIGEKK3sKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCitkaXYuaGVhZGVyCit7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCduYXZfaC5wbmcnKTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwltYXJnaW46ICAwcHg7CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNEMEQwRDA7Cit9CisKK2Rpdi5oZWFkZXJ0aXRsZQoreworCXBhZGRpbmc6IDVweCA1cHggNXB4IDdweDsKK30KKworZGwKK3sKKyAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKK30KKworLyogZGwubm90ZSwgZGwud2FybmluZywgZGwuYXR0ZW50aW9uLCBkbC5wcmUsIGRsLnBvc3QsIGRsLmludmFyaWFudCwgZGwuZGVwcmVjYXRlZCwgZGwudG9kbywgZGwudGVzdCwgZGwuYnVnICovCitkbC5zZWN0aW9uCit7CisJbWFyZ2luLWxlZnQ6IDBweDsKKwlwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworZGwubm90ZQoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICNEMEMwMDA7Cit9CisKK2RsLndhcm5pbmcsIGRsLmF0dGVudGlvbgoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICNGRjAwMDA7Cit9CisKK2RsLnByZSwgZGwucG9zdCwgZGwuaW52YXJpYW50Cit7CisgICAgICAgIG1hcmdpbi1sZWZ0Oi03cHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogM3B4OworICAgICAgICBib3JkZXItbGVmdDo0cHggc29saWQ7CisgICAgICAgIGJvcmRlci1jb2xvcjogIzAwRDAwMDsKK30KKworZGwuZGVwcmVjYXRlZAoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICM1MDUwNTA7Cit9CisKK2RsLnRvZG8KK3sKKyAgICAgICAgbWFyZ2luLWxlZnQ6LTdweDsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CisgICAgICAgIGJvcmRlcjo0cHggc29saWQ7CisgICAgICAgIGJvcmRlci1jb2xvcjogIzAwQzBFMDsKK30KKworZGwudGVzdAoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICMzMDMwRTA7Cit9CisKK2RsLmJ1ZworeworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICNDMDgwNTA7Cit9CisKK2RsLnNlY3Rpb24gZGQgeworCW1hcmdpbi1ib3R0b206IDZweDsKK30KKworCisjcHJvamVjdGxvZ28KK3sKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKwlib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOworfQorCisjcHJvamVjdGxvZ28gaW1nCit7CisJYm9yZGVyOiAwcHggbm9uZTsKK30KKworI3Byb2plY3RuYW1lCit7CisJZm9udDogMzAwJSBUYWhvbWEsIEFyaWFsLHNhbnMtc2VyaWY7CisJbWFyZ2luOiAwcHg7CisJcGFkZGluZzogMnB4IDBweDsKK30KKworI3Byb2plY3RicmllZgoreworCWZvbnQ6IDEyMCUgVGFob21hLCBBcmlhbCxzYW5zLXNlcmlmOworCW1hcmdpbjogMHB4OworCXBhZGRpbmc6IDBweDsKK30KKworI3Byb2plY3RudW1iZXIKK3sKKwlmb250OiA1MCUgVGFob21hLCBBcmlhbCxzYW5zLXNlcmlmOworCW1hcmdpbjogMHB4OworCXBhZGRpbmc6IDBweDsKK30KKworI3RpdGxlYXJlYQoreworCXBhZGRpbmc6IDBweDsKKwltYXJnaW46IDBweDsKKwl3aWR0aDogMTAwJTsKKwlib3JkZXItYm90dG9tOiAxcHggc29saWQgIzc4Nzg3ODsKK30KKworLmltYWdlCit7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLmRvdGdyYXBoCit7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLm1zY2dyYXBoCit7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLmNhcHRpb24KK3sKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworZGl2Lnpvb20KK3sKKwlib3JkZXI6IDFweCBzb2xpZCAjQTZBNkE2OworfQorCitkbC5jaXRlbGlzdCB7CisgICAgICAgIG1hcmdpbi1ib3R0b206NTBweDsKK30KKworZGwuY2l0ZWxpc3QgZHQgeworICAgICAgICBjb2xvcjojNDg0ODQ4OworICAgICAgICBmbG9hdDpsZWZ0OworICAgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgICBtYXJnaW4tcmlnaHQ6MTBweDsKKyAgICAgICAgcGFkZGluZzo1cHg7Cit9CisKK2RsLmNpdGVsaXN0IGRkIHsKKyAgICAgICAgbWFyZ2luOjJweCAwOworICAgICAgICBwYWRkaW5nOjVweCAwOworfQorCitkaXYudG9jIHsKKyAgICAgICAgcGFkZGluZzogMTRweCAyNXB4OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjZGNkY2OworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjREZERkRGOworICAgICAgICBib3JkZXItcmFkaXVzOiA3cHggN3B4IDdweCA3cHg7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgaGVpZ2h0OiBhdXRvOworICAgICAgICBtYXJnaW46IDAgMjBweCAxMHB4IDEwcHg7CisgICAgICAgIHdpZHRoOiAyMDBweDsKK30KKworZGl2LnRvYyBsaSB7CisgICAgICAgIGJhY2tncm91bmQ6IHVybCgiYmR3bi5wbmciKSBuby1yZXBlYXQgc2Nyb2xsIDAgNXB4IHRyYW5zcGFyZW50OworICAgICAgICBmb250OiAxMHB4LzEuMiBWZXJkYW5hLERlamFWdSBTYW5zLEdlbmV2YSxzYW5zLXNlcmlmOworICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICAgICAgcGFkZGluZy10b3A6IDJweDsKK30KKworZGl2LnRvYyBoMyB7CisgICAgICAgIGZvbnQ6IGJvbGQgMTJweC8xLjIgQXJpYWwsRnJlZVNhbnMsc2Fucy1zZXJpZjsKKwljb2xvcjogIzY4Njg2ODsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBub25lOworICAgICAgICBtYXJnaW46IDA7Cit9CisKK2Rpdi50b2MgdWwgeworICAgICAgICBsaXN0LXN0eWxlOiBub25lIG91dHNpZGUgbm9uZTsKKyAgICAgICAgYm9yZGVyOiBtZWRpdW0gbm9uZTsKKyAgICAgICAgcGFkZGluZzogMHB4OworfQorCitkaXYudG9jIGxpLmxldmVsMSB7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7Cit9CisKK2Rpdi50b2MgbGkubGV2ZWwyIHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHg7Cit9CisKK2Rpdi50b2MgbGkubGV2ZWwzIHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDMwcHg7Cit9CisKK2Rpdi50b2MgbGkubGV2ZWw0IHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7Cit9CisKKy5pbmhlcml0X2hlYWRlciB7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICBjb2xvcjogZ3JheTsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKKwktd2Via2l0LXVzZXItc2VsZWN0OiBub25lOworCS1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsKKwktbW96LXVzZXItc2VsZWN0OiBub25lOworCS1tcy11c2VyLXNlbGVjdDogbm9uZTsKKwl1c2VyLXNlbGVjdDogbm9uZTsKK30KKworLmluaGVyaXRfaGVhZGVyIHRkIHsKKyAgICAgICAgcGFkZGluZzogNnB4IDBweCAycHggNXB4OworfQorCisuaW5oZXJpdCB7CisgICAgICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKK3RyLmhlYWRpbmcgaDIgeworICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cit9CisKK0BtZWRpYSBwcmludAoreworICAjdG9wIHsgZGlzcGxheTogbm9uZTsgfQorICAjc2lkZS1uYXYgeyBkaXNwbGF5OiBub25lOyB9CisgICNuYXYtcGF0aCB7IGRpc3BsYXk6IG5vbmU7IH0KKyAgYm9keSB7IG92ZXJmbG93OnZpc2libGU7IH0KKyAgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7IHBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkOyB9CisgIC5zdW1tYXJ5IHsgZGlzcGxheTogbm9uZTsgfQorICAubWVtaXRlbSB7IHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsgfQorICAjZG9jLWNvbnRlbnQKKyAgeworICAgIG1hcmdpbi1sZWZ0OjAgIWltcG9ydGFudDsKKyAgICBoZWlnaHQ6YXV0byAhaW1wb3J0YW50OworICAgIHdpZHRoOmF1dG8gIWltcG9ydGFudDsKKyAgICBvdmVyZmxvdzppbmhlcml0OworICAgIGRpc3BsYXk6aW5saW5lOworICB9Cit9CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9mb3VuZGF0aW9uLmNzcyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2ZvdW5kYXRpb24uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTMzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9mb3VuZGF0aW9uLmNzcwpAQCAtMCwwICsxLDc4OCBAQAorLmMtMSwgLmMtMiwgLmMtMywgLmMtNCwgLmMtNSwgLmMtNiwgLmMtNywgLmMtOCwgLmMtOSwgLmMtMTAsIC5jLTExLCAuYy0xMiB7IGZsb2F0OiBsZWZ0OyB9CisKKy5jLTEsIC5jLTIsIC5jLTMsIC5jLTQsIC5jLTUsIC5jLTYsIC5jLTcsIC5jLTgsIC5jLTksIC5jLTEwLCAuYy0xMSwgLmMtMTIgeyBwb3NpdGlvbjogcmVsYXRpdmU7IG1pbi1oZWlnaHQ6IDFweDsgcGFkZGluZzogMCAxNXB4OyB9CisKKy5jLTEgeyB3aWR0aDogOC4zMzMzMyU7IH0KKworLmMtMiB7IHdpZHRoOiAxNi42NjY2NyU7IH0KKworLmMtMyB7IHdpZHRoOiAyNSU7IH0KKworLmMtNCB7IHdpZHRoOiAzMy4zMzMzMyU7IH0KKworLmMtNSB7IHdpZHRoOiA0MS42NjY2NyU7IH0KKworLmMtNiB7IHdpZHRoOiA1MCU7IH0KKworLmMtNyB7IHdpZHRoOiA1OC4zMzMzMyU7IH0KKworLmMtOCB7IHdpZHRoOiA2Ni42NjY2NyU7IH0KKworLmMtOSB7IHdpZHRoOiA3NSU7IH0KKworLmMtMTAgeyB3aWR0aDogODMuMzMzMzMlOyB9CisKKy5jLTExIHsgd2lkdGg6IDkxLjY2NjY3JTsgfQorCisuYy0xMiB7IHdpZHRoOiAxMDAlOyB9CisKKy8qIFJlcXVpcmVzOiBub3JtYWxpemUuY3NzICovCisvKiBHbG9iYWwgUmVzZXQgJiBTdGFuZGFyZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworKiB7IC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CisKK2h0bWwgeyBmb250LXNpemU6IDYyLjUlOyB9CisKK2JvZHkgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOyBjb2xvcjogIzIyMjIyMjsgcG9zaXRpb246IHJlbGF0aXZlOyAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsgfQorCisvKiBMaW5rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCithIHsgY29sb3I6ICNmZDc4MDA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KKworYTpob3ZlciB7IGNvbG9yOiAjMjc5NWI2OyB9CisKK2E6Zm9jdXMgeyBjb2xvcjogI2ZkNzgwMDsgb3V0bGluZTogbm9uZTsgfQorCitwIGEsIHAgYTp2aXNpdGVkIHsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KKworLyogTWlzYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisubGVmdCB7IGZsb2F0OiBsZWZ0OyB9CitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IC5sZWZ0IHsgZmxvYXQ6IG5vbmU7IH0gfQorCisucmlnaHQgeyBmbG9hdDogcmlnaHQ7IH0KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsgLnJpZ2h0IHsgZmxvYXQ6IG5vbmU7IH0gfQorCisudGV4dC1sZWZ0IHsgdGV4dC1hbGlnbjogbGVmdDsgfQorCisudGV4dC1yaWdodCB7IHRleHQtYWxpZ246IHJpZ2h0OyB9CisKKy50ZXh0LWNlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlcjsgfQorCisuaGlkZSB7IGRpc3BsYXk6IG5vbmU7IH0KKworLmhpZ2hsaWdodCB7IGJhY2tncm91bmQ6ICNmZmZmOTk7IH0KKworI2dvb2dsZW1hcCBpbWcsIG9iamVjdCwgZW1iZWQgeyBtYXgtd2lkdGg6IG5vbmU7IH0KKworI21hcF9jYW52YXMgZW1iZWQgeyBtYXgtd2lkdGg6IG5vbmU7IH0KKworI21hcF9jYW52YXMgaW1nIHsgbWF4LXdpZHRoOiBub25lOyB9CisKKyNtYXBfY2FudmFzIG9iamVjdCB7IG1heC13aWR0aDogbm9uZTsgfQorCisvKiBSZXNldCBmb3Igc3RyYW5nZSBtYXJnaW5zIGJ5IGRlZmF1bHQgb24gPGZpZ3VyZT4gZWxlbWVudHMgKi8KK2ZpZ3VyZSB7IG1hcmdpbjogMDsgfQorCisvKiBCYXNlIFR5cGUgU3R5bGVzIFVzaW5nIE1vZHVsYXIgU2NhbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworYm9keSwgZGl2LCBkbCwgZHQsIGRkLCB1bCwgb2wsIGxpLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBwcmUsIGZvcm0sIHAsIGJsb2NrcXVvdGUsIHRoLCB0ZCB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgZm9udC1zaXplOiAxNHB4OyBkaXJlY3Rpb246IGx0cjsgfQorCitwIHsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjY7IG1hcmdpbi1ib3R0b206IDE3cHg7IH0KK3AubGVhZCB7IGZvbnQtc2l6ZTogMTcuNXB4OyBsaW5lLWhlaWdodDogMS42OyBtYXJnaW4tYm90dG9tOiAxN3B4OyB9CisKK2FzaWRlIHAgeyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjM1OyBmb250LXN0eWxlOiBpdGFsaWM7IH0KKworaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7IGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCAiSGVsdmV0aWNhIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjMjIyMjIyOyB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OyBsaW5lLWhlaWdodDogMS4wOyBtYXJnaW4tYm90dG9tOiAxNHB4OyBtYXJnaW4tdG9wOiAxNHB4OyB9CitoMSBzbWFsbCwgaDIgc21hbGwsIGgzIHNtYWxsLCBoNCBzbWFsbCwgaDUgc21hbGwsIGg2IHNtYWxsIHsgZm9udC1zaXplOiA2MCU7IGNvbG9yOiAjNmY2ZjZmOyBsaW5lLWhlaWdodDogMDsgfQorCitoMSB7IGZvbnQtc2l6ZTogMjRweDsgfQorCitoMiB7IGZvbnQtc2l6ZTogMThweDsgfQorCitoMyB7IGZvbnQtc2l6ZTogMTRweDsgfQorCitoNCB7IGZvbnQtc2l6ZTogMTJweDsgfQorCitoNSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDEycHg7IH0KKworaDYgeyBmb250LXN0eWxlOiBpdGFsaWM7IGZvbnQtc2l6ZTogMTJweDsgfQorCitociB7IGJvcmRlcjogc29saWQgI2M2YzZjNjsgYm9yZGVyLXdpZHRoOiAxcHggMCAwOyBjbGVhcjogYm90aDsgbWFyZ2luOiAyMnB4IDAgMjFweDsgaGVpZ2h0OiAwOyB9CisKKy5zdWJoZWFkZXIgeyBsaW5lLWhlaWdodDogMS4zOyBjb2xvcjogIzZmNmY2ZjsgZm9udC13ZWlnaHQ6IDMwMDsgbWFyZ2luLWJvdHRvbTogMTdweDsgfQorCitlbSwgaSB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KKworc3Ryb25nLCBiIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGxpbmUtaGVpZ2h0OiBpbmhlcml0OyB9CisKK3NtYWxsIHsgZm9udC1zaXplOiA2MCU7IGxpbmUtaGVpZ2h0OiBpbmhlcml0OyB9CisKK2NvZGUgeyBmb250LXdlaWdodDogYm9sZDsgYmFja2dyb3VuZDogI2ZmZmY5OTsgfQorCisvKiBMaXN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit1bCwgb2wgeyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjY7IG1hcmdpbi1ib3R0b206IDE3cHg7IGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsgfQorCit1bCBsaSB1bCwgdWwgbGkgb2wgeyBtYXJnaW4tbGVmdDogMjBweDsgbWFyZ2luLWJvdHRvbTogMDsgfQordWwuc3F1YXJlLCB1bC5jaXJjbGUsIHVsLmRpc2MgeyBtYXJnaW4tbGVmdDogMTdweDsgfQordWwuc3F1YXJlIHsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7IH0KK3VsLnNxdWFyZSBsaSB1bCB7IGxpc3Qtc3R5bGU6IGluaGVyaXQ7IH0KK3VsLmNpcmNsZSB7IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyB9Cit1bC5jaXJjbGUgbGkgdWwgeyBsaXN0LXN0eWxlOiBpbmhlcml0OyB9Cit1bC5kaXNjIHsgbGlzdC1zdHlsZS10eXBlOiBkaXNjOyB9Cit1bC5kaXNjIGxpIHVsIHsgbGlzdC1zdHlsZTogaW5oZXJpdDsgfQordWwubm8tYnVsbGV0IHsgbGlzdC1zdHlsZTogbm9uZTsgfQordWwubGFyZ2UgbGkgeyBsaW5lLWhlaWdodDogMjFweDsgfQorCitvbCBsaSB1bCwgb2wgbGkgb2wgeyBtYXJnaW4tbGVmdDogMjBweDsgbWFyZ2luLWJvdHRvbTogMDsgfQorCisvKiBCbG9ja3F1b3RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitibG9ja3F1b3RlLCBibG9ja3F1b3RlIHAgeyBsaW5lLWhlaWdodDogMS41OyB9CisKK2Jsb2NrcXVvdGUgeyBtYXJnaW46IDAgMCAxN3B4OyBwYWRkaW5nOiA5cHggMjBweCAwIDE5cHg7IH0KK2Jsb2NrcXVvdGUgY2l0ZSB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDEzcHQ7IGNvbG9yOiAjNTU1NTU1OyB9CitibG9ja3F1b3RlIGNpdGU6YmVmb3JlIHsgY29udGVudDogIlwyMDE0IFwwMDIwIjsgfQorYmxvY2txdW90ZSBjaXRlIGEsIGJsb2NrcXVvdGUgY2l0ZSBhOnZpc2l0ZWQgeyBjb2xvcjogIzU1NTU1NTsgfQorCithYmJyLCBhY3JvbnltIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgZm9udC1zaXplOiA5MCU7IGNvbG9yOiAjMjIyMjIyOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDsgY3Vyc29yOiBoZWxwOyB9CisKK2FiYnIgeyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgfQorCisvKiBQcmludCBzdHlsZXMuICBJbmxpbmVkIHRvIGF2b2lkIHJlcXVpcmVkIEhUVFAgY29ubmVjdGlvbjogd3d3LnBocGllZC5jb20vZGVsYXktbG9hZGluZy15b3VyLXByaW50LWNzcy8gQ3JlZGl0IHRvIFBhdWwgSXJpc2ggYW5kIEhUTUw1IEJvaWxlcnBsYXRlIChodG1sNWJvaWxlcnBsYXRlLmNvbSkKKyovCisucHJpbnQtb25seSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQorCitAbWVkaWEgcHJpbnQgeyAqIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7IGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsgZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IC1tcy1maWx0ZXI6IG5vbmUgIWltcG9ydGFudDsgfQorICAvKiBCbGFjayBwcmludHMgZmFzdGVyOiBoNWJwLmNvbS9zICovCisgIGEsIGE6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisgIGFbaHJlZl06YWZ0ZXIgeyBjb250ZW50OiAiICgiIGF0dHIoaHJlZikgIikiOyB9CisgIGFiYnJbdGl0bGVdOmFmdGVyIHsgY29udGVudDogIiAoIiBhdHRyKHRpdGxlKSAiKSI7IH0KKyAgLmlyIGE6YWZ0ZXIsIGFbaHJlZl49ImphdmFzY3JpcHQ6Il06YWZ0ZXIsIGFbaHJlZl49IiMiXTphZnRlciB7IGNvbnRlbnQ6ICIiOyB9CisgIC8qIERvbid0IHNob3cgbGlua3MgZm9yIGltYWdlcywgb3IgamF2YXNjcmlwdC9pbnRlcm5hbCBsaW5rcyAqLworICBwcmUsIGJsb2NrcXVvdGUgeyBib3JkZXI6IDFweCBzb2xpZCAjOTk5OyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0KKyAgdGhlYWQgeyBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXA7IH0KKyAgLyogaDVicC5jb20vdCAqLworICB0ciwgaW1nIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9CisgIGltZyB7IG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfQorICBwLCBoMiwgaDMgeyBvcnBoYW5zOiAzOyB3aWRvd3M6IDM7IH0KKyAgaDIsIGgzIHsgcGFnZS1icmVhay1hZnRlcjogYXZvaWQ7IH0KKyAgLmhpZGUtb24tcHJpbnQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KKyAgLnByaW50LW9ubHkgeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9IH0KKy8qIFJlcXVpcmVzIGdsb2JhbHMuY3NzICovCisvKiBTdGFuZGFyZCBGb3JtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitmb3JtIHsgbWFyZ2luOiAwIDAgMTkuNDE2NDFweDsgfQorCisucm93IGZvcm0gLnJvdyB7IG1hcmdpbjogMCAtNnB4OyB9Cisucm93IGZvcm0gLnJvdyAuY29sdW1uLCAucm93IGZvcm0gLnJvdyAuY29sdW1ucyB7IHBhZGRpbmc6IDAgNnB4OyB9Cisucm93IGZvcm0gLnJvdy5jb2xsYXBzZSB7IG1hcmdpbjogMDsgfQorLnJvdyBmb3JtIC5yb3cuY29sbGFwc2UgLmNvbHVtbiwgLnJvdyBmb3JtIC5yb3cuY29sbGFwc2UgLmNvbHVtbnMgeyBwYWRkaW5nOiAwOyB9CisKK2xhYmVsIHsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogIzRkNGQ0ZDsgY3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBibG9jazsgZm9udC13ZWlnaHQ6IDUwMDsgbWFyZ2luLWJvdHRvbTogM3B4OyB9CitsYWJlbC5yaWdodCB7IGZsb2F0OiBub25lOyB0ZXh0LWFsaWduOiByaWdodDsgfQorbGFiZWwuaW5saW5lIHsgbGluZS1oZWlnaHQ6IDMycHg7IG1hcmdpbjogMCAwIDEycHggMDsgfQorCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IGxhYmVsLnJpZ2h0IHsgdGV4dC1hbGlnbjogbGVmdDsgfSB9CisucHJlZml4LCAucG9zdGZpeCB7IGRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogcmVsYXRpdmU7IHotaW5kZXg6IDI7IHRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7IHBhZGRpbmctdG9wOiAwOyBwYWRkaW5nLWJvdHRvbTogMDsgaGVpZ2h0OiAzMnB4OyBsaW5lLWhlaWdodDogMzFweDsgfQorCithLmJ1dHRvbi5wcmVmaXgsIGEuYnV0dG9uLnBvc3RmaXggeyBwYWRkaW5nLWxlZnQ6IDA7IHBhZGRpbmctcmlnaHQ6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgfQorCitzcGFuLnByZWZpeCwgc3Bhbi5wb3N0Zml4IHsgYmFja2dyb3VuZDogI2YyZjJmMjsgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsgfQorCisucHJlZml4IHsgbGVmdDogMnB4OyAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogMnB4OyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDsgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4OyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogMnB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OyBvdmVyZmxvdzogaGlkZGVuOyB9CisKKy5wb3N0Zml4IHsgcmlnaHQ6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiAycHg7IC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiAycHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsgfQorCitpbnB1dFt0eXBlPSJ0ZXh0Il0sIGlucHV0W3R5cGU9InBhc3N3b3JkIl0sIGlucHV0W3R5cGU9ImRhdGUiXSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXSwgaW5wdXRbdHlwZT0iZW1haWwiXSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0sIGlucHV0W3R5cGU9InNlYXJjaCJdLCBpbnB1dFt0eXBlPSJ0ZWwiXSwgaW5wdXRbdHlwZT0idGltZSJdLCBpbnB1dFt0eXBlPSJ1cmwiXSwgdGV4dGFyZWEgeyBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgIkhlbHZldGljYSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDJweDsgLW1zLWJvcmRlci1yYWRpdXM6IDJweDsgLW8tYm9yZGVyLXJhZGl1czogMnB4OyBib3JkZXItcmFkaXVzOiAycHg7IC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpOyBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpOyBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjc1KTsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTRweDsgbWFyZ2luOiAwIDAgMTJweCAwOyBwYWRkaW5nOiA2cHg7IGhlaWdodDogMzJweDsgd2lkdGg6IDEwMCU7IC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMTVzIGxpbmVhcjsgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyAtby10cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyB9CitpbnB1dFt0eXBlPSJ0ZXh0Il0ub3ZlcnNpemUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0ub3ZlcnNpemUsIGlucHV0W3R5cGU9ImRhdGUiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0iZW1haWwiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0ub3ZlcnNpemUsIGlucHV0W3R5cGU9InNlYXJjaCJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJ0ZWwiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0idGltZSJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJ1cmwiXS5vdmVyc2l6ZSwgdGV4dGFyZWEub3ZlcnNpemUgeyBmb250LXNpemU6IDE3cHg7IHBhZGRpbmc6IDRweCA2cHg7IH0KK2lucHV0W3R5cGU9InRleHQiXTpmb2N1cywgaW5wdXRbdHlwZT0icGFzc3dvcmQiXTpmb2N1cywgaW5wdXRbdHlwZT0iZGF0ZSJdOmZvY3VzLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdOmZvY3VzLCBpbnB1dFt0eXBlPSJlbWFpbCJdOmZvY3VzLCBpbnB1dFt0eXBlPSJudW1iZXIiXTpmb2N1cywgaW5wdXRbdHlwZT0ic2VhcmNoIl06Zm9jdXMsIGlucHV0W3R5cGU9InRlbCJdOmZvY3VzLCBpbnB1dFt0eXBlPSJ0aW1lIl06Zm9jdXMsIGlucHV0W3R5cGU9InVybCJdOmZvY3VzLCB0ZXh0YXJlYTpmb2N1cyB7IGJhY2tncm91bmQ6ICNmYWZhZmE7IG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDsgYm9yZGVyLWNvbG9yOiAjYjNiM2IzOyB9CitpbnB1dFt0eXBlPSJ0ZXh0Il1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0iZGF0ZSJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXVtkaXNhYmxlZF0sIGlucHV0W3R5cGU9ImVtYWlsIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJudW1iZXIiXVtkaXNhYmxlZF0sIGlucHV0W3R5cGU9InNlYXJjaCJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0idGVsIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJ0aW1lIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJ1cmwiXVtkaXNhYmxlZF0sIHRleHRhcmVhW2Rpc2FibGVkXSB7IGJhY2tncm91bmQtY29sb3I6ICNkZGQ7IH0KKwordGV4dGFyZWEgeyBoZWlnaHQ6IGF1dG87IH0KKworc2VsZWN0IHsgd2lkdGg6IDEwMCU7IH0KKworLyogRmllbGRzZXRzICovCitmaWVsZHNldCB7IGJvcmRlcjogc29saWQgMXB4ICNkZGQ7IGJvcmRlci1yYWRpdXM6IDNweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyBwYWRkaW5nOiAxMnB4IDEycHggMDsgbWFyZ2luOiAxOHB4IDA7IH0KK2ZpZWxkc2V0IGxlZ2VuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgcGFkZGluZzogMCAzcHg7IG1hcmdpbjogMDsgbWFyZ2luLWxlZnQ6IC0zcHg7IH0KKworLyogRXJyb3JzICovCisuZXJyb3IgaW5wdXQsIGlucHV0LmVycm9yLCAuZXJyb3IgdGV4dGFyZWEsIHRleHRhcmVhLmVycm9yIHsgYm9yZGVyLWNvbG9yOiAjYzYwZjEzOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5OCwgMTUsIDE5LCAwLjEpOyB9CisKKy5lcnJvciBsYWJlbCwgbGFiZWwuZXJyb3IgeyBjb2xvcjogI2M2MGYxMzsgfQorCisuZXJyb3Igc21hbGwsIHNtYWxsLmVycm9yIHsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IDZweCA0cHg7IG1hcmdpbi10b3A6IC0xM3B4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBiYWNrZ3JvdW5kOiAjYzYwZjEzOyBjb2xvcjogI2ZmZjsgZm9udC1zaXplOiAxMnB4OyBmb250LXNpemU6IDEuMnJlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAycHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogMnB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyBpbnB1dFt0eXBlPSJ0ZXh0Il0ub25lLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLm9uZSwgaW5wdXRbdHlwZT0iZGF0ZSJdLm9uZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5vbmUsIGlucHV0W3R5cGU9ImVtYWlsIl0ub25lLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5vbmUsIGlucHV0W3R5cGU9InNlYXJjaCJdLm9uZSwgaW5wdXRbdHlwZT0idGVsIl0ub25lLCBpbnB1dFt0eXBlPSJ0aW1lIl0ub25lLCBpbnB1dFt0eXBlPSJ1cmwiXS5vbmUsIHRleHRhcmVhLm9uZSwgLnJvdyB0ZXh0YXJlYS5vbmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnR3bywgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d28sIGlucHV0W3R5cGU9ImRhdGUiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnR3bywgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d28sIGlucHV0W3R5cGU9ImVtYWlsIl0udHdvLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udHdvLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdvLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50d28sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udHdvLCBpbnB1dFt0eXBlPSJ0ZWwiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udHdvLCBpbnB1dFt0eXBlPSJ0aW1lIl0udHdvLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS50d28sIGlucHV0W3R5cGU9InVybCJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50d28sIHRleHRhcmVhLnR3bywgLnJvdyB0ZXh0YXJlYS50d28geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0udGhyZWUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50aHJlZSwgaW5wdXRbdHlwZT0iZGF0ZSJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS50aHJlZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLnRocmVlLCBpbnB1dFt0eXBlPSJlbWFpbCJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udGhyZWUsIGlucHV0W3R5cGU9Im51bWJlciJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLnRocmVlLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS50aHJlZSwgaW5wdXRbdHlwZT0idGVsIl0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udGhyZWUsIGlucHV0W3R5cGU9InRpbWUiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0udGhyZWUsIGlucHV0W3R5cGU9InVybCJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9InVybCJdLnRocmVlLCB0ZXh0YXJlYS50aHJlZSwgLnJvdyB0ZXh0YXJlYS50aHJlZSB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KKyAgaW5wdXRbdHlwZT0idGV4dCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLmZvdXIsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZvdXIsIGlucHV0W3R5cGU9ImRhdGUiXS5mb3VyLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5mb3VyLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5mb3VyLCBpbnB1dFt0eXBlPSJlbWFpbCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5mb3VyLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5mb3VyLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmZvdXIsIGlucHV0W3R5cGU9InNlYXJjaCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uZm91ciwgaW5wdXRbdHlwZT0idGVsIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5mb3VyLCBpbnB1dFt0eXBlPSJ0aW1lIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZm91ciwgaW5wdXRbdHlwZT0idXJsIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5mb3VyLCB0ZXh0YXJlYS5mb3VyLCAucm93IHRleHRhcmVhLmZvdXIgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS5maXZlLCAucm93IGlucHV0W3R5cGU9InRleHQiXS5maXZlLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5maXZlLCBpbnB1dFt0eXBlPSJkYXRlIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uZml2ZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5maXZlLCAucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uZml2ZSwgaW5wdXRbdHlwZT0iZW1haWwiXS5maXZlLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uZml2ZSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5maXZlLCBpbnB1dFt0eXBlPSJzZWFyY2giXS5maXZlLCAucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLmZpdmUsIGlucHV0W3R5cGU9InRlbCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uZml2ZSwgaW5wdXRbdHlwZT0idGltZSJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLmZpdmUsIGlucHV0W3R5cGU9InVybCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uZml2ZSwgdGV4dGFyZWEuZml2ZSwgLnJvdyB0ZXh0YXJlYS5maXZlIHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQorICBpbnB1dFt0eXBlPSJ0ZXh0Il0uc2l4LCAucm93IGlucHV0W3R5cGU9InRleHQiXS5zaXgsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2l4LCAucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2l4LCBpbnB1dFt0eXBlPSJkYXRlIl0uc2l4LCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5zaXgsIGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2l4LCAucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2l4LCBpbnB1dFt0eXBlPSJlbWFpbCJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLnNpeCwgaW5wdXRbdHlwZT0ibnVtYmVyIl0uc2l4LCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLnNpeCwgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2l4LCAucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLnNpeCwgaW5wdXRbdHlwZT0idGVsIl0uc2l4LCAucm93IGlucHV0W3R5cGU9InRlbCJdLnNpeCwgaW5wdXRbdHlwZT0idGltZSJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uc2l4LCBpbnB1dFt0eXBlPSJ1cmwiXS5zaXgsIC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uc2l4LCB0ZXh0YXJlYS5zaXgsIC5yb3cgdGV4dGFyZWEuc2l4IHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQorICBpbnB1dFt0eXBlPSJ0ZXh0Il0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnNldmVuLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnNldmVuLCAucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2V2ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uc2V2ZW4sIGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5zZXZlbiwgaW5wdXRbdHlwZT0iZW1haWwiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLnNldmVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5zZXZlbiwgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2V2ZW4sIGlucHV0W3R5cGU9InRlbCJdLnNldmVuLCAucm93IGlucHV0W3R5cGU9InRlbCJdLnNldmVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLnNldmVuLCBpbnB1dFt0eXBlPSJ1cmwiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5zZXZlbiwgdGV4dGFyZWEuc2V2ZW4sIC5yb3cgdGV4dGFyZWEuc2V2ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0uZWlnaHQsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5laWdodCwgaW5wdXRbdHlwZT0iZGF0ZSJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5laWdodCwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmVpZ2h0LCBpbnB1dFt0eXBlPSJlbWFpbCJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uZWlnaHQsIGlucHV0W3R5cGU9Im51bWJlciJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmVpZ2h0LCBpbnB1dFt0eXBlPSJzZWFyY2giXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS5laWdodCwgaW5wdXRbdHlwZT0idGVsIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uZWlnaHQsIGlucHV0W3R5cGU9InRpbWUiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZWlnaHQsIGlucHV0W3R5cGU9InVybCJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9InVybCJdLmVpZ2h0LCB0ZXh0YXJlYS5laWdodCwgLnJvdyB0ZXh0YXJlYS5laWdodCB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KKyAgaW5wdXRbdHlwZT0idGV4dCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLm5pbmUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLm5pbmUsIGlucHV0W3R5cGU9ImRhdGUiXS5uaW5lLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5uaW5lLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5uaW5lLCBpbnB1dFt0eXBlPSJlbWFpbCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5uaW5lLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5uaW5lLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLm5pbmUsIGlucHV0W3R5cGU9InNlYXJjaCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0ubmluZSwgaW5wdXRbdHlwZT0idGVsIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5uaW5lLCBpbnB1dFt0eXBlPSJ0aW1lIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0ubmluZSwgaW5wdXRbdHlwZT0idXJsIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5uaW5lLCB0ZXh0YXJlYS5uaW5lLCAucm93IHRleHRhcmVhLm5pbmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnRlbiwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnRlbiwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50ZW4sIGlucHV0W3R5cGU9ImVtYWlsIl0udGVuLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udGVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udGVuLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udGVuLCBpbnB1dFt0eXBlPSJ0ZWwiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udGVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0udGVuLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS50ZW4sIGlucHV0W3R5cGU9InVybCJdLnRlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50ZW4sIHRleHRhcmVhLnRlbiwgLnJvdyB0ZXh0YXJlYS50ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLmVsZXZlbiwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5lbGV2ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLmVsZXZlbiwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5lbGV2ZW4sIGlucHV0W3R5cGU9ImVtYWlsIl0uZWxldmVuLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJzZWFyY2giXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJ0ZWwiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0uZWxldmVuLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS5lbGV2ZW4sIGlucHV0W3R5cGU9InVybCJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5lbGV2ZW4sIHRleHRhcmVhLmVsZXZlbiwgLnJvdyB0ZXh0YXJlYS5lbGV2ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d2VsdmUsIGlucHV0W3R5cGU9ImRhdGUiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d2VsdmUsIGlucHV0W3R5cGU9ImVtYWlsIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJ0ZWwiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJ0aW1lIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS50d2VsdmUsIGlucHV0W3R5cGU9InVybCJdLnR3ZWx2ZSwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50d2VsdmUsIHRleHRhcmVhLnR3ZWx2ZSwgLnJvdyB0ZXh0YXJlYS50d2VsdmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9IH0KKy8qIEN1c3RvbSBGb3JtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitmb3JtLmN1c3RvbSB7IC8qIEN1c3RvbSBpbnB1dCwgZGlzYWJsZWQgKi8gfQorZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20geyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAycHg7IGJvcmRlcjogc29saWQgMXB4ICNjY2M7IGJhY2tncm91bmQ6ICNmZmY7IH0KK2Zvcm0uY3VzdG9tIHNwYW4uY3VzdG9tLnJhZGlvIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtby1ib3JkZXItcmFkaXVzOiAxMDBweDsgYm9yZGVyLXJhZGl1czogMTAwcHg7IH0KK2Zvcm0uY3VzdG9tIHNwYW4uY3VzdG9tLmNoZWNrYm94OmJlZm9yZSB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgbGluZS1oZWlnaHQ6IDAuODsgaGVpZ2h0OiAxNHB4OyB3aWR0aDogMTRweDsgdGV4dC1hbGlnbjogY2VudGVyOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2ZmZjsgfQorZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20ucmFkaW8uY2hlY2tlZDpiZWZvcmUgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtbXMtYm9yZGVyLXJhZGl1czogMTAwcHg7IC1vLWJvcmRlci1yYWRpdXM6IDEwMHB4OyBib3JkZXItcmFkaXVzOiAxMDBweDsgYmFja2dyb3VuZDogIzIyMjsgcG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDNweDsgbGVmdDogM3B4OyB9Citmb3JtLmN1c3RvbSBzcGFuLmN1c3RvbS5jaGVja2JveC5jaGVja2VkOmJlZm9yZSB7IGNvbnRlbnQ6ICJcMDBkNyI7IGNvbG9yOiAjMjIyOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHsgZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IGF1dG87IGhlaWdodDogMjhweDsgbWFyZ2luLWJvdHRvbTogOXB4OyBtYXJnaW4tdG9wOiAycHg7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5jdXJyZW50IHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiBhdXRvOyBsaW5lLWhlaWdodDogMjZweDsgbWluLWhlaWdodDogMjhweDsgcGFkZGluZzogMDsgcGFkZGluZy1sZWZ0OiA2cHg7IHBhZGRpbmctcmlnaHQ6IDM4cHg7IGJvcmRlcjogc29saWQgMXB4ICNkZGQ7IGNvbG9yOiAjMTQxNDE0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3IgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAyN3B4OyBoZWlnaHQ6IDI4cHg7IGRpc3BsYXk6IGJsb2NrOyByaWdodDogMDsgdG9wOiAwOyBib3JkZXI6IHNvbGlkIDFweCAjZGRkOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3I6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA1cHg7IGJvcmRlci1jb2xvcjogI2FhYWFhYSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiA1MCU7IHRvcDogNTAlOyBtYXJnaW4tdG9wOiAtMnB4OyBtYXJnaW4tbGVmdDogLTVweDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bjpob3ZlciBhLnNlbGVjdG9yOmFmdGVyLCBmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4gYS5zZWxlY3RvcjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA1cHg7IGJvcmRlci1jb2xvcjogIzIyMjIyMiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuIHVsIHsgZGlzcGxheTogYmxvY2s7IHotaW5kZXg6IDEwOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLnNtYWxsIHsgd2lkdGg6IDEzNHB4ICFpbXBvcnRhbnQ7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ubWVkaXVtIHsgd2lkdGg6IDI1NHB4ICFpbXBvcnRhbnQ7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ubGFyZ2UgeyB3aWR0aDogNDM0cHggIWltcG9ydGFudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5leHBhbmQgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4uc21hbGwgdWwgeyB3aWR0aDogMTM0cHggIWltcG9ydGFudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLm1lZGl1bSB1bCB7IHdpZHRoOiAyNTRweCAhaW1wb3J0YW50OyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4ubGFyZ2UgdWwgeyB3aWR0aDogNDM0cHggIWltcG9ydGFudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLmV4cGFuZCB1bCB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiBhdXRvOyBkaXNwbGF5OiBub25lOyBtYXJnaW46IDA7IGxlZnQ6IDA7IHRvcDogMjdweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBiYWNrZ3JvdW5kOiAjZmZmOyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyBib3JkZXI6IHNvbGlkIDFweCAjY2NjY2NjOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpIHsgY29sb3I6ICM1NTU7IGZvbnQtc2l6ZTogMTNweDsgY3Vyc29yOiBwb2ludGVyOyBwYWRkaW5nOiAzcHg7IHBhZGRpbmctbGVmdDogNnB4OyBwYWRkaW5nLXJpZ2h0OiAzOHB4OyBtaW4taGVpZ2h0OiAxOHB4OyBsaW5lLWhlaWdodDogMThweDsgbWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBsaXN0LXN0eWxlOiBub25lOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpLnNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2NkZWJmNTsgY29sb3I6ICMwMDA7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGkuc2VsZWN0ZWQ6YWZ0ZXIgeyBjb250ZW50OiAiXDIwMTMiOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2UzZjRmOTsgY29sb3I6ICMyMjI7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGk6aG92ZXI6YWZ0ZXIgeyBjb250ZW50OiAiXDIwMTMiOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyBjb2xvcjogIzhlZDNlNzsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bCBsaS5zZWxlY3RlZDpob3ZlciB7IGJhY2tncm91bmQ6ICNjZGViZjU7IGN1cnNvcjogZGVmYXVsdDsgY29sb3I6ICMwMDA7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGkuc2VsZWN0ZWQ6aG92ZXI6YWZ0ZXIgeyBjb2xvcjogIzAwMDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bC5zaG93IHsgZGlzcGxheTogYmxvY2s7IH0KK2Zvcm0uY3VzdG9tIC5jdXN0b20uZGlzYWJsZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOyB9CisKKy8qIENvcnJlY3QgRkYgY3VzdG9tIGRyb3Bkb3duIGhlaWdodCAqLworQC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpIHsgZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biBhLnNlbGVjdG9yIHsgaGVpZ2h0OiAzMHB4OyB9IH0KKworLmx0LWllOSBmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3IgeyBoZWlnaHQ6IDMwcHg7IH0KKworLyogVGhlIEdyaWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLnJvdyB7IHdpZHRoOiAxMDAwcHg7IG1heC13aWR0aDogMTAwJTsgbWluLXdpZHRoOiA3NjhweDsgbWFyZ2luOiAwIGF1dG87IH0KKy5yb3cgLnJvdyB7IHdpZHRoOiBhdXRvOyBtYXgtd2lkdGg6IG5vbmU7IG1pbi13aWR0aDogMDsgbWFyZ2luOiAwIC0xNXB4OyB9Cisucm93LmNvbGxhcHNlIC5jb2x1bW4sIC5yb3cuY29sbGFwc2UgLmNvbHVtbnMgeyBwYWRkaW5nOiAwOyB9Cisucm93IC5yb3cgeyB3aWR0aDogYXV0bzsgbWF4LXdpZHRoOiBub25lOyBtaW4td2lkdGg6IDA7IG1hcmdpbjogMCAtMTVweDsgfQorLnJvdyAucm93LmNvbGxhcHNlIHsgbWFyZ2luOiAwOyB9CisKKy5jb2x1bW4sIC5jb2x1bW5zIHsgZmxvYXQ6IGxlZnQ7IG1pbi1oZWlnaHQ6IDFweDsgcGFkZGluZzogMCAxNXB4OyBwb3NpdGlvbjogcmVsYXRpdmU7IH0KKy5jb2x1bW4uY2VudGVyZWQsIC5jb2x1bW5zLmNlbnRlcmVkIHsgZmxvYXQ6IG5vbmU7IG1hcmdpbjogMCBhdXRvOyB9CisKK1tjbGFzcyo9ImNvbHVtbiJdICsgW2NsYXNzKj0iY29sdW1uIl06bGFzdC1jaGlsZCB7IGZsb2F0OiByaWdodDsgfQorCitbY2xhc3MqPSJjb2x1bW4iXSArIFtjbGFzcyo9ImNvbHVtbiJdLmVuZCB7IGZsb2F0OiBsZWZ0OyB9CisKKy5vbmUsIC5yb3cgLm9uZSB7IHdpZHRoOiA4LjMzMzMzJTsgfQorCisudHdvLCAucm93IC50d28geyB3aWR0aDogMTYuNjY2NjclOyB9CisKKy50aHJlZSwgLnJvdyAudGhyZWUgeyB3aWR0aDogMjUlOyB9CisKKy5mb3VyLCAucm93IC5mb3VyIHsgd2lkdGg6IDMzLjMzMzMzJTsgfQorCisuZml2ZSwgLnJvdyAuZml2ZSB7IHdpZHRoOiA0MS42NjY2NyU7IH0KKworLnNpeCwgLnJvdyAuc2l4IHsgd2lkdGg6IDUwJTsgfQorCisuc2V2ZW4sIC5yb3cgLnNldmVuIHsgd2lkdGg6IDU4LjMzMzMzJTsgfQorCisuZWlnaHQsIC5yb3cgLmVpZ2h0IHsgd2lkdGg6IDY2LjY2NjY3JTsgfQorCisubmluZSwgLnJvdyAubmluZSB7IHdpZHRoOiA3NSU7IH0KKworLnRlbiwgLnJvdyAudGVuIHsgd2lkdGg6IDgzLjMzMzMzJTsgfQorCisuZWxldmVuLCAucm93IC5lbGV2ZW4geyB3aWR0aDogOTEuNjY2NjclOyB9CisKKy50d2VsdmUsIC5yb3cgLnR3ZWx2ZSB7IHdpZHRoOiAxMDAlOyB9CisKKy5yb3cgLm9mZnNldC1ieS1vbmUgeyBtYXJnaW4tbGVmdDogOC4zMzMzMyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LXR3byB7IG1hcmdpbi1sZWZ0OiAxNi42NjY2NyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LXRocmVlIHsgbWFyZ2luLWxlZnQ6IDI1JTsgfQorCisucm93IC5vZmZzZXQtYnktZm91ciB7IG1hcmdpbi1sZWZ0OiAzMy4zMzMzMyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LWZpdmUgeyBtYXJnaW4tbGVmdDogNDEuNjY2NjclOyB9CisKKy5yb3cgLm9mZnNldC1ieS1zaXggeyBtYXJnaW4tbGVmdDogNTAlOyB9CisKKy5yb3cgLm9mZnNldC1ieS1zZXZlbiB7IG1hcmdpbi1sZWZ0OiA1OC4zMzMzMyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LWVpZ2h0IHsgbWFyZ2luLWxlZnQ6IDY2LjY2NjY3JTsgfQorCisucm93IC5vZmZzZXQtYnktbmluZSB7IG1hcmdpbi1sZWZ0OiA3NSU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LXRlbiB7IG1hcmdpbi1sZWZ0OiA4My4zMzMzMyU7IH0KKworLnB1c2gtdHdvIHsgbGVmdDogMTYuNjY2NjclOyB9CisKKy5wdWxsLXR3byB7IHJpZ2h0OiAxNi42NjY2NyU7IH0KKworLnB1c2gtdGhyZWUgeyBsZWZ0OiAyNSU7IH0KKworLnB1bGwtdGhyZWUgeyByaWdodDogMjUlOyB9CisKKy5wdXNoLWZvdXIgeyBsZWZ0OiAzMy4zMzMzMyU7IH0KKworLnB1bGwtZm91ciB7IHJpZ2h0OiAzMy4zMzMzMyU7IH0KKworLnB1c2gtZml2ZSB7IGxlZnQ6IDQxLjY2NjY3JTsgfQorCisucHVsbC1maXZlIHsgcmlnaHQ6IDQxLjY2NjY3JTsgfQorCisucHVzaC1zaXggeyBsZWZ0OiA1MCU7IH0KKworLnB1bGwtc2l4IHsgcmlnaHQ6IDUwJTsgfQorCisucHVzaC1zZXZlbiB7IGxlZnQ6IDU4LjMzMzMzJTsgfQorCisucHVsbC1zZXZlbiB7IHJpZ2h0OiA1OC4zMzMzMyU7IH0KKworLnB1c2gtZWlnaHQgeyBsZWZ0OiA2Ni42NjY2NyU7IH0KKworLnB1bGwtZWlnaHQgeyByaWdodDogNjYuNjY2NjclOyB9CisKKy5wdXNoLW5pbmUgeyBsZWZ0OiA3NSU7IH0KKworLnB1bGwtbmluZSB7IHJpZ2h0OiA3NSU7IH0KKworLnB1c2gtdGVuIHsgbGVmdDogODMuMzMzMzMlOyB9CisKKy5wdWxsLXRlbiB7IHJpZ2h0OiA4My4zMzMzMyU7IH0KKworaW1nLCBvYmplY3QsIGVtYmVkIHsgbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IH0KKworb2JqZWN0LCBlbWJlZCB7IGhlaWdodDogMTAwJTsgfQorCitpbWcgeyAtbXMtaW50ZXJwb2xhdGlvbi1tb2RlOiBiaWN1YmljOyB9CisKKyNtYXBfY2FudmFzIGltZywgLm1hcF9jYW52YXMgaW1nIHsgbWF4LXdpZHRoOiBub25lIWltcG9ydGFudDsgfQorCisvKiBOaWNvbGFzIEdhbGxhZ2hlcidzIG1pY3JvIGNsZWFyZml4ICovCisucm93IHsgKnpvb206IDE7IH0KKy5yb3c6YmVmb3JlLCAucm93OmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IHRhYmxlOyB9Cisucm93OmFmdGVyIHsgY2xlYXI6IGJvdGg7IH0KKworLyogTW9iaWxlIEdyaWQgYW5kIE92ZXJyaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IGJvZHkgeyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IG5vbmU7IC1tcy10ZXh0LXNpemUtYWRqdXN0OiBub25lOyB3aWR0aDogMTAwJTsgbWluLXdpZHRoOiAwOyBtYXJnaW4tbGVmdDogMDsgbWFyZ2luLXJpZ2h0OiAwOyBwYWRkaW5nLWxlZnQ6IDA7IHBhZGRpbmctcmlnaHQ6IDA7IH0KKyAgLnJvdyB7IHdpZHRoOiBhdXRvOyBtaW4td2lkdGg6IDA7IG1hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tcmlnaHQ6IDA7IH0KKyAgLmNvbHVtbiwgLmNvbHVtbnMgeyB3aWR0aDogYXV0byAhaW1wb3J0YW50OyBmbG9hdDogbm9uZTsgfQorICAuY29sdW1uOmxhc3QtY2hpbGQsIC5jb2x1bW5zOmxhc3QtY2hpbGQgeyBmbG9hdDogbm9uZTsgfQorICBbY2xhc3MqPSJjb2x1bW4iXSArIFtjbGFzcyo9ImNvbHVtbiJdOmxhc3QtY2hpbGQgeyBmbG9hdDogbm9uZTsgfQorICAuY29sdW1uOmJlZm9yZSwgLmNvbHVtbnM6YmVmb3JlLCAuY29sdW1uOmFmdGVyLCAuY29sdW1uczphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiB0YWJsZTsgfQorICAuY29sdW1uOmFmdGVyLCAuY29sdW1uczphZnRlciB7IGNsZWFyOiBib3RoOyB9CisgIC5vZmZzZXQtYnktb25lLCAub2Zmc2V0LWJ5LXR3bywgLm9mZnNldC1ieS10aHJlZSwgLm9mZnNldC1ieS1mb3VyLCAub2Zmc2V0LWJ5LWZpdmUsIC5vZmZzZXQtYnktc2l4LCAub2Zmc2V0LWJ5LXNldmVuLCAub2Zmc2V0LWJ5LWVpZ2h0LCAub2Zmc2V0LWJ5LW5pbmUsIC5vZmZzZXQtYnktdGVuIHsgbWFyZ2luLWxlZnQ6IDAgIWltcG9ydGFudDsgfQorICAucHVzaC10d28sIC5wdXNoLXRocmVlLCAucHVzaC1mb3VyLCAucHVzaC1maXZlLCAucHVzaC1zaXgsIC5wdXNoLXNldmVuLCAucHVzaC1laWdodCwgLnB1c2gtbmluZSwgLnB1c2gtdGVuIHsgbGVmdDogYXV0bzsgfQorICAucHVsbC10d28sIC5wdWxsLXRocmVlLCAucHVsbC1mb3VyLCAucHVsbC1maXZlLCAucHVsbC1zaXgsIC5wdWxsLXNldmVuLCAucHVsbC1laWdodCwgLnB1bGwtbmluZSwgLnB1bGwtdGVuIHsgcmlnaHQ6IGF1dG87IH0KKyAgLyogTW9iaWxlIDQtY29sdW1uIEdyaWQgKi8KKyAgLnJvdyAubW9iaWxlLW9uZSB7IHdpZHRoOiAyNSUgIWltcG9ydGFudDsgZmxvYXQ6IGxlZnQ7IHBhZGRpbmc6IDAgMTVweDsgfQorICAucm93IC5tb2JpbGUtb25lOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KKyAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLW9uZSB7IHBhZGRpbmc6IDA7IH0KKyAgLnJvdyAubW9iaWxlLXR3byB7IHdpZHRoOiA1MCUgIWltcG9ydGFudDsgZmxvYXQ6IGxlZnQ7IHBhZGRpbmc6IDAgMTVweDsgfQorICAucm93IC5tb2JpbGUtdHdvOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KKyAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLXR3byB7IHBhZGRpbmc6IDA7IH0KKyAgLnJvdyAubW9iaWxlLXRocmVlIHsgd2lkdGg6IDc1JSAhaW1wb3J0YW50OyBmbG9hdDogbGVmdDsgcGFkZGluZzogMCAxNXB4OyB9CisgIC5yb3cgLm1vYmlsZS10aHJlZTpsYXN0LWNoaWxkIHsgZmxvYXQ6IHJpZ2h0OyB9CisgIC5yb3cuY29sbGFwc2UgLm1vYmlsZS10aHJlZSB7IHBhZGRpbmc6IDA7IH0KKyAgLnJvdyAubW9iaWxlLWZvdXIgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBmbG9hdDogbGVmdDsgcGFkZGluZzogMCAxNXB4OyB9CisgIC5yb3cgLm1vYmlsZS1mb3VyOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KKyAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLWZvdXIgeyBwYWRkaW5nOiAwOyB9CisgIC5wdXNoLW9uZS1tb2JpbGUgeyBsZWZ0OiAyNSU7IH0KKyAgLnB1bGwtb25lLW1vYmlsZSB7IHJpZ2h0OiAyNSU7IH0KKyAgLnB1c2gtdHdvLW1vYmlsZSB7IGxlZnQ6IDUwJTsgfQorICAucHVsbC10d28tbW9iaWxlIHsgcmlnaHQ6IDUwJTsgfQorICAucHVzaC10aHJlZS1tb2JpbGUgeyBsZWZ0OiA3NSU7IH0KKyAgLnB1bGwtdGhyZWUtbW9iaWxlIHsgcmlnaHQ6IDc1JTsgfSB9CisvKiBCbG9jayBHcmlkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGVzZSBhcmUgMi11cCwgMy11cCwgNC11cCBhbmQgNS11cCBVTHMsIHN1aXRlZAorZm9yIHJlcGVhdGluZyBibG9ja3Mgb2YgY29udGVudC4gQWRkICdtb2JpbGUnIHRvCit0aGVtIHRvIHN3aXRjaCB0aGVtIGp1c3QgbGlrZSB0aGUgbGF5b3V0IGdyaWQKKyhvbmUgaXRlbSBwZXIgbGluZSkgb24gcGhvbmVzCisKK0ZvciBJRTcvOCBjb21wYXRpYmlsaXR5IGJsb2NrLWdyaWQgaXRlbXMgbmVlZCB0byBiZQordGhlIHNhbWUgaGVpZ2h0LiBZb3UgY2FuIG9wdGlvbmFsbHkgdW5jb21tZW50IHRoZQorbGluZXMgYmVsb3cgdG8gc3VwcG9ydCBhcmJpdHJhcnkgaGVpZ2h0LCBidXQga25vdwordGhhdCBJRTcvOCBkbyBub3Qgc3VwcG9ydCA6bnRoLWNoaWxkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5ibG9jay1ncmlkIHsgZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHBhZGRpbmc6IDA7IH0KKy5ibG9jay1ncmlkID4gbGkgeyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiBhdXRvOyBmbG9hdDogbGVmdDsgfQorLmJsb2NrLWdyaWQub25lLXVwIHsgbWFyZ2luOiAwOyB9CisuYmxvY2stZ3JpZC5vbmUtdXAgPiBsaSB7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwIDAgMTVweDsgfQorLmJsb2NrLWdyaWQudHdvLXVwIHsgbWFyZ2luOiAwIC0xNXB4OyB9CisuYmxvY2stZ3JpZC50d28tdXAgPiBsaSB7IHdpZHRoOiA1MCU7IHBhZGRpbmc6IDAgMTVweCAxNXB4OyB9CisuYmxvY2stZ3JpZC50d28tdXAgPiBsaTpudGgtY2hpbGQoMm4rMSkgeyBjbGVhcjogYm90aDsgfQorLmJsb2NrLWdyaWQudGhyZWUtdXAgeyBtYXJnaW46IDAgLTEycHg7IH0KKy5ibG9jay1ncmlkLnRocmVlLXVwID4gbGkgeyB3aWR0aDogMzMuMzMlOyBwYWRkaW5nOiAwIDEycHggMTJweDsgfQorLmJsb2NrLWdyaWQudGhyZWUtdXAgPiBsaTpudGgtY2hpbGQoM24rMSkgeyBjbGVhcjogYm90aDsgfQorLmJsb2NrLWdyaWQuZm91ci11cCB7IG1hcmdpbjogMCAtMTBweDsgfQorLmJsb2NrLWdyaWQuZm91ci11cCA+IGxpIHsgd2lkdGg6IDI1JTsgcGFkZGluZzogMCAxMHB4IDEwcHg7IH0KKy5ibG9jay1ncmlkLmZvdXItdXAgPiBsaTpudGgtY2hpbGQoNG4rMSkgeyBjbGVhcjogYm90aDsgfQorLmJsb2NrLWdyaWQuZml2ZS11cCB7IG1hcmdpbjogMCAtOHB4OyB9CisuYmxvY2stZ3JpZC5maXZlLXVwID4gbGkgeyB3aWR0aDogMjAlOyBwYWRkaW5nOiAwIDhweCA4cHg7IH0KKy5ibG9jay1ncmlkLmZpdmUtdXAgPiBsaTpudGgtY2hpbGQoNW4rMSkgeyBjbGVhcjogYm90aDsgfQorCisvKiBNb2JpbGUgQmxvY2sgR3JpZHMgKi8KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsgLmJsb2NrLWdyaWQubW9iaWxlID4gbGkgeyBmbG9hdDogbm9uZTsgd2lkdGg6IDEwMCU7IG1hcmdpbi1sZWZ0OiAwOyB9CisgIC5ibG9jay1ncmlkID4gbGkgeyBjbGVhcjogbm9uZSAhaW1wb3J0YW50OyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS10d28tdXAgPiBsaSB7IHdpZHRoOiA1MCU7IH0KKyAgLmJsb2NrLWdyaWQubW9iaWxlLXR3by11cCA+IGxpOm50aC1jaGlsZCgybisxKSB7IGNsZWFyOiBib3RoOyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS10aHJlZS11cCA+IGxpIHsgd2lkdGg6IDMzLjMzJTsgfQorICAuYmxvY2stZ3JpZC5tb2JpbGUtdGhyZWUtdXAgPiBsaTpudGgtY2hpbGQoM24rMSkgeyBjbGVhcjogYm90aCAhaW1wb3J0YW50OyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS1mb3VyLXVwID4gbGkgeyB3aWR0aDogMjUlOyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS1mb3VyLXVwID4gbGk6bnRoLWNoaWxkKDRuKzEpIHsgY2xlYXI6IGJvdGg7IH0KKyAgLmJsb2NrLWdyaWQubW9iaWxlLWZpdmUtdXAgPiBsaTpudGgtY2hpbGQoNW4rMSkgeyBjbGVhcjogYm90aDsgfSB9CisvKiBSZXF1aXJlcyBnbG9iYWxzLmNzcyAqLworLyogTm9ybWFsIEJ1dHRvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLmJ1dHRvbiB7IHdpZHRoOiBhdXRvOyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyBib3JkZXI6IDFweCBzb2xpZCAjY2U2MjAwOyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBsaW5lLWhlaWdodDogMTsgbWFyZ2luOiAwOyBvdXRsaW5lOiBub25lOyBwYWRkaW5nOiAxMHB4IDIwcHggMTFweDsgcG9zaXRpb246IHJlbGF0aXZlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtbW96LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IC8qIEhvdmVycyAqLyAvKiBTaXplcyAqLyAvKiBDb2xvcnMgKi8gLyogUmFkaWkgKi8gLyogTGF5b3V0ICovIC8qIERpc2FibGVkIC0tLS0tLS0tLS0gKi8gfQorLmJ1dHRvbjpob3ZlciB7IGNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogI2NlNjIwMDsgfQorLmJ1dHRvbjphY3RpdmUgeyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpIGluc2V0OyBib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSBpbnNldDsgfQorLmJ1dHRvbjpmb2N1cyB7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDRweCAjZmQ3ODAwLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLW1vei1ib3gtc2hhZG93OiAwIDAgNHB4ICNmZDc4MDAsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDAgNHB4ICNmZDc4MDAsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBjb2xvcjogd2hpdGU7IH0KKy5idXR0b24ubGFyZ2UgeyBmb250LXNpemU6IDE3cHg7IHBhZGRpbmc6IDE1cHggMzBweCAxNnB4OyB9CisuYnV0dG9uLm1lZGl1bSB7IGZvbnQtc2l6ZTogMTRweDsgfQorLmJ1dHRvbi5zbWFsbCB7IGZvbnQtc2l6ZTogMTFweDsgcGFkZGluZzogN3B4IDE0cHggOHB4OyB9CisuYnV0dG9uLnRpbnkgeyBmb250LXNpemU6IDEwcHg7IHBhZGRpbmc6IDVweCAxMHB4IDZweDsgfQorLmJ1dHRvbi5leHBhbmQgeyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyB9CisuYnV0dG9uLnByaW1hcnkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQ3ODAwOyBib3JkZXI6IDFweCBzb2xpZCAjMWU3MjhjOyB9CisuYnV0dG9uLnByaW1hcnk6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjI4NGExOyB9CisuYnV0dG9uLnByaW1hcnk6Zm9jdXMgeyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA0cHggI2ZkNzgwMCwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IC1tb3otYm94LXNoYWRvdzogMCAwIDRweCAjZmQ3ODAwLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgYm94LXNoYWRvdzogMCAwIDRweCAjZmQ3ODAwLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgfQorLmJ1dHRvbi5zdWNjZXNzIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgYm9yZGVyOiAxcHggc29saWQgIzM5NjUxNjsgfQorLmJ1dHRvbi5zdWNjZXNzOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzQ1N2ExYTsgfQorLmJ1dHRvbi5zdWNjZXNzOmZvY3VzIHsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNXB4ICM1ZGE0MjMsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMCA1cHggIzVkYTQyMywgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IGJveC1zaGFkb3c6IDAgMCA1cHggIzVkYTQyMywgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IH0KKy5idXR0b24uYWxlcnQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzYwZjEzOyBib3JkZXI6IDFweCBzb2xpZCAjN2YwYTBjOyB9CisuYnV0dG9uLmFsZXJ0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzk3MGIwZTsgfQorLmJ1dHRvbi5hbGVydDpmb2N1cyB7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDRweCAjYzYwZjEzLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLW1vei1ib3gtc2hhZG93OiAwIDAgNHB4ICNjNjBmMTMsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDAgNHB4ICNjNjBmMTMsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyB9CisuYnV0dG9uLnNlY29uZGFyeSB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IGNvbG9yOiAjMWQxZDFkOyBib3JkZXI6IDFweCBzb2xpZCAjYzNjM2MzOyB9CisuYnV0dG9uLnNlY29uZGFyeTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7IH0KKy5idXR0b24uc2Vjb25kYXJ5OmZvY3VzIHsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNXB4ICNlOWU5ZTksIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMCA1cHggI2U5ZTllOSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IGJveC1zaGFkb3c6IDAgMCA1cHggI2U5ZTllOSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IH0KKy5idXR0b24ucmFkaXVzIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyAtbXMtYm9yZGVyLXJhZGl1czogM3B4OyAtby1ib3JkZXItcmFkaXVzOiAzcHg7IGJvcmRlci1yYWRpdXM6IDNweDsgfQorLmJ1dHRvbi5yb3VuZCB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW8tYm9yZGVyLXJhZGl1czogMTAwMHB4OyBib3JkZXItcmFkaXVzOiAxMDAwcHg7IH0KKy5idXR0b24uZnVsbC13aWR0aCB7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7IHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50OyB9CisuYnV0dG9uLmxlZnQtYWxpZ24geyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMTJweDsgfQorLmJ1dHRvbi5kaXNhYmxlZCwgLmJ1dHRvbltkaXNhYmxlZF0geyBvcGFjaXR5OiAwLjY7IGN1cnNvcjogZGVmYXVsdDsgYmFja2dyb3VuZDogI2ZkNzgwMDsgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOyAtbW96LWJveC1zaGFkb3c6IG5vbmU7IGJveC1zaGFkb3c6IG5vbmU7IH0KKy5idXR0b24uZGlzYWJsZWQgOmhvdmVyLCAuYnV0dG9uW2Rpc2FibGVkXSA6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyB9CisuYnV0dG9uLmRpc2FibGVkLnN1Y2Nlc3MsIC5idXR0b25bZGlzYWJsZWRdLnN1Y2Nlc3MgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWRhNDIzOyB9CisuYnV0dG9uLmRpc2FibGVkLnN1Y2Nlc3M6aG92ZXIsIC5idXR0b25bZGlzYWJsZWRdLnN1Y2Nlc3M6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWRhNDIzOyB9CisuYnV0dG9uLmRpc2FibGVkLmFsZXJ0LCAuYnV0dG9uW2Rpc2FibGVkXS5hbGVydCB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IH0KKy5idXR0b24uZGlzYWJsZWQuYWxlcnQ6aG92ZXIsIC5idXR0b25bZGlzYWJsZWRdLmFsZXJ0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2M2MGYxMzsgfQorLmJ1dHRvbi5kaXNhYmxlZC5zZWNvbmRhcnksIC5idXR0b25bZGlzYWJsZWRdLnNlY29uZGFyeSB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IH0KKy5idXR0b24uZGlzYWJsZWQuc2Vjb25kYXJ5OmhvdmVyLCAuYnV0dG9uW2Rpc2FibGVkXS5zZWNvbmRhcnk6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OyB9CisKKy8qIERvbid0IHVzZSBuYXRpdmUgYnV0dG9ucyBvbiBpT1MgKi8KK2lucHV0W3R5cGU9c3VibWl0XS5idXR0b24sIGJ1dHRvbi5idXR0b24geyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAuYnV0dG9uIHsgZGlzcGxheTogYmxvY2s7IH0KKyAgYnV0dG9uLmJ1dHRvbiwgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uIHsgd2lkdGg6IDEwMCU7IHBhZGRpbmctbGVmdDogMDsgcGFkZGluZy1yaWdodDogMDsgfSB9CisvKiBDb3JyZWN0IEZGIGJ1dHRvbiBwYWRkaW5nICovCitALW1vei1kb2N1bWVudCB1cmwtcHJlZml4KCkgeyBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsIGlucHV0W3R5cGU9InJlc2V0Il06Oi1tb3otZm9jdXMtaW5uZXIsIGlucHV0W3R5cGU9ImJ1dHRvbiJdOjotbW96LWZvY3VzLWlubmVyLCBpbnB1dFt0eXBlPSJzdWJtaXQiXTo6LW1vei1mb2N1cy1pbm5lciwgaW5wdXRbdHlwZT0iZmlsZSJdID4gaW5wdXRbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIgeyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDA7IH0KKyAgaW5wdXRbdHlwZT0ic3VibWl0Il0udGlueS5idXR0b24geyBwYWRkaW5nOiAzcHggMTBweCA0cHg7IH0KKyAgaW5wdXRbdHlwZT0ic3VibWl0Il0uc21hbGwuYnV0dG9uIHsgcGFkZGluZzogNXB4IDE0cHggNnB4OyB9CisgIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbiwgaW5wdXRbdHlwZT1zdWJtaXRdLm1lZGl1bS5idXR0b24geyBwYWRkaW5nOiA4cHggMjBweCA5cHg7IH0KKyAgaW5wdXRbdHlwZT0ic3VibWl0Il0ubGFyZ2UuYnV0dG9uIHsgcGFkZGluZzogMTNweCAzMHB4IDE0cHg7IH0gfQorCisvKiBCdXR0b25zIHdpdGggRHJvcGRvd25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5idXR0b24uZHJvcGRvd24geyBwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmctcmlnaHQ6IDQ0cHg7IC8qIFNpemVzICovIC8qIFRyaWFuZ2xlcyAqLyAvKiBGbHlvdXQgTGlzdCAqLyAvKiBTcGxpdCBEcm9wZG93biBCdXR0b25zICovIH0KKy5idXR0b24uZHJvcGRvd24ubGFyZ2UgeyBwYWRkaW5nLXJpZ2h0OiA2MHB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNtYWxsIHsgcGFkZGluZy1yaWdodDogMjhweDsgfQorLmJ1dHRvbi5kcm9wZG93bi50aW55IHsgcGFkZGluZy1yaWdodDogMjBweDsgfQorLmJ1dHRvbi5kcm9wZG93bjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA2cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MCU7IHJpZ2h0OiAyMHB4OyBtYXJnaW4tdG9wOiAtMnB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLmxhcmdlOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDdweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTNweDsgcmlnaHQ6IDMwcHg7IH0KKy5idXR0b24uZHJvcGRvd24uc21hbGw6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNXB4OyBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBtYXJnaW4tdG9wOiAtMnB4OyByaWdodDogMTRweDsgfQorLmJ1dHRvbi5kcm9wZG93bi50aW55OmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDRweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTFweDsgcmlnaHQ6IDEwcHg7IH0KKy5idXR0b24uZHJvcGRvd24gPiB1bCB7IC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7IC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7IGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyBkaXNwbGF5OiBub25lOyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IC0xcHg7IGJhY2tncm91bmQ6ICNmZmY7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsgYm9yZGVyLXRvcDogbm9uZTsgbWluLXdpZHRoOiAxMDAlOyB6LWluZGV4OiA0MDsgfQorLmJ1dHRvbi5kcm9wZG93biA+IHVsIGxpIHsgd2lkdGg6IDEwMCU7IGN1cnNvcjogcG9pbnRlcjsgcGFkZGluZzogMDsgbWluLWhlaWdodDogMThweDsgbGluZS1oZWlnaHQ6IDE4cHg7IG1hcmdpbjogMDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgbGlzdC1zdHlsZTogbm9uZTsgfQorLmJ1dHRvbi5kcm9wZG93biA+IHVsIGxpIGEgeyBkaXNwbGF5OiBibG9jazsgY29sb3I6ICM1NTU7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgcGFkZGluZzogNnB4IDE0cHg7IHRleHQtYWxpZ246IGxlZnQ7IH0KKy5idXR0b24uZHJvcGRvd24gPiB1bCBsaTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNlM2Y0Zjk7IGNvbG9yOiAjMjIyOyB9CisuYnV0dG9uLmRyb3Bkb3duID4gdWwgbGkuZGl2aWRlciB7IG1pbi1oZWlnaHQ6IDA7IHBhZGRpbmc6IDA7IGhlaWdodDogMXB4OyBtYXJnaW46IDRweCAwOyBiYWNrZ3JvdW5kOiAjZWRlZGVkOyB9CisuYnV0dG9uLmRyb3Bkb3duLnVwID4gdWwgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTogbm9uZTsgfQorLmJ1dHRvbi5kcm9wZG93biB1bC5uby1ob3Zlci5zaG93LWRyb3Bkb3duIHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorLmJ1dHRvbi5kcm9wZG93bjpob3ZlciA+IHVsLm5vLWhvdmVyIHsgZGlzcGxheTogbm9uZTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCB7IHBhZGRpbmc6IDA7IHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogU2l6ZXMgKi8gLyogVHJpYW5nbGUgU3BhbnMgKi8gLyogQ29sb3JzICovIH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQ6YWZ0ZXIgeyBkaXNwbGF5OiBub25lOyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZkNzgwMDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydDpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2Vzczpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICM1ZGE0MjM7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCA+IGEgeyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAxMHB4IDUwcHggMTFweCAyMHB4OyBwYWRkaW5nLWxlZnQ6IDIwcHg7IHBhZGRpbmctcmlnaHQ6IDUwcHg7IC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDsgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0ID4gYTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICMyMjg0YTE7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQubGFyZ2UgPiBhIHsgcGFkZGluZzogMTVweCA3NXB4IDE2cHggMzBweDsgcGFkZGluZy1sZWZ0OiAzMHB4OyBwYWRkaW5nLXJpZ2h0OiA3NXB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNtYWxsID4gYSB7IHBhZGRpbmc6IDdweCAzNXB4IDhweCAxNHB4OyBwYWRkaW5nLWxlZnQ6IDE0cHg7IHBhZGRpbmctcmlnaHQ6IDM1cHg7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQudGlueSA+IGEgeyBwYWRkaW5nOiA1cHggMjVweCA2cHggMTBweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyBwYWRkaW5nLXJpZ2h0OiAyNXB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0ID4gc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNmZDc4MDA7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDA7IHRvcDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMzBweDsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjMWU3MjhjOyAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgYm94LXNoYWRvdzogMXB4IDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtbW96LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQgPiBzcGFuOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzIyODRhMTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCA+IHNwYW46YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IG1hcmdpbi1sZWZ0OiAtNnB4OyBtYXJnaW4tdG9wOiAtMnB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeSA+IHNwYW46YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6ICMxZDFkMWQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQubGFyZ2Ugc3BhbiB7IHdpZHRoOiA0NXB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNtYWxsIHNwYW4geyB3aWR0aDogMjFweDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC50aW55IHNwYW4geyB3aWR0aDogMTVweDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5sYXJnZSBzcGFuOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDdweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTNweDsgbWFyZ2luLWxlZnQ6IC03cHg7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc21hbGwgc3BhbjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA0cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0xcHg7IG1hcmdpbi1sZWZ0OiAtNHB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnRpbnkgc3BhbjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCAzcHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0xcHg7IG1hcmdpbi1sZWZ0OiAtM3B4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmFsZXJ0ID4gc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IGJvcmRlci1sZWZ0LWNvbG9yOiAjN2YwYTBjOyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnN1Y2Nlc3MgPiBzcGFuIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgYm9yZGVyLWxlZnQtY29sb3I6ICMzOTY1MTY7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5ID4gc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IGJvcmRlci1sZWZ0LWNvbG9yOiAjYzNjM2MzOyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeSA+IGEgeyBjb2xvcjogIzFkMWQxZDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydCA+IGE6aG92ZXIsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuYWxlcnQgPiBzcGFuOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzk3MGIwZTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzID4gYTpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzID4gc3Bhbjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICM0NTdhMWE7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5ID4gYTpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnkgPiBzcGFuOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDsgfQorCisvKiBCdXR0b24gR3JvdXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VsLmJ1dHRvbi1ncm91cCB7IGxpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjogMCAwIDEycHg7ICp6b29tOiAxOyB9Cit1bC5idXR0b24tZ3JvdXA6YmVmb3JlLCB1bC5idXR0b24tZ3JvdXA6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogdGFibGU7IH0KK3VsLmJ1dHRvbi1ncm91cDphZnRlciB7IGNsZWFyOiBib3RoOyB9Cit1bC5idXR0b24tZ3JvdXAgbGkgeyBwYWRkaW5nOiAwOyBtYXJnaW46IDAgMCAwIC0xcHg7IGZsb2F0OiBsZWZ0OyB9Cit1bC5idXR0b24tZ3JvdXAgbGk6Zmlyc3QtY2hpbGQgeyBtYXJnaW4tbGVmdDogMDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaSBhLmJ1dHRvbiwgdWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaSBhLmJ1dHRvbi5yYWRpdXMsIHVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGkgYS5idXR0b24tcm91bmRlZCB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDBweDsgLW8tYm9yZGVyLXJhZGl1czogMHB4OyBib3JkZXItcmFkaXVzOiAwcHg7IH0KK3VsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGk6Zmlyc3QtY2hpbGQgYS5idXR0b24sIHVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGk6Zmlyc3QtY2hpbGQgYS5idXR0b24ucmFkaXVzIHsgLW1vei1ib3JkZXItcmFkaXVzLWxlZnQzcHg6IDVweDsgLXdlYmtpdC1ib3JkZXItbGVmdC0zcHgtcmFkaXVzOiA1cHg7IGJvcmRlci1sZWZ0LTNweC1yYWRpdXM6IDVweDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpmaXJzdC1jaGlsZCBhLmJ1dHRvbi5yb3VuZGVkIHsgLW1vei1ib3JkZXItcmFkaXVzLWxlZnQxMDAwcHg6IDVweDsgLXdlYmtpdC1ib3JkZXItbGVmdC0xMDAwcHgtcmFkaXVzOiA1cHg7IGJvcmRlci1sZWZ0LTEwMDBweC1yYWRpdXM6IDVweDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIGEuYnV0dG9uLCB1bC5idXR0b24tZ3JvdXAucmFkaXVzIGxpOmxhc3QtY2hpbGQgYS5idXR0b24ucmFkaXVzIHsgLW1vei1ib3JkZXItcmFkaXVzLXJpZ2h0M3B4OiA1cHg7IC13ZWJraXQtYm9yZGVyLXJpZ2h0LTNweC1yYWRpdXM6IDVweDsgYm9yZGVyLXJpZ2h0LTNweC1yYWRpdXM6IDVweDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIGEuYnV0dG9uLnJvdW5kZWQgeyAtbW96LWJvcmRlci1yYWRpdXMtcmlnaHQxMDAwcHg6IDVweDsgLXdlYmtpdC1ib3JkZXItcmlnaHQtMTAwMHB4LXJhZGl1czogNXB4OyBib3JkZXItcmlnaHQtMTAwMHB4LXJhZGl1czogNXB4OyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbiBhLmJ1dHRvbiB7IHdpZHRoOiAxMDAlOyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbi50d28tdXAgbGkgeyB3aWR0aDogNTAlOyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbi50aHJlZS11cCBsaSB7IHdpZHRoOiAzMy4zJTsgfQordWwuYnV0dG9uLWdyb3VwLmV2ZW4udGhyZWUtdXAgbGk6Zmlyc3QtY2hpbGQgeyB3aWR0aDogMzMuNCU7IH0KK3VsLmJ1dHRvbi1ncm91cC5ldmVuLmZvdXItdXAgbGkgeyB3aWR0aDogMjUlOyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbi5maXZlLXVwIGxpIHsgd2lkdGg6IDIwJTsgfQorCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IC5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbiwgLmJ1dHRvbi1ncm91cCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24geyB3aWR0aDogYXV0bzsgcGFkZGluZzogMTBweCAyMHB4IDExcHg7IH0KKyAgLmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLmxhcmdlLCAuYnV0dG9uLWdyb3VwIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbi5sYXJnZSB7IHBhZGRpbmc6IDE1cHggMzBweCAxNnB4OyB9CisgIC5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbi5tZWRpdW0sIC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLm1lZGl1bSB7IHBhZGRpbmc6IDEwcHggMjBweCAxMXB4OyB9CisgIC5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbi5zbWFsbCwgLmJ1dHRvbi1ncm91cCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24uc21hbGwgeyBwYWRkaW5nOiA3cHggMTRweCA4cHg7IH0KKyAgLmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLnRpbnksIC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLnRpbnkgeyBwYWRkaW5nOiA1cHggMTBweCA2cHg7IH0KKyAgLmJ1dHRvbi1ncm91cC5ldmVuIGJ1dHRvbi5idXR0b24sIC5idXR0b24tZ3JvdXAuZXZlbiBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24geyB3aWR0aDogMTAwJTsgcGFkZGluZy1sZWZ0OiAwOyBwYWRkaW5nLXJpZ2h0OiAwOyB9IH0KK2Rpdi5idXR0b24tYmFyIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfQorZGl2LmJ1dHRvbi1iYXIgdWwuYnV0dG9uLWdyb3VwIHsgZmxvYXQ6IGxlZnQ7IG1hcmdpbi1yaWdodDogOHB4OyB9CitkaXYuYnV0dG9uLWJhciB1bC5idXR0b24tZ3JvdXA6bGFzdC1jaGlsZCB7IG1hcmdpbi1sZWZ0OiAwOyB9CisKKy8qIENTUyBmb3IgalF1ZXJ5IFJldmVhbCBQbHVnaW4gTWFpbnRhaW5lZCBmb3IgRm91bmRhdGlvbi4gZm91bmRhdGlvbi56dXJiLmNvbSBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwICovCisvKiBSZXZlYWwgTW9kYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5yZXZlYWwtbW9kYWwtYmcgeyBwb3NpdGlvbjogZml4ZWQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICMwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40NSk7IHotaW5kZXg6IDQwOyBkaXNwbGF5OiBub25lOyB0b3A6IDA7IGxlZnQ6IDA7IH0KKworLnJldmVhbC1tb2RhbCB7IGJhY2tncm91bmQ6IHdoaXRlOyB2aXNpYmlsaXR5OiBoaWRkZW47IGRpc3BsYXk6IG5vbmU7IHRvcDogMTAwcHg7IGxlZnQ6IDUwJTsgbWFyZ2luLWxlZnQ6IC0yNjBweDsgd2lkdGg6IDUyMHB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDQxOyBwYWRkaW5nOiAzMHB4OyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuNCk7IGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsgfQorLnJldmVhbC1tb2RhbCAqOmZpcnN0LWNoaWxkIHsgbWFyZ2luLXRvcDogMDsgfQorLnJldmVhbC1tb2RhbCAqOmxhc3QtY2hpbGQgeyBtYXJnaW4tYm90dG9tOiAwOyB9CisucmV2ZWFsLW1vZGFsIC5jbG9zZS1yZXZlYWwtbW9kYWwgeyBmb250LXNpemU6IDIycHg7IGZvbnQtc2l6ZTogMi4ycmVtOyBsaW5lLWhlaWdodDogLjU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA4cHg7IHJpZ2h0OiAxMXB4OyBjb2xvcjogI2FhYTsgdGV4dC1zaGFkb3c6IDAgLTFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjYpOyBmb250LXdlaWdodDogYm9sZDsgY3Vyc29yOiBwb2ludGVyOyB9CisucmV2ZWFsLW1vZGFsLnNtYWxsIHsgd2lkdGg6IDMwJTsgbWFyZ2luLWxlZnQ6IC0xNSU7IH0KKy5yZXZlYWwtbW9kYWwubWVkaXVtIHsgd2lkdGg6IDQwJTsgbWFyZ2luLWxlZnQ6IC0yMCU7IH0KKy5yZXZlYWwtbW9kYWwubGFyZ2UgeyB3aWR0aDogNjAlOyBtYXJnaW4tbGVmdDogLTMwJTsgfQorLnJldmVhbC1tb2RhbC54bGFyZ2UgeyB3aWR0aDogNzAlOyBtYXJnaW4tbGVmdDogLTM1JTsgfQorLnJldmVhbC1tb2RhbC5leHBhbmQgeyB3aWR0aDogOTAlOyBtYXJnaW4tbGVmdDogLTQ1JTsgfQorLnJldmVhbC1tb2RhbCAucm93IHsgbWluLXdpZHRoOiAwOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CisKKy8qIE1vYmlsZSAqLworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAucmV2ZWFsLW1vZGFsLWJnIHsgcG9zaXRpb246IGFic29sdXRlOyB9CisgIC5yZXZlYWwtbW9kYWwsIC5yZXZlYWwtbW9kYWwuc21hbGwsIC5yZXZlYWwtbW9kYWwubWVkaXVtLCAucmV2ZWFsLW1vZGFsLmxhcmdlLCAucmV2ZWFsLW1vZGFsLnhsYXJnZSB7IHdpZHRoOiA4MCU7IHRvcDogMTVweDsgbGVmdDogNTAlOyBtYXJnaW4tbGVmdDogLTQwJTsgcGFkZGluZzogMjBweDsgaGVpZ2h0OiBhdXRvOyB9IH0KKyAgLyogTk9URVMgQ2xvc2UgYnV0dG9uIGVudGl0eSBpcyAmIzIxNTsKKyBFeGFtcGxlIG1hcmt1cCA8ZGl2IGlkPSJteU1vZGFsIiBjbGFzcz0icmV2ZWFsLW1vZGFsIj4gPGgyPkF3ZXNvbWUuIEkgaGF2ZSBpdC48L2gyPiA8cCBjbGFzcz0ibGVhZCI+WW91ciBjb3VjaC4gIEkgaXQncyBtaW5lLjwvcD4gPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gSW4gdWx0cmljZXMgYWxpcXVldCBwbGFjZXJhdC4gRHVpcyBwdWx2aW5hciBvcmNpIGV0IG5pc2kgZXVpc21vZCB2aXRhZSB0ZW1wdXMgbG9yZW0gY29uc2VjdGV0dXIuIER1aXMgYXQgbWFnbmEgcXVpcyB0dXJwaXMgbWF0dGlzIHZlbmVuYXRpcyBlZ2V0IGlkIGRpYW0uIDwvcD4gPGEgY2xhc3M9ImNsb3NlLXJldmVhbC1tb2RhbCI+JiMyMTU7PC9hPiA8L2Rpdj4gKi8KKy8qIFJlcXVpcmVzIC1nbG9iYWxzLmNzcyAtYXBwLmpzICovCisvKiBUYWJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2RsLnRhYnMgeyBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2U2ZTZlNjsgZGlzcGxheTogYmxvY2s7IGhlaWdodDogNDBweDsgcGFkZGluZzogMDsgbWFyZ2luLWJvdHRvbTogMjBweDsgfQorZGwudGFicy5jb250YWluZWQgeyBtYXJnaW4tYm90dG9tOiAwOyB9CitkbC50YWJzIGR0IHsgY29sb3I6ICNiM2IzYjM7IGN1cnNvcjogZGVmYXVsdDsgZGlzcGxheTogYmxvY2s7IGZsb2F0OiBsZWZ0OyBmb250LXNpemU6IDEycHg7IGhlaWdodDogNDBweDsgbGluZS1oZWlnaHQ6IDQwcHg7IHBhZGRpbmc6IDA7IHBhZGRpbmctcmlnaHQ6IDlweDsgcGFkZGluZy1sZWZ0OiAyMHB4OyB3aWR0aDogYXV0bzsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQorZGwudGFicyBkdDpmaXJzdC1jaGlsZCB7IHBhZGRpbmc6IDA7IHBhZGRpbmctcmlnaHQ6IDlweDsgfQorZGwudGFicyBkZCB7IGRpc3BsYXk6IGJsb2NrOyBmbG9hdDogbGVmdDsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyB9CitkbC50YWJzIGRkIGEgeyBjb2xvcjogIzZmNmY2ZjsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTRweDsgaGVpZ2h0OiA0MHB4OyBsaW5lLWhlaWdodDogNDBweDsgcGFkZGluZzogMHB4IDIzLjhweDsgfQorZGwudGFicyBkZCBhOmZvY3VzIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjZmQ3ODAwOyB9CitkbC50YWJzIGRkLmFjdGl2ZSB7IGJvcmRlci10b3A6IDNweCBzb2xpZCAjZmQ3ODAwOyBtYXJnaW4tdG9wOiAtM3B4OyB9CitkbC50YWJzIGRkLmFjdGl2ZSBhIHsgY3Vyc29yOiBkZWZhdWx0OyBjb2xvcjogIzNjM2MzYzsgYmFja2dyb3VuZDogI2ZmZjsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZTZlNmU2OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTZlNmU2OyBmb250LXdlaWdodDogYm9sZDsgfQorZGwudGFicyBkZDpmaXJzdC1jaGlsZCB7IG1hcmdpbi1sZWZ0OiAwOyB9CitkbC50YWJzLnZlcnRpY2FsIHsgaGVpZ2h0OiBhdXRvOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U2ZTZlNjsgfQorZGwudGFicy52ZXJ0aWNhbCBkdCwgZGwudGFicy52ZXJ0aWNhbCBkZCB7IGZsb2F0OiBub25lOyBoZWlnaHQ6IGF1dG87IH0KK2RsLnRhYnMudmVydGljYWwgZGQgeyBib3JkZXItbGVmdDogM3B4IHNvbGlkICNjY2NjY2M7IH0KK2RsLnRhYnMudmVydGljYWwgZGQgYSB7IGJhY2tncm91bmQ6ICNmMmYyZjI7IGJvcmRlcjogbm9uZTsgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMDsgY29sb3I6ICM1NTU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDE0cHg7IGhlaWdodDogYXV0bzsgbGluZS1oZWlnaHQ6IDE7IHBhZGRpbmc6IDE1cHggMjBweDsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLW1vei1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IH0KK2RsLnRhYnMudmVydGljYWwgZGQuYWN0aXZlIHsgbWFyZ2luLXRvcDogMDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM0ZDRkNGQ7IGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzFhMWExYTsgfQorZGwudGFicy52ZXJ0aWNhbCBkZC5hY3RpdmUgYSB7IGJhY2tncm91bmQ6ICM0ZDRkNGQ7IGJvcmRlcjogbm9uZTsgY29sb3I6ICNmZmY7IGhlaWdodDogYXV0bzsgbWFyZ2luOiAwOyBwb3NpdGlvbjogc3RhdGljOyB0b3A6IDA7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDA7IC1tb3otYm94LXNoYWRvdzogMCAwIDA7IGJveC1zaGFkb3c6IDAgMCAwOyB9CitkbC50YWJzLnZlcnRpY2FsIGRkOmZpcnN0LWNoaWxkIGEuYWN0aXZlIHsgbWFyZ2luOiAwOyB9CitkbC50YWJzLnBpbGwgeyBib3JkZXItYm90dG9tOiBub25lOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CitkbC50YWJzLnBpbGwgZGQgeyBtYXJnaW4tcmlnaHQ6IDEwcHg7IH0KK2RsLnRhYnMucGlsbCBkZDpsYXN0LWNoaWxkIHsgbWFyZ2luLXJpZ2h0OiAwOyB9CitkbC50YWJzLnBpbGwgZGQgYSB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW8tYm9yZGVyLXJhZGl1czogMTAwMHB4OyBib3JkZXItcmFkaXVzOiAxMDAwcHg7IGJhY2tncm91bmQ6ICNlNmU2ZTY7IGhlaWdodDogMjZweDsgbGluZS1oZWlnaHQ6IDI2cHg7IGNvbG9yOiAjNjY2OyB9CitkbC50YWJzLnBpbGwgZGQuYWN0aXZlIHsgYm9yZGVyOiBub25lOyBtYXJnaW4tdG9wOiAwOyB9CitkbC50YWJzLnBpbGwgZGQuYWN0aXZlIGEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQ3ODAwOyBib3JkZXI6IG5vbmU7IGNvbG9yOiAjZmZmOyB9CitkbC50YWJzLnBpbGwuY29udGFpbmVkIHsgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNlZWU7IG1hcmdpbi1ib3R0b206IDA7IH0KK2RsLnRhYnMucGlsbC50d28tdXAgZGQsIGRsLnRhYnMucGlsbC50aHJlZS11cCBkZCwgZGwudGFicy5waWxsLmZvdXItdXAgZGQsIGRsLnRhYnMucGlsbC5maXZlLXVwIGRkIHsgbWFyZ2luLXJpZ2h0OiAwOyB9CitkbC50YWJzLnR3by11cCBkdCBhLCBkbC50YWJzLnR3by11cCBkZCBhLCBkbC50YWJzLnRocmVlLXVwIGR0IGEsIGRsLnRhYnMudGhyZWUtdXAgZGQgYSwgZGwudGFicy5mb3VyLXVwIGR0IGEsIGRsLnRhYnMuZm91ci11cCBkZCBhLCBkbC50YWJzLmZpdmUtdXAgZHQgYSwgZGwudGFicy5maXZlLXVwIGRkIGEgeyBwYWRkaW5nOiAwIDE3cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgb3ZlcmZsb3c6IGhpZGRlbjsgfQorZGwudGFicy50d28tdXAgZHQsIGRsLnRhYnMudHdvLXVwIGRkIHsgd2lkdGg6IDUwJTsgfQorZGwudGFicy50aHJlZS11cCBkdCwgZGwudGFicy50aHJlZS11cCBkZCB7IHdpZHRoOiAzMy4zMyU7IH0KK2RsLnRhYnMuZm91ci11cCBkdCwgZGwudGFicy5mb3VyLXVwIGRkIHsgd2lkdGg6IDI1JTsgfQorZGwudGFicy5maXZlLXVwIGR0LCBkbC50YWJzLmZpdmUtdXAgZGQgeyB3aWR0aDogMjAlOyB9CisKK3VsLnRhYnMtY29udGVudCB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDAgMCAyMHB4OyBwYWRkaW5nOiAwOyB9Cit1bC50YWJzLWNvbnRlbnQgPiBsaSB7IGRpc3BsYXk6IG5vbmU7IH0KK3VsLnRhYnMtY29udGVudCA+IGxpLmFjdGl2ZSB7IGRpc3BsYXk6IGJsb2NrOyB9Cit1bC50YWJzLWNvbnRlbnQuY29udGFpbmVkIHsgcGFkZGluZzogMDsgfQordWwudGFicy1jb250ZW50LmNvbnRhaW5lZCA+IGxpIHsgYm9yZGVyOiBzb2xpZCAwICNlNmU2ZTY7IGJvcmRlci13aWR0aDogMCAxcHggMXB4IDFweDsgcGFkZGluZzogMjBweDsgfQordWwudGFicy1jb250ZW50LmNvbnRhaW5lZC52ZXJ0aWNhbCA+IGxpIHsgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDFweCAxcHg7IH0KKworLm5vLWpzIHVsLnRhYnMtY29udGVudCA+IGxpIHsgZGlzcGxheTogYmxvY2s7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyBkbC50YWJzLm1vYmlsZSB7IHdpZHRoOiBhdXRvOyBtYXJnaW46IDIwcHggLTIwcHggNDBweDsgaGVpZ2h0OiBhdXRvOyB9CisgIGRsLnRhYnMubW9iaWxlIGR0LCBkbC50YWJzLm1vYmlsZSBkZCB7IGZsb2F0OiBub25lOyBoZWlnaHQ6IGF1dG87IH0KKyAgZGwudGFicy5tb2JpbGUgZGQgYSB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogYXV0bzsgaGVpZ2h0OiBhdXRvOyBwYWRkaW5nOiAxOHB4IDIwcHg7IGxpbmUtaGVpZ2h0OiAxOyBib3JkZXI6IHNvbGlkIDAgI2NjYzsgYm9yZGVyLXdpZHRoOiAxcHggMCAwOyBtYXJnaW46IDA7IGNvbG9yOiAjNTU1OyBiYWNrZ3JvdW5kOiAjZWVlOyBmb250LXNpemU6IDE1cHg7IGZvbnQtc2l6ZTogMS41cmVtOyB9CisgIGRsLnRhYnMubW9iaWxlIGRkIGEuYWN0aXZlIHsgaGVpZ2h0OiBhdXRvOyBtYXJnaW46IDA7IGJvcmRlci13aWR0aDogMXB4IDAgMDsgfQorICAudGFicy5tb2JpbGUgeyBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2NjYzsgaGVpZ2h0OiBhdXRvOyB9CisgIC50YWJzLm1vYmlsZSBkZCBhIHsgcGFkZGluZzogMThweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1sZWZ0OiBub25lOyBib3JkZXItcmlnaHQ6IG5vbmU7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOyBiYWNrZ3JvdW5kOiAjZmZmOyB9CisgIC50YWJzLm1vYmlsZSBkZCBhLmFjdGl2ZSB7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogI2ZkNzgwMDsgY29sb3I6ICNmZmY7IG1hcmdpbjogMDsgcG9zaXRpb246IHN0YXRpYzsgdG9wOiAwOyBoZWlnaHQ6IGF1dG87IH0KKyAgLnRhYnMubW9iaWxlIGRkOmZpcnN0LWNoaWxkIGEuYWN0aXZlIHsgbWFyZ2luOiAwOyB9CisgIGRsLmNvbnRhaW5lZC5tb2JpbGUgeyBtYXJnaW4tYm90dG9tOiAwOyB9CisgIGRsLmNvbnRhaW5lZC50YWJzLm1vYmlsZSBkZCBhIHsgcGFkZGluZzogMThweCAyMHB4OyB9CisgIGRsLnRhYnMubW9iaWxlICsgdWwuY29udGFpbmVkIHsgbWFyZ2luLWxlZnQ6IC0yMHB4OyBtYXJnaW4tcmlnaHQ6IC0yMHB4OyBib3JkZXItd2lkdGg6IDAgMCAxcHggMDsgfSB9CisvKiBSZXF1aXJlczogZ2xvYmFscy5jc3MgKi8KKy8qIFRhYmxlIG9mIENvbnRlbnRzCisKKzo6IFZpc2liaWxpdHkKKzo6IEFsZXJ0cworOjogTGFiZWxzCis6OiBUb29sdGlwcworOjogUGFuZWxzCis6OiBBY2NvcmRpb24KKzo6IFNpZGUgTmF2Cis6OiBTdWIgTmF2Cis6OiBQYWdpbmF0aW9uCis6OiBCcmVhZGNydW1icworOjogTGlzdHMKKzo6IExpbmsgTGlzdHMKKzo6IEtleXN0cm9rZSBDaGFycworOjogSW1hZ2UgVGh1bWJuYWlscworOjogVmlkZW8KKzo6IFRhYmxlcworOjogTWljcm9mb3JtYXRzCis6OiBQcm9ncmVzcyBCYXJzCisKKyovCisvKiBWaXNpYmlsaXR5IENsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU3RhbmRhcmQgKGxhcmdlKSBkaXNwbGF5IHRhcmdldGluZyAqLworLnNob3ctZm9yLXNtYWxsLCAuc2hvdy1mb3ItbWVkaXVtLCAuc2hvdy1mb3ItbWVkaXVtLWRvd24sIC5oaWRlLWZvci1sYXJnZSwgLmhpZGUtZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CisKKy5oaWRlLWZvci14bGFyZ2UsIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuaGlkZS1mb3Itc21hbGwsIC5oaWRlLWZvci1tZWRpdW0sIC5oaWRlLWZvci1tZWRpdW0tZG93biB7IGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IH0KKworLyogVmVyeSBsYXJnZSBkaXNwbGF5IHRhcmdldGluZyAqLworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxNDQxcHgpIHsgLmhpZGUtZm9yLXNtYWxsLCAuaGlkZS1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5oaWRlLWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorICAuc2hvdy1mb3Itc21hbGwsIC5zaG93LWZvci1tZWRpdW0sIC5zaG93LWZvci1tZWRpdW0tZG93biwgLnNob3ctZm9yLWxhcmdlLCAuaGlkZS1mb3ItbGFyZ2UtdXAsIC5oaWRlLWZvci14bGFyZ2UgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorLyogTWVkaXVtIGRpc3BsYXkgdGFyZ2V0aW5nICovCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7IC5oaWRlLWZvci1zbWFsbCwgLnNob3ctZm9yLW1lZGl1bSwgLnNob3ctZm9yLW1lZGl1bS1kb3duLCAuaGlkZS1mb3ItbGFyZ2UsIC5oaWRlLWZvci1sYXJnZS11cCwgLmhpZGUtZm9yLXhsYXJnZSB7IGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IH0KKyAgLnNob3ctZm9yLXNtYWxsLCAuaGlkZS1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KKy8qIFNtYWxsIGRpc3BsYXkgdGFyZ2V0aW5nICovCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IC5zaG93LWZvci1zbWFsbCwgLmhpZGUtZm9yLW1lZGl1bSwgLnNob3ctZm9yLW1lZGl1bS1kb3duLCAuaGlkZS1mb3ItbGFyZ2UsIC5oaWRlLWZvci1sYXJnZS11cCwgLmhpZGUtZm9yLXhsYXJnZSB7IGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IH0KKyAgLmhpZGUtZm9yLXNtYWxsLCAuc2hvdy1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KKy8qIE9yaWVudGF0aW9uIHRhcmdldGluZyAqLworLnNob3ctZm9yLWxhbmRzY2FwZSwgLmhpZGUtZm9yLXBvcnRyYWl0IHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorCisuaGlkZS1mb3ItbGFuZHNjYXBlLCAuc2hvdy1mb3ItcG9ydHJhaXQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIHsgLnNob3ctZm9yLWxhbmRzY2FwZSwgLmhpZGUtZm9yLXBvcnRyYWl0IHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorICAuaGlkZS1mb3ItbGFuZHNjYXBlLCAuc2hvdy1mb3ItcG9ydHJhaXQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCkgeyAuc2hvdy1mb3ItcG9ydHJhaXQsIC5oaWRlLWZvci1sYW5kc2NhcGUgeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9CisgIC5oaWRlLWZvci1wb3J0cmFpdCwgLnNob3ctZm9yLWxhbmRzY2FwZSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9CisvKiBUb3VjaC1lbmFibGVkIGRldmljZSB0YXJnZXRpbmcgKi8KKy5zaG93LWZvci10b3VjaCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQorCisuaGlkZS1mb3ItdG91Y2ggeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9CisKKy50b3VjaCAuc2hvdy1mb3ItdG91Y2ggeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9CisKKy50b3VjaCAuaGlkZS1mb3ItdG91Y2ggeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KKworLyogU3BlY2lmaWMgb3ZlcnJpZGVzIGZvciBlbGVtZW50cyB0aGF0IHJlcXVpcmUgc29tZXRoaW5nIG90aGVyIHRoYW4gZGlzcGxheTogYmxvY2sgKi8KK3RhYmxlLnNob3ctZm9yLXhsYXJnZSwgdGFibGUuc2hvdy1mb3ItbGFyZ2UsIHRhYmxlLmhpZGUtZm9yLXNtYWxsLCB0YWJsZS5oaWRlLWZvci1tZWRpdW0geyBkaXNwbGF5OiB0YWJsZSAhaW1wb3J0YW50OyB9CisKK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTI3OXB4KSBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsgLnRvdWNoIHRhYmxlLmhpZGUtZm9yLXhsYXJnZSwgLnRvdWNoIHRhYmxlLmhpZGUtZm9yLWxhcmdlLCAudG91Y2ggdGFibGUuaGlkZS1mb3Itc21hbGwsIC50b3VjaCB0YWJsZS5zaG93LWZvci1tZWRpdW0geyBkaXNwbGF5OiB0YWJsZSAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsgdGFibGUuaGlkZS1mb3IteGxhcmdlLCB0YWJsZS5oaWRlLWZvci1sYXJnZSwgdGFibGUuaGlkZS1mb3ItbWVkaXVtLCB0YWJsZS5zaG93LWZvci1zbWFsbCB7IGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7IH0gfQorLyogQWxlcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Rpdi5hbGVydC1ib3ggeyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogNnB4IDdweCA3cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogI2ZkNzgwMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyB0ZXh0LXNoYWRvdzogMCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4zKTsgcG9zaXRpb246IHJlbGF0aXZlOyB9CitkaXYuYWxlcnQtYm94LnN1Y2Nlc3MgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWRhNDIzOyBjb2xvcjogI2ZmZjsgdGV4dC1zaGFkb3c6IDAgLTFweCByZ2JhKDAsIDAsIDAsIDAuMyk7IH0KK2Rpdi5hbGVydC1ib3guYWxlcnQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzYwZjEzOyBjb2xvcjogI2ZmZjsgdGV4dC1zaGFkb3c6IDAgLTFweCByZ2JhKDAsIDAsIDAsIDAuMyk7IH0KK2Rpdi5hbGVydC1ib3guc2Vjb25kYXJ5IHsgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsgY29sb3I6ICM1MDUwNTA7IHRleHQtc2hhZG93OiAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7IH0KK2Rpdi5hbGVydC1ib3ggYS5jbG9zZSB7IGNvbG9yOiAjMzMzOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiA0cHg7IHRvcDogLTFweDsgZm9udC1zaXplOiAxN3B4OyBvcGFjaXR5OiAwLjI7IHBhZGRpbmc6IDRweDsgfQorZGl2LmFsZXJ0LWJveCBhLmNsb3NlOmhvdmVyLCBkaXYuYWxlcnQtYm94IGEuY2xvc2U6Zm9jdXMgeyBvcGFjaXR5OiAwLjQ7IH0KKworLyogTGFiZWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBUb29sdGlwcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisuaGFzLXRpcCB7IGJvcmRlci1ib3R0b206IGRvdHRlZCAxcHggI2NjY2NjYzsgY3Vyc29yOiBoZWxwOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMzMzMzMzM7IH0KKy5oYXMtdGlwOmhvdmVyIHsgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAjMTk2MTc3OyBjb2xvcjogI2ZkNzgwMDsgfQorLmhhcy10aXAudGlwLWxlZnQsIC5oYXMtdGlwLnRpcC1yaWdodCB7IGZsb2F0OiBub25lICFpbXBvcnRhbnQ7IH0KKworLnRvb2x0aXAgeyBkaXNwbGF5OiBub25lOyBiYWNrZ3JvdW5kOiBibGFjazsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjg1KTsgcG9zaXRpb246IGFic29sdXRlOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDEycHg7IGZvbnQtc2l6ZTogMS4ycmVtOyBwYWRkaW5nOiA1cHg7IHotaW5kZXg6IDk5OTsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7IC1tb3otYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IH0KKy50b29sdGlwID4gLm51YiB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDVweDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCBibGFjayB0cmFuc3BhcmVudDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCByZ2JhKDAsIDAsIDAsIDAuODUpIHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwcHg7IGxlZnQ6IDEwcHg7IH0KKy50b29sdGlwLnRpcC1vdmVycmlkZSA+IC5udWIgeyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGJsYWNrIHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgwLCAwLCAwLCAwLjg1KSB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyB0b3A6IC0xMHB4ICFpbXBvcnRhbnQ7IH0KKy50b29sdGlwLnRpcC10b3AgPiAubnViIHsgYm9yZGVyLWNvbG9yOiBibGFjayB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODUpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyB0b3A6IGF1dG87IGJvdHRvbTogLTEwcHg7IH0KKy50b29sdGlwLnRpcC1sZWZ0LCAudG9vbHRpcC50aXAtcmlnaHQgeyBmbG9hdDogbm9uZSAhaW1wb3J0YW50OyB9CisudG9vbHRpcC50aXAtbGVmdCA+IC5udWIgeyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGJsYWNrOyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHJnYmEoMCwgMCwgMCwgMC44NSk7IHJpZ2h0OiAtMTBweDsgbGVmdDogYXV0bzsgfQorLnRvb2x0aXAudGlwLXJpZ2h0ID4gLm51YiB7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgYmxhY2sgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgcmdiYSgwLCAwLCAwLCAwLjg1KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgcmlnaHQ6IGF1dG87IGxlZnQ6IC0xMHB4OyB9CisudG9vbHRpcC5ub3JhZGl1cyB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsgLW1vei1ib3JkZXItcmFkaXVzOiAwOyAtbXMtYm9yZGVyLXJhZGl1czogMDsgLW8tYm9yZGVyLXJhZGl1czogMDsgYm9yZGVyLXJhZGl1czogMDsgfQorLnRvb2x0aXAub3BlbmVkIHsgY29sb3I6ICNmZDc4MDAgIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAjMTk2MTc3ICFpbXBvcnRhbnQ7IH0KKworLnRhcC10by1jbG9zZSB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDEwcHg7IGZvbnQtc2l6ZTogMXJlbTsgY29sb3I6ICM4ODg4ODg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAudG9vbHRpcCB7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1zaXplOiAxLjRyZW07IGxpbmUtaGVpZ2h0OiAxLjQ7IHBhZGRpbmc6IDdweCAxMHB4IDlweCAxMHB4OyB9CisgIC50b29sdGlwID4gLm51YiwgLnRvb2x0aXAudG9wID4gLm51YiwgLnRvb2x0aXAubGVmdCA+IC5udWIsIC50b29sdGlwLnJpZ2h0ID4gLm51YiB7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgYmxhY2sgdHJhbnNwYXJlbnQ7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgwLCAwLCAwLCAwLjg1KSB0cmFuc3BhcmVudDsgdG9wOiAtMTJweDsgbGVmdDogMTBweDsgfSB9CisvKiBQYW5lbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLnBhbmVsIHsgYmFja2dyb3VuZDogI2YyZjJmMjsgYm9yZGVyOiBzb2xpZCAxcHggI2U2ZTZlNjsgbWFyZ2luOiAwIDAgMjJweCAwOyBwYWRkaW5nOiAyMHB4OyB9CisucGFuZWwgPiA6Zmlyc3QtY2hpbGQgeyBtYXJnaW4tdG9wOiAwOyB9CisucGFuZWwgPiA6bGFzdC1jaGlsZCB7IG1hcmdpbi1ib3R0b206IDA7IH0KKy5wYW5lbC5jYWxsb3V0IHsgYmFja2dyb3VuZDogI2ZkNzgwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1jb2xvcjogIzIyODRhMTsgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7IC1tb3otYm94LXNoYWRvdzogaW5zZXQgMHB4IDFweCAwcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpOyBib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7IH0KKy5wYW5lbC5jYWxsb3V0IGEgeyBjb2xvcjogI2ZmZjsgfQorLnBhbmVsLmNhbGxvdXQgLmJ1dHRvbiB7IGJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGNvbG9yOiAjZmQ3ODAwOyB0ZXh0LXNoYWRvdzogbm9uZTsgfQorLnBhbmVsLmNhbGxvdXQgLmJ1dHRvbjpob3ZlciB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsgfQorLnBhbmVsLnJhZGl1cyB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OyAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsgLW1zLWJvcmRlci1yYWRpdXM6IDNweDsgLW8tYm9yZGVyLXJhZGl1czogM3B4OyBib3JkZXItcmFkaXVzOiAzcHg7IH0KKworLyogQWNjb3JkaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VsLmFjY29yZGlvbiB7IG1hcmdpbjogMCAwIDIycHggMDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlOWU5ZTk7IH0KK3VsLmFjY29yZGlvbiA+IGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3JkZXItdG9wOiAxcHggc29saWQgI2U5ZTllOTsgfQordWwuYWNjb3JkaW9uID4gbGkgLnRpdGxlIHsgY3Vyc29yOiBwb2ludGVyOyBiYWNrZ3JvdW5kOiAjZjZmNmY2OyBwYWRkaW5nOiAxNXB4OyBtYXJnaW46IDA7IHBvc2l0aW9uOiByZWxhdGl2ZTsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZTllOWU5OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTllOWU5OyAtd2Via2l0LXRyYW5zaXRpb246IDAuMTVzIGJhY2tncm91bmQgbGluZWFyOyAtbW96LXRyYW5zaXRpb246IDAuMTVzIGJhY2tncm91bmQgbGluZWFyOyAtby10cmFuc2l0aW9uOiAwLjE1cyBiYWNrZ3JvdW5kIGxpbmVhcjsgdHJhbnNpdGlvbjogMC4xNXMgYmFja2dyb3VuZCBsaW5lYXI7IH0KK3VsLmFjY29yZGlvbiA+IGxpIC50aXRsZSBoMSwgdWwuYWNjb3JkaW9uID4gbGkgLnRpdGxlIGgyLCB1bC5hY2NvcmRpb24gPiBsaSAudGl0bGUgaDMsIHVsLmFjY29yZGlvbiA+IGxpIC50aXRsZSBoNCwgdWwuYWNjb3JkaW9uID4gbGkgLnRpdGxlIGg1IHsgbWFyZ2luOiAwOyB9Cit1bC5hY2NvcmRpb24gPiBsaSAudGl0bGU6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICM5ZDlkOWQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDE1cHg7IHRvcDogMjFweDsgfQordWwuYWNjb3JkaW9uID4gbGkgLmNvbnRlbnQgeyBkaXNwbGF5OiBub25lOyBwYWRkaW5nOiAxNXB4OyB9Cit1bC5hY2NvcmRpb24gPiBsaS5hY3RpdmUgeyBib3JkZXItdG9wOiAzcHggc29saWQgI2ZkNzgwMDsgfQordWwuYWNjb3JkaW9uID4gbGkuYWN0aXZlIC50aXRsZSB7IGJhY2tncm91bmQ6IHdoaXRlOyBwYWRkaW5nLXRvcDogMTNweDsgfQordWwuYWNjb3JkaW9uID4gbGkuYWN0aXZlIC50aXRsZTphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA2cHg7IGJvcmRlci1jb2xvcjogIzlkOWQ5ZCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgfQordWwuYWNjb3JkaW9uID4gbGkuYWN0aXZlIC5jb250ZW50IHsgYmFja2dyb3VuZDogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNlOWU5ZTk7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOWU5ZTk7IH0KKworLyogU2lkZSBOYXYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWwuc2lkZS1uYXYgeyBkaXNwbGF5OiBibG9jazsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAxN3B4IDA7IH0KK3VsLnNpZGUtbmF2IGxpIHsgZGlzcGxheTogYmxvY2s7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMCAwIDdweCAwOyB9Cit1bC5zaWRlLW5hdiBsaSBhIHsgZGlzcGxheTogYmxvY2s7IH0KK3VsLnNpZGUtbmF2IGxpLmFjdGl2ZSBhIHsgY29sb3I6ICM0ZDRkNGQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Cit1bC5zaWRlLW5hdiBsaS5kaXZpZGVyIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTY7IGhlaWdodDogMDsgcGFkZGluZzogMDsgfQorCisvKiBTdWIgTmF2cyBodHRwOi8vd3d3Lnp1cmIuY29tL2FydGljbGUvMjkyL2hvdy10by1jcmVhdGUtc2ltcGxlLWFuZC1lZmZlY3RpdmUtc3ViLW5hIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2RsLnN1Yi1uYXYgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IGF1dG87IG92ZXJmbG93OiBoaWRkZW47IG1hcmdpbjogLTRweCAwIDE4cHg7IG1hcmdpbi1yaWdodDogMDsgbWFyZ2luLWxlZnQ6IC05cHg7IHBhZGRpbmctdG9wOiA0cHg7IH0KK2RsLnN1Yi1uYXYgZHQsIGRsLnN1Yi1uYXYgZGQgeyBmbG9hdDogbGVmdDsgZGlzcGxheTogaW5saW5lOyBtYXJnaW4tbGVmdDogOXB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CitkbC5zdWItbmF2IGR0IHsgY29sb3I6ICM5OTk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KK2RsLnN1Yi1uYXYgZGQgYSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tb3otYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtbXMtYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtby1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IGJvcmRlci1yYWRpdXM6IDEwMDBweDsgfQorZGwuc3ViLW5hdiBkZC5hY3RpdmUgYSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogM3B4IDlweDsgY3Vyc29yOiBkZWZhdWx0OyB9CisKKy8qIFBhZ2luYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWwucGFnaW5hdGlvbiB7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDI0cHg7IG1hcmdpbi1sZWZ0OiAtNXB4OyB9Cit1bC5wYWdpbmF0aW9uIGxpIHsgZmxvYXQ6IGxlZnQ7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDI0cHg7IGNvbG9yOiAjOTk5OyBmb250LXNpemU6IDE0cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IH0KK3VsLnBhZ2luYXRpb24gbGkgYSB7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAxcHggN3B4IDFweDsgY29sb3I6ICM1NTU7IH0KK3VsLnBhZ2luYXRpb24gbGk6aG92ZXIgYSwgdWwucGFnaW5hdGlvbiBsaSBhOmZvY3VzIHsgYmFja2dyb3VuZDogI2U2ZTZlNjsgfQordWwucGFnaW5hdGlvbiBsaS51bmF2YWlsYWJsZSBhIHsgY3Vyc29yOiBkZWZhdWx0OyBjb2xvcjogIzk5OTsgfQordWwucGFnaW5hdGlvbiBsaS51bmF2YWlsYWJsZTpob3ZlciBhLCB1bC5wYWdpbmF0aW9uIGxpLnVuYXZhaWxhYmxlIGE6Zm9jdXMgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfQordWwucGFnaW5hdGlvbiBsaS5jdXJyZW50IGEgeyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBjdXJzb3I6IGRlZmF1bHQ7IH0KK3VsLnBhZ2luYXRpb24gbGkuY3VycmVudCBhOmhvdmVyIHsgYmFja2dyb3VuZDogI2ZkNzgwMDsgfQorCisvKiBCcmVhZGNydW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VsLmJyZWFkY3J1bWJzIHsgZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6ICNmNmY2ZjY7IHBhZGRpbmc6IDZweCAxMHB4IDdweDsgYm9yZGVyOiAxcHggc29saWQgI2U5ZTllOTsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7IC1tb3otYm9yZGVyLXJhZGl1czogMnB4OyAtbXMtYm9yZGVyLXJhZGl1czogMnB4OyAtby1ib3JkZXItcmFkaXVzOiAycHg7IGJvcmRlci1yYWRpdXM6IDJweDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQordWwuYnJlYWRjcnVtYnMgbGkgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDAgMTJweCAwIDA7IGZsb2F0OiBsZWZ0OyBsaXN0LXN0eWxlOiBub25lOyB9Cit1bC5icmVhZGNydW1icyBsaSBhLCB1bC5icmVhZGNydW1icyBsaSBzcGFuIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgZm9udC1zaXplOiAxMXB4OyBmb250LXNpemU6IDEuMXJlbTsgcGFkZGluZy1sZWZ0OiAxMnB4OyB9Cit1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZCBhLCB1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZCBzcGFuIHsgcGFkZGluZy1sZWZ0OiAwOyB9Cit1bC5icmVhZGNydW1icyBsaTpiZWZvcmUgeyBjb250ZW50OiAiLyI7IGNvbG9yOiAjYWFhOyB9Cit1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZDpiZWZvcmUgeyBjb250ZW50OiAiICI7IH0KK3VsLmJyZWFkY3J1bWJzIGxpLmN1cnJlbnQgYSB7IGN1cnNvcjogZGVmYXVsdDsgY29sb3I6ICMzMzM7IH0KK3VsLmJyZWFkY3J1bWJzIGxpOmhvdmVyIGEsIHVsLmJyZWFkY3J1bWJzIGxpIGE6Zm9jdXMgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQordWwuYnJlYWRjcnVtYnMgbGkuY3VycmVudDpob3ZlciBhLCB1bC5icmVhZGNydW1icyBsaS5jdXJyZW50IGE6Zm9jdXMgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KK3VsLmJyZWFkY3J1bWJzIGxpLnVuYXZhaWxhYmxlIGEgeyBjb2xvcjogIzk5OTsgfQordWwuYnJlYWRjcnVtYnMgbGkudW5hdmFpbGFibGU6aG92ZXIgYSwgdWwuYnJlYWRjcnVtYnMgbGkudW5hdmFpbGFibGUgYTpmb2N1cyB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICM5OTk7IGN1cnNvcjogZGVmYXVsdDsgfQorCisvKiBMaW5rIExpc3QgKi8KK3VsLmxpbmstbGlzdCB7IG1hcmdpbjogMCAwIDE3cHggLTIycHg7IHBhZGRpbmc6IDA7IGxpc3Qtc3R5bGU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IH0KK3VsLmxpbmstbGlzdCBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IGZsb2F0OiBsZWZ0OyBtYXJnaW4tbGVmdDogMjJweDsgZGlzcGxheTogYmxvY2s7IH0KK3VsLmxpbmstbGlzdCBsaSBhIHsgZGlzcGxheTogYmxvY2s7IH0KKworLyogS2V5dHJva2UgQ2hhcmFjdGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisua2V5c3Ryb2tlLCBrYmQgeyBmb250LWZhbWlseTogIkNvbnNvbGFzIiwgIk1lbmxvIiwgIkNvdXJpZXIiLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTNweDsgcGFkZGluZzogMnB4IDRweCAwcHg7IG1hcmdpbjogMDsgYmFja2dyb3VuZDogI2VkZWRlZDsgYm9yZGVyOiBzb2xpZCAxcHggI2RiZGJkYjsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyAtbXMtYm9yZGVyLXJhZGl1czogM3B4OyAtby1ib3JkZXItcmFkaXVzOiAzcHg7IGJvcmRlci1yYWRpdXM6IDNweDsgfQorCisvKiBJbWFnZSBUaHVtYm5haWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy50aCB7IGRpc3BsYXk6IGJsb2NrOyB9CisudGggaW1nIHsgZGlzcGxheTogYmxvY2s7IGJvcmRlcjogc29saWQgNHB4ICNmZmY7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpOyBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpOyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJvcmRlciwgYm94LXNoYWRvdzsgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiBib3JkZXIsIGJveC1zaGFkb3c7IC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IGJvcmRlciwgYm94LXNoYWRvdzsgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYm9yZGVyLCBib3gtc2hhZG93OyAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDMwMG1zOyAtbW96LXRyYW5zaXRpb24tZHVyYXRpb246IDMwMG1zOyAtby10cmFuc2l0aW9uLWR1cmF0aW9uOiAzMDBtczsgdHJhbnNpdGlvbi1kdXJhdGlvbjogMzAwbXM7IH0KKy50aDpob3ZlciBpbWcgeyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4IHJnYmEoNDMsIDE2NiwgMjAzLCAwLjUpOyAtbW96LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4IHJnYmEoNDMsIDE2NiwgMjAzLCAwLjUpOyBib3gtc2hhZG93OiAwIDAgNnB4IDFweCByZ2JhKDQzLCAxNjYsIDIwMywgMC41KTsgfQorCisvKiBWaWRlbyAtIE1hZCBwcm9wcyB0byBodHRwOi8vd3d3LmFsaXN0YXBhcnQuY29tL2FydGljbGVzL2NyZWF0aW5nLWludHJpbnNpYy1yYXRpb3MtZm9yLXZpZGVvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisuZmxleC12aWRlbyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy10b3A6IDI1cHg7IHBhZGRpbmctYm90dG9tOiA2Ny41JTsgaGVpZ2h0OiAwOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBvdmVyZmxvdzogaGlkZGVuOyB9CisuZmxleC12aWRlby53aWRlc2NyZWVuIHsgcGFkZGluZy1ib3R0b206IDU3LjI1JTsgfQorLmZsZXgtdmlkZW8udmltZW8geyBwYWRkaW5nLXRvcDogMDsgfQorLmZsZXgtdmlkZW8gaWZyYW1lLCAuZmxleC12aWRlbyBvYmplY3QsIC5mbGV4LXZpZGVvIGVtYmVkLCAuZmxleC12aWRlbyB2aWRlbyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9CmRpZmYgLS1naXQgYS9ORkQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9uYW1lZF9kYXRhX2RveHlnZW4uY3NzIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvbmFtZWRfZGF0YV9kb3h5Z2VuLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmJjYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvbmFtZWRfZGF0YV9kb3h5Z2VuLmNzcwpAQCAtMCwwICsxLDc3NiBAQAorQGltcG9ydCB1cmwoImJhc2UuY3NzIik7CisKK0BpbXBvcnQgdXJsKCJmb3VuZGF0aW9uLmNzcyIpOworCit0YWJsZSB7CisgICAgICBib3JkZXI6IDA7Cit9CisKK3ByZSB7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOworICAgIGNvbG9yOiAjMjIyOworICAgIGxpbmUtaGVpZ2h0OiAxLjBlbTsKKyAgICBib3JkZXI6IDJweCBzb2xpZCAjQzZDOUNCOworICAgIGZvbnQtc2l6ZTogMC45ZW07CisgICAgLyogbWFyZ2luOiAxLjVlbSAwIDEuNWVtIDA7ICovCisgICAgbWFyZ2luOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKK30KKworLyogR2VuZXJhbCAqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKK2E6bGluayB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorYTp2aXNpdGVkIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CithOmFjdGl2ZSwKK2E6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworaDEsaDIsaDMsaDQsaDUsaDYgeworICAgIGNvbG9yOiAjMDAwOworICAgIG1hcmdpbi1ib3R0b206IDE4cHg7Cit9CisKK2gxIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiAyNHB4OyBsaW5lLWhlaWdodDogMjRweDsgIH0KK2gyIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiAxOHB4OyBsaW5lLWhlaWdodDogMThweDsgIH0KK2gzIHsgZm9udC13ZWlnaHQ6IGJvbGQ7ICAgZm9udC1zaXplOiAxOHB4OyBsaW5lLWhlaWdodDogMThweDsgfQoraDQgeyBmb250LXdlaWdodDogbm9ybWFsOyBmb250LXNpemU6IDE4cHg7IGxpbmUtaGVpZ2h0OiAxNzhweDsgfQorCitociB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2M2YzZjNjsKKyAgICBib3JkZXI6MDsKKyAgICBoZWlnaHQ6IDFweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxOHB4OworICAgIGNsZWFyOmJvdGg7Cit9CisKK2Rpdi5ociB7CisgIGhlaWdodDogMXB4OworICBiYWNrZ3JvdW5kOiAjYzZjNmM2OworfQorCitkaXYuaHIyIHsKKyAgaGVpZ2h0OiAxcHg7CisgIGJhY2tncm91bmQ6ICNjNmM2YzY7Cit9CisKK2Rpdi5ociBociwgZGl2LmhyMiBociB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKK3AgeworICAgIHBhZGRpbmc6IDAgMCAwLjVlbTsKKyAgICBsaW5lLWhlaWdodDoxLjZlbTsKK30KK3VsIHsKKyAgICBsaXN0LXN0eWxlOiBzcXVhcmU7CisgICAgbWFyZ2luOiAwIDAgMThweCAwOworfQorb2wgeworICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7CisgICAgbWFyZ2luOiAwIDAgMThweCAxLjVlbTsKK30KK29sIG9sIHsKKyAgICBsaXN0LXN0eWxlOnVwcGVyLWFscGhhOworfQorb2wgb2wgb2wgeworICAgIGxpc3Qtc3R5bGU6bG93ZXItcm9tYW47Cit9CitvbCBvbCBvbCBvbCB7CisgICAgbGlzdC1zdHlsZTpsb3dlci1hbHBoYTsKK30KK3VsIHVsLAorb2wgb2wsCit1bCBvbCwKK29sIHVsIHsKKyAgICBtYXJnaW4tYm90dG9tOjA7Cit9CitkbCB7CisgICAgbWFyZ2luOjAgMCAyNHB4IDA7Cit9CitkdCB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CitkZCB7CisgICAgbWFyZ2luLWJvdHRvbTogMThweDsKK30KK3N0cm9uZyB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgY29sb3I6ICMwMDA7Cit9CitjaXRlLAorZW0sCitpIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgYm9yZGVyOiBub25lOworfQorYmlnIHsKKyAgICBmb250LXNpemU6IDEzMS4yNSU7Cit9CitpbnMgeworICAgIGJhY2tncm91bmQ6ICNGRkZGQ0M7CisgICAgYm9yZGVyOiBub25lOworICAgIGNvbG9yOiAjMzMzOworfQorZGVsIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKKyAgICBjb2xvcjogIzU1NTsKK30KK2Jsb2NrcXVvdGUgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBwYWRkaW5nOiAwIDNlbTsKK30KK2Jsb2NrcXVvdGUgY2l0ZSwKK2Jsb2NrcXVvdGUgZW0sCitibG9ja3F1b3RlIGkgeworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKK30KK3ByZSB7CisgICAgYmFja2dyb3VuZDogI2Y3ZjdmNzsKKyAgICBjb2xvcjogIzIyMjsKKyAgICBwYWRkaW5nOiAxLjVlbTsKK30KK2FiYnIsCithY3JvbnltIHsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzY2NjsKKyAgICBjdXJzb3I6IGhlbHA7Cit9CitpbnMgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KK3N1cCwKK3N1YiB7CisgICAgaGVpZ2h0OiAwOworICAgIGxpbmUtaGVpZ2h0OiAxOworICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgZm9udC1zaXplOiAxMHB4OworfQorc3VwIHsKKyAgICBib3R0b206IDFleDsKK30KK3N1YiB7CisgICAgdG9wOiAuNWV4OworfQorCitwLAordWwsCitvbCwKK2RkLAoraHIgeworICAgIG1hcmdpbi1ib3R0b206MTBweDsKK30KK3VsIHVsLAorb2wgb2wsCit1bCBvbCwKK29sIHVsIHsKKyAgICBtYXJnaW4tYm90dG9tOjA7Cit9CitwcmUsCitrYmQsCit0dCwKK3ZhciB7Cit9Citjb2RlIHsKKyAgICBmb250LXNpemU6IDEzcHg7Cit9CitzdHJvbmcsCitiLAorZHQsCit0aCB7CisgICAgY29sb3I6ICMwMDA7Cit9CisKKworLyogbWFpbl9jb250YWluZXIgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjd3JhcHBlciB7CisgICAgcGFkZGluZzogMHB4IDBweDsKKyAgICBtYXJnaW4tdG9wOiAyMHB4OworfQorCisvKiBoZWFkZXIqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzZWFyY2gtaGVhZGVyeworICAgIG1hcmdpbi10b3A6MTVweDsKKyAgICBwYWRkaW5nLWJvdHRvbToxM3B4OworfQorCisjc2VhcmNoLWhlYWRlciAjc2VhcmNoeworICAgIGJhY2tncm91bmQ6ICMyMjI7CisKK30KKworI3NlYXJjaC1oZWFkZXIgI3NlYXJjaCAjc3sKKyAgICBiYWNrZ3JvdW5kOiAjMjIyOworICAgIGZvbnQtc2l6ZToxMnB4OworICAgIGNvbG9yOiAjYWFhOworfQorCisjaGVhZGVyX2NvbnRhaW5lcnsKKyAgICBwYWRkaW5nLWJvdHRvbTogMjVweDsKKyAgICBwYWRkaW5nLXRvcDogMHB4OworICAgIGJhY2tncm91bmQ6ICNmZmY7Cit9CisKKyNoZWFkZXIgeworCit9CisKKyNoZWFkZXIyIHsKKworfQorCisjY29udGVudF9jb250YWluZXJ7CisgICAgcGFkZGluZy10b3A6IDE1cHg7Cit9CisKKyNsZWZ0LWNvbCB7CisgICAgcGFkZGluZzogMTBweCAyMHB4OworICAgIHBhZGRpbmctbGVmdDogMHB4OworICAgIGJhY2tncm91bmQ6ICNmZmY7CisKK30KKworCisvKmZvb3RlciovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworCisjZm9vdGVyIHsKKyAgICBwYWRkaW5nOiA1cHggMjBweDsKKyAgICBiYWNrZ3JvdW5kOiAjZGRkOworfQorCisjZm9vdGVyLWNvbnRhaW5lcnsKKyAgICBwYWRkaW5nOiA1cHggMjBweDsKKyAgICBiYWNrZ3JvdW5kOiAjMzAzMDMwOworICAgIGJvcmRlci10b3A6IDhweCBzb2xpZCAjMDAwOworICAgIGZvbnQtc2l6ZToxMXB4OworfQorCisjZm9vdGVyLWluZm8geworICAgIGNvbG9yOiNjY2M7CisgICAgdGV4dC1hbGlnbjpsZWZ0OworICAgIGJhY2tncm91bmQ6ICMxYjFiMWI7CisgICAgcGFkZGluZzogMjBweCAwOworfQorCisKKyNmb290ZXItaW5mbyBheworICAgIHRleHQtZGVjb3JhdGlvbjpub25lOworICAgIGNvbG9yOiAjZmZmOworfQorCisjZm9vdGVyLWluZm8gYTpob3ZlcnsKKyAgICBjb2xvcjogI2ViZWJlYjsKK30KKworI2NvcHlyaWdodHtmbG9hdDogbGVmdDt9CisKKy5zY3JvbGwtdG9wIHsKKyAgICB0ZXh0LWFsaWduOnJpZ2h0OworfQorCisjZm9vdGVyLXdpZGdldHsKKyAgICBwYWRkaW5nOiA4cHggMHB4IDhweCAwcHg7CisgICAgY29sb3I6IzZmNmY2ZjsKK30KKworI2Zvb3Rlci13aWRnZXQgI3NlYXJjaCB7CisgICAgd2lkdGg6MTIwcHg7CisgICAgaGVpZ2h0OjI4cHg7CisgICAgYmFja2dyb3VuZDogIzIyMjsKKyAgICBtYXJnaW4tbGVmdDogMHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2OworfQorCisjZm9vdGVyLXdpZGdldCAjc2VhcmNoICNzIHsKKyAgICB3aWR0aDoxMTBweDsKKyAgICBoZWlnaHQ6MjNweDsKKyAgICBib3JkZXI6MHB4OworICAgIG1hcmdpbi1sZWZ0OjdweDsKKyAgICBtYXJnaW4tcmlnaHQ6MTBweDsKKyAgICBtYXJnaW4tdG9wOjNweDsKKyAgICBjb2xvcjojZmZmOworICAgIGRpc3BsYXk6IGlubGluZTsKKyAgICBiYWNrZ3JvdW5kOiAjMjIyOworICAgIGZsb2F0OiBsZWZ0OworfQorCisjZm9vdGVyLXdpZGdldCAjY2FsZW5kYXJfd3JhcCB7CisgICAgcGFkZGluZzogOHB4IDBweDsKK30KKworI2Zvb3Rlci13aWRnZXQgI3dwLWNhbGVuZGFyIHRkeworICAgIHBhZGRpbmc6MnB4OworfQorCisKKyNmb290ZXItd2lkZ2V0IC50ZXh0d2lkZ2V0IHsKKyAgICBwYWRkaW5nOiA1cHggMHB4OworICAgIGxpbmUtaGVpZ2h0OiAyM3B4OworfQorCisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXRfdGFnX2Nsb3VkIGF7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIG1hcmdpbjogNXB4OworICAgIGxpbmUtaGVpZ2h0OiAyNHB4OworICAgIG1hcmdpbi1sZWZ0OiAwcHg7CisgICAgY29sb3I6ICM2ZjZmNmY7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXRfdGFnX2Nsb3VkIGE6aG92ZXJ7CisgICAgY29sb3I6ICNmZmY7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXQtY29udGFpbmVyIHVsIGxpIGEgICAgeworICAgIGNvbG9yOiNmZDc4MDA7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXQtY29udGFpbmVyIHVsIGxpIGE6aG92ZXIgICAgeworICAgIGNvbG9yOiAjY2NjOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciBoMyB7CisgICAgY29sb3I6ICNhNWE1YTU7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgICBtYXJnaW4tYm90dG9tOiAwcHg7CisgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7CisgICAgZm9udC1zaXplOiAyNXB4OworICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXQtY29udGFpbmVyIHVsIGxpIHsKKyAgICBwYWRkaW5nOiA1cHggMHB4OworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgfQorCisjZm9vdGVyLXdpZGdldCB1bCB7CisgICAgbWFyZ2luLWxlZnQ6IDBweDsKKyAgICB9CisKKyNmb290ZXItYmFyMSB7CisgICAgcGFkZGluZy1yaWdodDogNDBweDsKK30KKyNmb290ZXItYmFyMiB7CisgICAgcGFkZGluZy1yaWdodDogNDBweDsKK30KKyNmb290ZXItYmFyMyB7Cit9CisjZm9vdGVyLWJhcjQgeworfQorCitzcGFuI2ZvbGxvdy1ib3h7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAxMDBweDsKK30KKworc3BhbiNmb2xsb3ctYm94IGltZ3sKKyAgICBtYXJnaW46IDAgMnB4OworfQorCisvKmxvZ28qLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNsb2dvIHsKKyAgICBtYXJnaW46IDBweCAwcHggMHB4IDBweDsKK30KKworI2xvZ28yIHsKKyAgICBtYXJnaW46IDBweCAwcHggMHB4IDBweDsKK30KKworI2xvZ28gaW1neworICAgIGJvcmRlcjogbm9uZTsKK30KKworI2xvZ28yeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBmb250LXNpemU6IDQycHg7CisgICAgbGV0dGVyLXNwYWNpbmc6IC0xcHQ7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgZm9udC1mYW1pbHk6YXJpYWwsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBsaW5lLWhlaWdodDogNTdweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworI2xvZ28yIGEsICNzbG9nYW57CisgICAgY29sb3I6ICNmZDc4MDA7Cit9CisKKyNzbG9nYW57CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworLypzZWFyY2gqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzZWFyY2ggeworICAgIHdpZHRoOjE4MHB4OworICAgIGhlaWdodDoyOHB4OworICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CisgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjc2lkZWJhciAjc2VhcmNoIHsKKyAgICBtYXJnaW4tdG9wOiAyMHB4OworfQorCisjc2VhcmNoICNzZWFyY2hzdWJtaXQgeworICAgIGJhY2tncm91bmQ6dXJsKGltYWdlcy9nby1idG4ucG5nKSBuby1yZXBlYXQgdG9wIHJpZ2h0OworICAgIHdpZHRoOjI4cHg7CisgICAgaGVpZ2h0OjI4cHg7CisgICAgYm9yZGVyOjBweDsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICByaWdodDogLTM1cHg7Cit9CisKKyNzZWFyY2ggI3MgeworICAgIHdpZHRoOjE3MHB4OworICAgIGhlaWdodDoyM3B4OworICAgIGJvcmRlcjowcHg7CisgICAgbWFyZ2luLWxlZnQ6N3B4OworICAgIG1hcmdpbi1yaWdodDoxMHB4OworICAgIG1hcmdpbi10b3A6M3B4OworICAgIGNvbG9yOiMwMDA7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGZsb2F0OiBsZWZ0OworfQorCisvKm1lbnUgYmFyKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjbWVudV9jb250YWluZXJ7CisgICAgcGFkZGluZy10b3A6IDBweDsKK30KKworCisvKnJlc3BvbnNpdmUgbWVudSovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworLyogZGVmYXVsdCBzdHlsZSAqLworLnNlbGVjdG5hdiB7IGRpc3BsYXk6IG5vbmU7IH0KKworLyogc21hbGwgc2NyZWVuICovCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2MDBweCkgeworICAuanMgI25hdiB7IGRpc3BsYXk6IG5vbmU7IH0KKyAgIC5qcyAjbmF2MiB7IGRpc3BsYXk6IG5vbmU7IH0KKyAgLmpzIC5zZWxlY3RuYXYgeyBkaXNwbGF5OiBibG9jazsgfQorfQorCisKKy8qd2VsY29tZSovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKyN3ZWxjb21lX2NvbnRhaW5lciBoMXsKKyAgICBtYXJnaW4tdG9wOiAwcHg7Cit9CisKKy8qaG9tZXBhZ2UgYm94ZXMqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNib3hfY29udGFpbmVyeworICAgIHBhZGRpbmctdG9wOiAzNXB4OworICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OworfQorCisuYm94LWhlYWQgeworICAgIGZsb2F0OiBsZWZ0OworICAgIHBhZGRpbmctYm90dG9tOiAyMHB4OworfQorCisuYm94LWhlYWQgaW1neworCit9CisKKy50aXRsZS1oZWFkeworICAgIHBhZGRpbmctdG9wOjJweDsKK30KKworLnRpdGxlLWJveHsKKyAgICBjb2xvcjogIzMzMzsKKyAgICBsaW5lLWhlaWdodDogMTVweDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworfQorCisudGl0bGUtYm94IGgxIHsKKyAgICBmb250LXNpemU6IDE4cHg7CisgICAgbWFyZ2luLWJvdHRvbTogM3B4OworfQorCisuYm94LWNvbnRlbnQgeworICAgIGZsb2F0OiBsZWZ0OworICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworfQorCisKKy8qIFBPU1QgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisKKy5wb3N0IHsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworCit9CisKKy5wb3N0LXNoYWRvd3sKKyAgICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9wb3N0X3NoYWRvdy5wbmciKSBuby1yZXBlYXQgYm90dG9tOworICAgIGhlaWdodDogOXB4OworICAgIG1hcmdpbi1ib3R0b206IDI1cHg7Cit9CisKKy5wb3N0IG9seworICAgIG1hcmdpbi1sZWZ0OiAyMHB4OworfQorCisucG9zdCB1bCB7CisgICAgbWFyZ2luLWxlZnQ6IDE1cHg7Cit9CisucG9zdC1lbnRyeSB1bCB7IG1hcmdpbjogMCAwIDEwcHggMTBweDsgfQorLnBvc3QtZW50cnkgdWwgbGkgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbjogNXB4IDA7CisgICAgcGFkZGluZzogMCAwIDAgMjBweDsKKyAgICAvKmJhY2tncm91bmQ6IHVybChpbWFnZXMvYnVsbGV0LnBuZykgbm8tcmVwZWF0IDAgN3B4OyovCit9CisKKy5wb3N0LWVudHJ5IG9sIHsKKyAgICBsaXN0LXN0eWxlOiBkZWNpbWFsOworICAgIG1hcmdpbjogMCAwIDE4cHggMS42ZW07Cit9CisucG9zdC1lbnRyeSBvbCBsaSB7CisgICAgbGlzdC1zdHlsZTogZGVjaW1hbDsKKyB9CisKKy5wb3N0LWVudHJ5IHsKKyAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKKyAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworCit9CisKKy5wb3N0LWhlYWQgeworICAgIG1hcmdpbi1ib3R0b206IDVweDsKKyAgICBwYWRkaW5nLXRvcDogMTVweDsKK30KKworLnBvc3QtaGVhZCBoMSBhLCAucG9zdC1oZWFkIGgxIHsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKKyAgICBjb2xvcjojMDAwOworICAgIG1hcmdpbjogMHB4OworICAgIGZvbnQtc2l6ZTogMjdweDsKK30KKworLnBvc3QtaGVhZCBoMSBhOmhvdmVyIHsKKyAgICBjb2xvcjojNzc3OworfQorCisKKy5wb3N0LWhlYWQtbm90Zm91bmQgaDEsIC5wb3N0LWhlYWQtNDA0IGgxLCAucG9zdC1oZWFkLWFyY2hpdmUgaDEsIC5wb3N0LWhlYWQtc2VhcmNoIGgxIHsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKKyAgICBjb2xvcjojMDAwOworICAgIGZvbnQtc2l6ZTogMjdweDsKK30KKworLnBvc3QtdGh1bWIgaW1nIHsKKyAgICBib3JkZXI6IDBweCBzb2xpZCAjZWJlYmViOworfQorCisucG9zdC1lbnRyeSBpbWd7CisgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICBoZWlnaHQ6YXV0bzsKKyAgICBtYXgtd2lkdGg6MTAwJSAhaW1wb3J0YW50OworfQorCisubWV0YS1kYXRheworICAgIGxpbmUtaGVpZ2h0OiAxNnB4OworICAgIHBhZGRpbmc6IDZweCAzcHg7CisgICAgbWFyZ2luLWJvdHRvbTogM3B4OworICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U5ZTllOTsKK30KKworLm1ldGEtZGF0YSBheworICAgIGNvbG9yOiAjZmQ3ODAwOworfQorCisubWV0YS1kYXRhIGE6aG92ZXJ7CisgICAgY29sb3I6ICM3Nzc7Cit9CisKKy5yZWFkLW1vcmUgeworY29sb3I6ICMwMDA7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICAgIHBhZGRpbmc6IDRweCA4cHg7CisgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICBmb250LXNpemU6IDExcHg7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOworICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworLnJlYWQtbW9yZTpob3ZlcnsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIGNvbG9yOiAjNjY2OworfQorCisuY2xlYXIgeworICAgIGNsZWFyOmJvdGg7Cit9CisKKy5zdGlja3kgeworCit9CisKKy8qIGNvbnRlbnQgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworI2NvbnRlbnRfY29udGFpbmVyIHRhYmxlIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlN2U3OworICAgIG1hcmdpbjogMCAtMXB4IDI0cHggMDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIHdpZHRoOiAxMDAlOworCit9CisjY29udGVudF9jb250YWluZXIgdHIgdGgsCisjY29udGVudF9jb250YWluZXIgdGhlYWQgdGggeworICAgIGNvbG9yOiAjODg4OworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICBwYWRkaW5nOiA5cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ciB0ZCB7CisKKyAgICBwYWRkaW5nOiA2cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ci5vZGQgdGQgeworICAgIGJhY2tncm91bmQ6ICNmMmY3ZmM7Cit9CisKKy8qLS1uYXZpZ2F0aW9uLS0qLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKy5uYXZpZ2F0aW9uIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBtYXJnaW46IDIwcHggMDsKK30KKworCisubmF2aWdhdGlvbiAuYWxpZ25sZWZ0IGEgeworICAgIGZsb2F0OiBsZWZ0OworfQorCisubmF2aWdhdGlvbiAuYWxpZ25yaWdodCBhIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKyNuYXYtc2luZ2xlIHsKKyAgICBvdmVyZmxvdzpoaWRkZW47CisgICAgbWFyZ2luLXRvcDoyMHB4OworICAgIG1hcmdpbi1ib3R0b206MTBweDsKK30KKy5uYXYtcHJldmlvdXMgeworICAgIGZsb2F0OiBsZWZ0OworICAgIHdpZHRoOiA1MCU7Cit9CisubmF2LW5leHQgeworICAgIGZsb2F0OiByaWdodDsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICB3aWR0aDogNTAlOworfQorCisvKi0tc3ViIGhlYWQgYW5kIGJyZWFkY3J1bWJzLS0qLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzdWJoZWFkX2NvbnRhaW5lcnsKKyAgICBwYWRkaW5nOiA3cHggMHB4OworfQorCisjc3ViaGVhZCBoMXsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKKyAgICBmb250LXNpemU6IDMwcHg7Cit9CisKKyNicmVhZGNydW1icyB7CisgICAgcGFkZGluZy1sZWZ0OiAyNXB4OworICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CisgICAgY29sb3I6ICM5ZTllOWU7CisgICAgbWFyZ2luOjAgYXV0bzsKKyAgICB3aWR0aDogOTY0cHg7CisgICAgZm9udC1zaXplOiAxMHB4OworfQorCisjYnJlYWRjcnVtYnMgYXsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgY29sb3I6ICM5ZTllOWU7Cit9CisKKy8qQWxpZ25tZW50cyAqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKy5hbGlnbmxlZnQsCitpbWcuYWxpZ25sZWZ0IHsKKyAgICBkaXNwbGF5OiBpbmxpbmU7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luLXJpZ2h0OiAyMnB4OworICAgIG1hcmdpbi10b3A6IDlweDsKK30KKworLmFsaWducmlnaHQsCitpbWcuYWxpZ25yaWdodCB7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGZsb2F0OiByaWdodDsKKyAgICBtYXJnaW4tbGVmdDogMjJweDsKKyAgICBtYXJnaW4tdG9wOiA4cHg7Cit9CisuYWxpZ25jZW50ZXIsCitpbWcuYWxpZ25jZW50ZXIgeworICAgIGNsZWFyOiBib3RoOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi1yaWdodDogYXV0bzsKK30KKworLmFsaWdubGVmdCwKKy5hbGlnbnJpZ2h0LAorLmFsaWduY2VudGVyLAoraW1nLmFsaWdubGVmdCwKK2ltZy5hbGlnbnJpZ2h0LAoraW1nLmFsaWduY2VudGVyCit7CisgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKK30KKworCithIGltZy5hbGlnbmNlbnRlciB7CisgICAgZGlzcGxheTpibG9jazsKKyAgICBtYXJnaW4tbGVmdDphdXRvOworICAgIG1hcmdpbi1yaWdodDphdXRvOworfQorCitpbWcgeyAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OyBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgfQpkaWZmIC0tZ2l0IGEvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvbmFtZWRfZGF0YV9zdHlsZS5jc3NfdCBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hbWVkX2RhdGFfc3R5bGUuY3NzX3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZmI3MgotLS0gL2Rldi9udWxsCisrKyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hbWVkX2RhdGFfc3R5bGUuY3NzX3QKQEAgLTAsMCArMSw4MTMgQEAKK0BpbXBvcnQgdXJsKCJiYXNlLmNzcyIpOworCitAaW1wb3J0IHVybCgiZm91bmRhdGlvbi5jc3MiKTsKKwordGFibGUgeworICAgICAgYm9yZGVyOiAwOworfQorCitwcmUgeworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsKKyAgICBjb2xvcjogIzIyMjsKKyAgICAvKiBsaW5lLWhlaWdodDogMS4wZW07ICovCisgICAgYm9yZGVyOiAycHggc29saWQgI0M2QzlDQjsKKyAgICBmb250LXNpemU6IDAuOWVtOworICAgIC8qIG1hcmdpbjogMS41ZW0gMCAxLjVlbSAwOyAqLworICAgIG1hcmdpbjogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7Cit9CisKKy8qIEdlbmVyYWwgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCithOmxpbmsgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KK2E6dmlzaXRlZCB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorYTphY3RpdmUsCithOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2gxLGgyLGgzLGg0LGg1LGg2IHsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBtYXJnaW4tYm90dG9tOiAxOHB4OworfQorCitoMSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDI0cHg7IH0KK2gyIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMThweDsgfQoraDMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxNnB4OyB9CitoNCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDE0cHg7IH0KKworaHIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNjNmM2YzY7CisgICAgYm9yZGVyOjA7CisgICAgaGVpZ2h0OiAxcHg7CisgICAgbWFyZ2luLWJvdHRvbTogMThweDsKKyAgICBjbGVhcjpib3RoOworfQorCitkaXYuaHIgeworICBoZWlnaHQ6IDFweDsKKyAgYmFja2dyb3VuZDogI2M2YzZjNjsKK30KKworZGl2LmhyMiB7CisgIGhlaWdodDogMXB4OworICBiYWNrZ3JvdW5kOiAjYzZjNmM2OworfQorCitkaXYuaHIgaHIsIGRpdi5ocjIgaHIgeworICBkaXNwbGF5OiBub25lOworfQorCitwIHsKKyAgICBwYWRkaW5nOiAwOworICAgIGxpbmUtaGVpZ2h0OjEuNmVtOworfQordWwgeworICAgIGxpc3Qtc3R5bGU6IHNxdWFyZTsKKyAgICBtYXJnaW46IDAgMCAxOHB4IDA7Cit9CitvbCB7CisgICAgbGlzdC1zdHlsZTogZGVjaW1hbDsKKyAgICBtYXJnaW46IDAgMCAxOHB4IDEuNWVtOworfQorb2wgb2wgeworICAgIGxpc3Qtc3R5bGU6dXBwZXItYWxwaGE7Cit9CitvbCBvbCBvbCB7CisgICAgbGlzdC1zdHlsZTpsb3dlci1yb21hbjsKK30KK29sIG9sIG9sIG9sIHsKKyAgICBsaXN0LXN0eWxlOmxvd2VyLWFscGhhOworfQordWwgdWwsCitvbCBvbCwKK3VsIG9sLAorb2wgdWwgeworICAgIG1hcmdpbi1ib3R0b206MDsKK30KK2RsIHsKKyAgICBtYXJnaW46MCAwIDI0cHggMDsKK30KK2R0IHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KK2RkIHsKKyAgICBtYXJnaW4tYm90dG9tOiAxOHB4OworfQorc3Ryb25nIHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBjb2xvcjogIzAwMDsKK30KK2NpdGUsCitlbSwKK2kgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBib3JkZXI6IG5vbmU7Cit9CitiaWcgeworICAgIGZvbnQtc2l6ZTogMTMxLjI1JTsKK30KK2lucyB7CisgICAgYmFja2dyb3VuZDogI0ZGRkZDQzsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgY29sb3I6ICMzMzM7Cit9CitkZWwgeworICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOworICAgIGNvbG9yOiAjNTU1OworfQorYmxvY2txdW90ZSB7CisgICAgcGFkZGluZzogMCAzZW07Cit9CitibG9ja3F1b3RlIGNpdGUsCitibG9ja3F1b3RlIGVtLAorYmxvY2txdW90ZSBpIHsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7Cit9CitwcmUgeworICAgIGJhY2tncm91bmQ6ICNmN2Y3Zjc7CisgICAgY29sb3I6ICMyMjI7CisgICAgcGFkZGluZzogMS41ZW07Cit9CithYmJyLAorYWNyb255bSB7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2NjY7CisgICAgY3Vyc29yOiBoZWxwOworfQoraW5zIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CitzdXAsCitzdWIgeworICAgIGhlaWdodDogMDsKKyAgICBsaW5lLWhlaWdodDogMTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGZvbnQtc2l6ZTogMTBweDsKK30KK3N1cCB7CisgICAgYm90dG9tOiAxZXg7Cit9CitzdWIgeworICAgIHRvcDogLjVleDsKK30KKworcCwKK3VsLAorb2wsCitkZCwKK2hyIHsKKyAgICBtYXJnaW4tYm90dG9tOjEwcHg7Cit9Cit1bCB1bCwKK29sIG9sLAordWwgb2wsCitvbCB1bCB7CisgICAgbWFyZ2luLWJvdHRvbTowOworfQorcHJlLAora2JkLAordHQsCit2YXIgeworfQorY29kZSB7CisgICAgZm9udC1zaXplOiAxM3B4OworfQorc3Ryb25nLAorYiwKK2R0LAordGggeworICAgIGNvbG9yOiAjMDAwOworfQorCisKKy8qIG1haW5fY29udGFpbmVyICovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworI3dyYXBwZXIgeworICAgIHBhZGRpbmc6IDBweCAwcHg7CisgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworLyogaGVhZGVyKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc2VhcmNoLWhlYWRlcnsKKyAgICBtYXJnaW4tdG9wOjE1cHg7CisgICAgcGFkZGluZy1ib3R0b206MTNweDsKK30KKworI3NlYXJjaC1oZWFkZXIgI3NlYXJjaHsKKyAgICBiYWNrZ3JvdW5kOiAjMjIyOworCit9CisKKyNzZWFyY2gtaGVhZGVyICNzZWFyY2ggI3N7CisgICAgYmFja2dyb3VuZDogIzIyMjsKKyAgICBmb250LXNpemU6MTJweDsKKyAgICBjb2xvcjogI2FhYTsKK30KKworI2hlYWRlcl9jb250YWluZXJ7CisgICAgcGFkZGluZy1ib3R0b206IDI1cHg7CisgICAgcGFkZGluZy10b3A6IDBweDsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworfQorCisjaGVhZGVyIHsKKworfQorCisjaGVhZGVyMiB7CisKK30KKworI2NvbnRlbnRfY29udGFpbmVyeworICAgIHBhZGRpbmctdG9wOiAxNXB4OworfQorCisjbGVmdC1jb2wgeworICAgIHBhZGRpbmc6IDEwcHggMjBweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworCit9CisKKworLypmb290ZXIqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKworI2Zvb3RlciB7CisgICAgcGFkZGluZzogNXB4IDIwcHg7CisgICAgYmFja2dyb3VuZDogI2RkZDsKK30KKworI2Zvb3Rlci1jb250YWluZXJ7CisgICAgcGFkZGluZzogNXB4IDIwcHg7CisgICAgYmFja2dyb3VuZDogIzMwMzAzMDsKKyAgICBib3JkZXItdG9wOiA4cHggc29saWQgIzAwMDsKKyAgICBmb250LXNpemU6MTFweDsKK30KKworI2Zvb3Rlci1pbmZvIHsKKyAgICBjb2xvcjojY2NjOworICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICBiYWNrZ3JvdW5kOiAjMWIxYjFiOworICAgIHBhZGRpbmc6IDIwcHggMDsKK30KKworCisjZm9vdGVyLWluZm8gYXsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKKyAgICBjb2xvcjogI2ZmZjsKK30KKworI2Zvb3Rlci1pbmZvIGE6aG92ZXJ7CisgICAgY29sb3I6ICNlYmViZWI7Cit9CisKKyNjb3B5cmlnaHR7ZmxvYXQ6IGxlZnQ7fQorCisuc2Nyb2xsLXRvcCB7CisgICAgdGV4dC1hbGlnbjpyaWdodDsKK30KKworI2Zvb3Rlci13aWRnZXR7CisgICAgcGFkZGluZzogOHB4IDBweCA4cHggMHB4OworICAgIGNvbG9yOiM2ZjZmNmY7Cit9CisKKyNmb290ZXItd2lkZ2V0ICNzZWFyY2ggeworICAgIHdpZHRoOjEyMHB4OworICAgIGhlaWdodDoyOHB4OworICAgIGJhY2tncm91bmQ6ICMyMjI7CisgICAgbWFyZ2luLWxlZnQ6IDBweDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgYm9yZGVyOiAxcHggc29saWQgIzY2NjsKK30KKworI2Zvb3Rlci13aWRnZXQgI3NlYXJjaCAjcyB7CisgICAgd2lkdGg6MTEwcHg7CisgICAgaGVpZ2h0OjIzcHg7CisgICAgYm9yZGVyOjBweDsKKyAgICBtYXJnaW4tbGVmdDo3cHg7CisgICAgbWFyZ2luLXJpZ2h0OjEwcHg7CisgICAgbWFyZ2luLXRvcDozcHg7CisgICAgY29sb3I6I2ZmZjsKKyAgICBkaXNwbGF5OiBpbmxpbmU7CisgICAgYmFja2dyb3VuZDogIzIyMjsKKyAgICBmbG9hdDogbGVmdDsKK30KKworI2Zvb3Rlci13aWRnZXQgI2NhbGVuZGFyX3dyYXAgeworICAgIHBhZGRpbmc6IDhweCAwcHg7Cit9CisKKyNmb290ZXItd2lkZ2V0ICN3cC1jYWxlbmRhciB0ZHsKKyAgICBwYWRkaW5nOjJweDsKK30KKworCisjZm9vdGVyLXdpZGdldCAudGV4dHdpZGdldCB7CisgICAgcGFkZGluZzogNXB4IDBweDsKKyAgICBsaW5lLWhlaWdodDogMjNweDsKK30KKworCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0X3RhZ19jbG91ZCBheworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBtYXJnaW46IDVweDsKKyAgICBsaW5lLWhlaWdodDogMjRweDsKKyAgICBtYXJnaW4tbGVmdDogMHB4OworICAgIGNvbG9yOiAjNmY2ZjZmOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0X3RhZ19jbG91ZCBhOmhvdmVyeworICAgIGNvbG9yOiAjZmZmOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciB1bCBsaSBhICAgIHsKKyAgICBjb2xvcjojZmQ3ODAwOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciB1bCBsaSBhOmhvdmVyICAgIHsKKyAgICBjb2xvcjogI2NjYzsKK30KKworI2Zvb3Rlci13aWRnZXQgLndpZGdldC1jb250YWluZXIgaDMgeworICAgIGNvbG9yOiAjYTVhNWE1OworICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgICAgbWFyZ2luLWJvdHRvbTogMHB4OworICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgIHBhZGRpbmctbGVmdDogMHB4OworICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICBwYWRkaW5nLWJvdHRvbTogOHB4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciB1bCBsaSB7CisgICAgcGFkZGluZzogNXB4IDBweDsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworICAgIH0KKworI2Zvb3Rlci13aWRnZXQgdWwgeworICAgIG1hcmdpbi1sZWZ0OiAwcHg7CisgICAgfQorCisjZm9vdGVyLWJhcjEgeworICAgIHBhZGRpbmctcmlnaHQ6IDQwcHg7Cit9CisjZm9vdGVyLWJhcjIgeworICAgIHBhZGRpbmctcmlnaHQ6IDQwcHg7Cit9CisjZm9vdGVyLWJhcjMgeworfQorI2Zvb3Rlci1iYXI0IHsKK30KKworc3BhbiNmb2xsb3ctYm94eworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICByaWdodDogMTAwcHg7Cit9CisKK3NwYW4jZm9sbG93LWJveCBpbWd7CisgICAgbWFyZ2luOiAwIDJweDsKK30KKworLypsb2dvKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjbG9nbyB7CisgICAgbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Cit9CisKKyNsb2dvMiB7CisgICAgbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Cit9CisKKyNsb2dvIGltZ3sKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKKyNsb2dvMnsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgZm9udC1zaXplOiA0MnB4OworICAgIGxldHRlci1zcGFjaW5nOiAtMXB0OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGZvbnQtZmFtaWx5OmFyaWFsLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgbGluZS1oZWlnaHQ6IDU3cHg7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7Cit9CisKKyNsb2dvMiBhLCAjc2xvZ2FueworICAgIGNvbG9yOiAjZmQ3ODAwOworfQorCisjc2xvZ2FueworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7Cit9CisKKy8qc2VhcmNoKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc2VhcmNoIHsKKyAgICB3aWR0aDoxODBweDsKKyAgICBoZWlnaHQ6MjhweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICAgIG1hcmdpbi1sZWZ0OiAxMHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI3NpZGViYXIgI3NlYXJjaCB7CisgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworI3NlYXJjaCAjc2VhcmNoc3VibWl0IHsKKyAgICBiYWNrZ3JvdW5kOnVybChpbWFnZXMvZ28tYnRuLnBuZykgbm8tcmVwZWF0IHRvcCByaWdodDsKKyAgICB3aWR0aDoyOHB4OworICAgIGhlaWdodDoyOHB4OworICAgIGJvcmRlcjowcHg7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgcmlnaHQ6IC0zNXB4OworfQorCisjc2VhcmNoICNzIHsKKyAgICB3aWR0aDoxNzBweDsKKyAgICBoZWlnaHQ6MjNweDsKKyAgICBib3JkZXI6MHB4OworICAgIG1hcmdpbi1sZWZ0OjdweDsKKyAgICBtYXJnaW4tcmlnaHQ6MTBweDsKKyAgICBtYXJnaW4tdG9wOjNweDsKKyAgICBjb2xvcjojMDAwOworICAgIGRpc3BsYXk6IGlubGluZTsKKyAgICBmbG9hdDogbGVmdDsKK30KKworLyptZW51IGJhciovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworI21lbnVfY29udGFpbmVyeworICAgIHBhZGRpbmctdG9wOiAwcHg7Cit9CisKKworLypyZXNwb25zaXZlIG1lbnUqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKy8qIGRlZmF1bHQgc3R5bGUgKi8KKy5zZWxlY3RuYXYgeyBkaXNwbGF5OiBub25lOyB9CisKKy8qIHNtYWxsIHNjcmVlbiAqLworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjAwcHgpIHsKKyAgLmpzICNuYXYgeyBkaXNwbGF5OiBub25lOyB9CisgICAuanMgI25hdjIgeyBkaXNwbGF5OiBub25lOyB9CisgIC5qcyAuc2VsZWN0bmF2IHsgZGlzcGxheTogYmxvY2s7IH0KK30KKworCisvKndlbGNvbWUqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisjd2VsY29tZV9jb250YWluZXIgaDF7CisgICAgbWFyZ2luLXRvcDogMHB4OworfQorCisvKmhvbWVwYWdlIGJveGVzKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjYm94X2NvbnRhaW5lcnsKKyAgICBwYWRkaW5nLXRvcDogMzVweDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMTVweDsKK30KKworLmJveC1oZWFkIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMjBweDsKK30KKworLmJveC1oZWFkIGltZ3sKKworfQorCisudGl0bGUtaGVhZHsKKyAgICBwYWRkaW5nLXRvcDoycHg7Cit9CisKKy50aXRsZS1ib3h7CisgICAgY29sb3I6ICMzMzM7CisgICAgbGluZS1oZWlnaHQ6IDE1cHg7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKK30KKworLnRpdGxlLWJveCBoMSB7CisgICAgZm9udC1zaXplOiAxOHB4OworICAgIG1hcmdpbi1ib3R0b206IDNweDsKK30KKworLmJveC1jb250ZW50IHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICBsaW5lLWhlaWdodDogMjBweDsKK30KKworCisvKiBQT1NUICovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworCisucG9zdCB7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKworfQorCisucG9zdC1zaGFkb3d7CisgICAgYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvcG9zdF9zaGFkb3cucG5nIikgbm8tcmVwZWF0IGJvdHRvbTsKKyAgICBoZWlnaHQ6IDlweDsKKyAgICBtYXJnaW4tYm90dG9tOiAyNXB4OworfQorCisucG9zdCBvbHsKKyAgICBtYXJnaW4tbGVmdDogMjBweDsKK30KKworLnBvc3QgdWwgeworICAgIG1hcmdpbi1sZWZ0OiAxNXB4OworfQorLnBvc3QtZW50cnkgdWwgeyBtYXJnaW46IDAgMCAxMHB4IDEwcHg7IH0KKy5wb3N0LWVudHJ5IHVsIGxpIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW46IDVweCAwOworICAgIHBhZGRpbmc6IDAgMCAwIDIwcHg7CisgICAgLypiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2J1bGxldC5wbmcpIG5vLXJlcGVhdCAwIDdweDsqLworfQorCisucG9zdC1lbnRyeSBvbCB7CisgICAgbGlzdC1zdHlsZTogZGVjaW1hbDsKKyAgICBtYXJnaW46IDAgMCAxOHB4IDEuNmVtOworfQorLnBvc3QtZW50cnkgb2wgbGkgeworICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7CisgfQorCisucG9zdC1lbnRyeSB7CisgICAgcGFkZGluZy1ib3R0b206IDEwcHg7CisgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKworfQorCisucG9zdC1oZWFkIHsKKyAgICBtYXJnaW4tYm90dG9tOiA1cHg7CisgICAgcGFkZGluZy10b3A6IDE1cHg7Cit9CisKKy5wb3N0LWhlYWQgaDEgYSwgLnBvc3QtaGVhZCBoMSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CisgICAgY29sb3I6IzAwMDsKKyAgICBtYXJnaW46IDBweDsKKyAgICBmb250LXNpemU6IDI3cHg7Cit9CisKKy5wb3N0LWhlYWQgaDEgYTpob3ZlciB7CisgICAgY29sb3I6Izc3NzsKK30KKworCisucG9zdC1oZWFkLW5vdGZvdW5kIGgxLCAucG9zdC1oZWFkLTQwNCBoMSwgLnBvc3QtaGVhZC1hcmNoaXZlIGgxLCAucG9zdC1oZWFkLXNlYXJjaCBoMSB7CisgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CisgICAgY29sb3I6IzAwMDsKKyAgICBmb250LXNpemU6IDI3cHg7Cit9CisKKy5wb3N0LXRodW1iIGltZyB7CisgICAgYm9yZGVyOiAwcHggc29saWQgI2ViZWJlYjsKK30KKworLnBvc3QtZW50cnkgaW1neworICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgaGVpZ2h0OmF1dG87CisgICAgICBtYXgtd2lkdGg6MTAwJSAhaW1wb3J0YW50OworfQorCisubWV0YS1kYXRheworICAgIGxpbmUtaGVpZ2h0OiAxNnB4OworICAgIHBhZGRpbmc6IDZweCAzcHg7CisgICAgbWFyZ2luLWJvdHRvbTogM3B4OworICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U5ZTllOTsKK30KKworLm1ldGEtZGF0YSBheworICAgIGNvbG9yOiAjZmQ3ODAwOworfQorCisubWV0YS1kYXRhIGE6aG92ZXJ7CisgICAgY29sb3I6ICM3Nzc7Cit9CisKKy5yZWFkLW1vcmUgeworY29sb3I6ICMwMDA7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICAgIHBhZGRpbmc6IDRweCA4cHg7CisgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICBmb250LXNpemU6IDExcHg7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOworICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworLnJlYWQtbW9yZTpob3ZlcnsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIGNvbG9yOiAjNjY2OworfQorCisuY2xlYXIgeworICAgIGNsZWFyOmJvdGg7Cit9CisKKy5zdGlja3kgeworCit9CisKKy8qIGNvbnRlbnQgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworI2NvbnRlbnRfY29udGFpbmVyIHRhYmxlIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlN2U3OworICAgIG1hcmdpbjogMCAtMXB4IDI0cHggMDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIHdpZHRoOiAxMDAlOworCit9CisjY29udGVudF9jb250YWluZXIgdHIgdGgsCisjY29udGVudF9jb250YWluZXIgdGhlYWQgdGggeworICAgIGNvbG9yOiAjODg4OworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICBwYWRkaW5nOiA5cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ciB0ZCB7CisKKyAgICBwYWRkaW5nOiA2cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ci5vZGQgdGQgeworICAgIGJhY2tncm91bmQ6ICNmMmY3ZmM7Cit9CisKKy8qIHNpZGViYXIqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzaWRlYmFyIHsKKyAgICBwYWRkaW5nOjBweCAyMHB4IDIwcHggMHB4OworfQorCisjc2lkZWJhciB1bCAgeworICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKKyNzaWRlYmFyIHsgd29yZC13cmFwOiBicmVhay13b3JkO30KKworCisvKi0tbmF2aWdhdGlvbi0tKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisubmF2aWdhdGlvbiB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgd2lkdGg6IDEwMCU7CisgICAgbWFyZ2luOiAyMHB4IDA7Cit9CisKKworLm5hdmlnYXRpb24gLmFsaWdubGVmdCBhIHsKKyAgICBmbG9hdDogbGVmdDsKK30KKworLm5hdmlnYXRpb24gLmFsaWducmlnaHQgYSB7CisgICAgZmxvYXQ6IHJpZ2h0OworfQorCisjbmF2LXNpbmdsZSB7CisgICAgb3ZlcmZsb3c6aGlkZGVuOworICAgIG1hcmdpbi10b3A6MjBweDsKKyAgICBtYXJnaW4tYm90dG9tOjEwcHg7Cit9CisubmF2LXByZXZpb3VzIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICB3aWR0aDogNTAlOworfQorLm5hdi1uZXh0IHsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgd2lkdGg6IDUwJTsKK30KKworLyotLXNsaWRlci0tKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc2xpZGVyX2NvbnRhaW5lciB7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKK30KKworLmZsZXgtY2FwdGlvbnsKK2JhY2tncm91bmQ6ICMyMzIzMjM7Citjb2xvcjogI2ZmZjsKK3BhZGRpbmc6IDdweDsKK30KKworLmZsZXhzbGlkZXIgcHsKKyAgICBtYXJnaW46IDBweDsKK30KKworLyotLXN1YiBoZWFkIGFuZCBicmVhZGNydW1icy0tKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc3ViaGVhZF9jb250YWluZXJ7CisgICAgcGFkZGluZzogN3B4IDBweDsKK30KKworI3N1YmhlYWQgaDF7CisgICAgY29sb3I6ICMwMDA7CisgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7CisgICAgZm9udC1zaXplOiAzMHB4OworfQorCisjYnJlYWRjcnVtYnMgeworICAgIHBhZGRpbmctbGVmdDogMjVweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxNXB4OworICAgIGNvbG9yOiAjOWU5ZTllOworICAgIG1hcmdpbjowIGF1dG87CisgICAgd2lkdGg6IDk2NHB4OworICAgIGZvbnQtc2l6ZTogMTBweDsKK30KKworI2JyZWFkY3J1bWJzIGF7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGNvbG9yOiAjOWU5ZTllOworfQorCisvKkFsaWdubWVudHMgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisuYWxpZ25sZWZ0LAoraW1nLmFsaWdubGVmdCB7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGZsb2F0OiBsZWZ0OworICAgIG1hcmdpbi1yaWdodDogMjJweDsKKyAgICBtYXJnaW4tdG9wOiA5cHg7Cit9CisKKy5hbGlnbnJpZ2h0LAoraW1nLmFsaWducmlnaHQgeworICAgIGRpc3BsYXk6IGlubGluZTsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luLWxlZnQ6IDIycHg7CisgICAgbWFyZ2luLXRvcDogOHB4OworfQorLmFsaWduY2VudGVyLAoraW1nLmFsaWduY2VudGVyIHsKKyAgICBjbGVhcjogYm90aDsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9CisKKy5hbGlnbmxlZnQsCisuYWxpZ25yaWdodCwKKy5hbGlnbmNlbnRlciwKK2ltZy5hbGlnbmxlZnQsCitpbWcuYWxpZ25yaWdodCwKK2ltZy5hbGlnbmNlbnRlcgoreworICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cit9CisKKworYSBpbWcuYWxpZ25jZW50ZXIgeworICAgIGRpc3BsYXk6YmxvY2s7CisgICAgbWFyZ2luLWxlZnQ6YXV0bzsKKyAgICBtYXJnaW4tcmlnaHQ6YXV0bzsKK30KKworCit0YWJsZSB7CisgICAgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOworfQordGFibGUsIHRoLCB0ZCB7CisgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisgICAgcGFkZGluZzogNXB4OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hdl9mLnBuZyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hdl9mLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDlhYzJmCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvbmF2X2YucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL3RhYl9iLnBuZyBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL3RhYl9iLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFmYjRlCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvdGFiX2IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvdGhlbWUuY29uZiBiL05GRC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvdGhlbWUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTVhN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3MvbmFtZWRfZGF0YV90aGVtZS90aGVtZS5jb25mCkBAIC0wLDAgKzEsMTUgQEAKK1t0aGVtZV0KK2luaGVyaXQgPSBhZ29nbworc3R5bGVzaGVldCA9IG5hbWVkX2RhdGFfc3R5bGUuY3NzCisjIHB5Z21lbnRzX3N0eWxlID0gc3BoaW54CisKK3RoZW1lX2JvZHlmb250ID0gIm5vcm1hbCAxMnB4IFZlcmRhbmEsIHNhbnMtc2VyaWYiCit0aGVtZV9iZ2NvbG9yID0gIiNjY2MiCisKK3RoZW1lX2RvY3VtZW50d2lkdGggPSAiMTAwJSIKK3RoZW1lX3RleHRhbGlnbiA9ICJsZWZ0IgorCitbb3B0aW9uc10KKworc3RpY2t5c2lkZWJhciA9IHRydWUKK2NvbGxhcHNpYmxlc2lkZWJhciA9IHRydWUKZGlmZiAtLWdpdCBhL05GRC9kb2NzL292ZXJ2aWV3LnJzdCBiL05GRC9kb2NzL292ZXJ2aWV3LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzc2NDlkCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3Mvb3ZlcnZpZXcucnN0CkBAIC0wLDAgKzEsOTAgQEAKK05GRCBPdmVydmlldworPT09PT09PT09PT09CisKKy4uIHRvY3RyZWU6OgorICAgOm1heGRlcHRoOiAyCisKKyAgIFJFTEVBU0VfTk9URVMKKworTkROIEZvcndhcmRpbmcgRGFlbW9uIChORkQpIGlzIGEgbmV0d29yayBmb3J3YXJkZXIgdGhhdCBpbXBsZW1lbnRzIGFuZCBldm9sdmVzIHRvZ2V0aGVyCit3aXRoIHRoZSBOYW1lZCBEYXRhIE5ldHdvcmtpbmcgKE5ETikgYHByb3RvY29sCis8aHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9uZG4tdGx2Lz5gX18uIEFmdGVyIHRoZSBpbml0aWFsIHJlbGVhc2UsIE5GRCB3aWxsIGJlY29tZSBhIGNvcmUKK2NvbXBvbmVudCBvZiB0aGUgYE5ETiBQbGF0Zm9ybSA8aHR0cDovL25hbWVkLWRhdGEubmV0L2NvZGViYXNlL3BsYXRmb3JtLz5gX18gYW5kIHdpbGwKK2ZvbGxvdyB0aGUgc2FtZSByZWxlYXNlIGN5Y2xlLgorCitORkQgaXMgZGV2ZWxvcGVkIGJ5IGEgY29tbXVuaXR5IGVmZm9ydC4gQWx0aG91Z2ggdGhlIGZpcnN0IHJlbGVhc2Ugd2FzIG1vc3RseSBkb25lIGJ5IHRoZQorbWVtYmVycyBvZiBgTlNGLXNwb25zb3JlZCBORE4gcHJvamVjdCB0ZWFtCis8aHR0cDovL25hbWVkLWRhdGEubmV0L3Byb2plY3QvcGFydGljaXBhbnRzLz5gX18sIGl0IGFscmVhZHkgY29udGFpbnMgc2lnbmlmaWNhbnQKK2NvbnRyaWJ1dGlvbnMgZnJvbSBwZW9wbGUgb3V0c2lkZSB0aGUgcHJvamVjdCB0ZWFtIChmb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBgQVVUSE9SUy5tZAorPGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL05GRC9ibG9iL21hc3Rlci9BVVRIT1JTLm1kPmBfXykuICBXZSBzdHJvbmdseSBlbmNvdXJhZ2UKK3BhcnRpY2lwYXRpb24gZnJvbSBhbGwgaW50ZXJlc3RlZCBwYXJ0aWVzLCBzaW5jZSBicm9hZGVyIGNvbW11bml0eSBzdXBwb3J0IGlzIGtleSBmb3IgTkROCit0byBzdWNjZWVkIGFzIGEgbmV3IEludGVybmV0IGFyY2hpdGVjdHVyZS4gQnVnIHJlcG9ydHMgYW5kIGZlZWRiYWNrIGFyZSBoaWdobHkKK2FwcHJlY2lhdGVkIGFuZCBjYW4gYmUgbWFkZSB0aHJvdWdoIGBSZWRtaW5lIHNpdGUKKzxodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQ+YF9fIGFuZCB0aGUgYG5kbi1pbnRlcmVzdCBtYWlsaW5nIGxpc3QKKzxodHRwOi8vd3d3Lmxpc3RzLmNzLnVjbGEuZWR1L21haWxtYW4vbGlzdGluZm8vbmRuLWludGVyZXN0PmBfXy4KKworVGhlIG1haW4gZGVzaWduIGdvYWwgb2YgTkZEIGlzIHRvIHN1cHBvcnQgZGl2ZXJzZSBleHBlcmltZW50YXRpb24gb2YgTkROIHRlY2hub2xvZ3kuIFRoZQorZGVzaWduIGVtcGhhc2l6ZXMgKm1vZHVsYXJpdHkqIGFuZCAqZXh0ZW5zaWJpbGl0eSogdG8gYWxsb3cgZWFzeSBleHBlcmltZW50cyB3aXRoIG5ldworcHJvdG9jb2wgZmVhdHVyZXMsIGFsZ29yaXRobXMsIGFuZCBhcHBsaWNhdGlvbnMuIFdlIGhhdmUgbm90IGZ1bGx5IG9wdGltaXplZCB0aGUgY29kZSBmb3IKK3BlcmZvcm1hbmNlLiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgYXJlIG9uZSB0eXBlIG9mIGV4cGVyaW1lbnRzCit0aGF0IGRldmVsb3BlcnMgY2FuIGNvbmR1Y3QgYnkgdHJ5aW5nIG91dCBkaWZmZXJlbnQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkaWZmZXJlbnQKK2FsZ29yaXRobXM7IG92ZXIgdGltZSwgYmV0dGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZW1lcmdlIHdpdGhpbiB0aGUgc2FtZSBkZXNpZ24gZnJhbWV3b3JrLgorVG8gZmFjaWxpdGF0ZSBzdWNoIGV4cGVyaW1lbnRhdGlvbiB3aXRoIHRoZSBmb3J3YXJkZXIsIHRoZSBORkQgdGVhbSBoYXMgYWxzbyB3cml0dGVuIGEKK2BkZXZlbG9wZXIncyBndWlkZSA8aHR0cDovL25hbWVkLWRhdGEubmV0L3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzA3L05GRC1kZXZlbG9wZXItZ3VpZGUucGRmPmBfLAord2hpY2ggZGV0YWlscyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhbmQgcHJvdmlkZXMgdGlwcyBmb3IgZXh0ZW5kaW5nIGFsbCBhc3BlY3RzIG9mCitORkQuCisKK05GRCB3aWxsIGtlZXAgZXZvbHZpbmcgaW4gdGhyZWUgYXNwZWN0czogaW1wcm92ZW1lbnQgb2YgdGhlIG1vZHVsYXJpdHkgZnJhbWV3b3JrLCBrZWVwaW5nCit1cCB3aXRoIHRoZSBORE4gcHJvdG9jb2wgc3BlYywgYW5kIGFkZGl0aW9uIG9mIG90aGVyIG5ldyBmZWF0dXJlcy4gV2UgaG9wZSB0byBrZWVwIHRoZQorbW9kdWxhciBmcmFtZXdvcmsgc3RhYmxlIGFuZCBsZWFuLCBhbGxvd2luZyByZXNlYXJjaGVycyB0byBpbXBsZW1lbnQgYW5kIGV4cGVyaW1lbnQKK3dpdGggdmFyaW91cyBmZWF0dXJlcywgc29tZSBvZiB3aGljaCBtYXkgZXZlbnR1YWxseSB3b3JrIGludG8gdGhlIHByb3RvY29sIHNwZWMuCisKK1RoZSBkZXNpZ24gYW5kIGRldmVsb3BtZW50IG9mIE5GRCBiZW5lZml0ZWQgZnJvbSBvdXIgZWFybGllciBleHBlcmllbmNlIHdpdGggYENDTngKKzxodHRwOi8vd3d3LmNjbngub3JnPmBfXyBzb2Z0d2FyZSBwYWNrYWdlLiBIb3dldmVyLCBORkQgaXMgbm90IGluIGFueSBwYXJ0IGRlcml2ZWQgZnJvbQorQ0NOeCBjb2RlYmFzZSBhbmQgZG9lcyBub3QgbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIENDTnguCisKKworTWFqb3IgTW9kdWxlcyBvZiBORkQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05GRCBoYXMgdGhlIGZvbGxvd2luZyBtYWpvciBtb2R1bGVzOgorCistIENvcmUKKyAgICBQcm92aWRlcyB2YXJpb3VzIGNvbW1vbiBzZXJ2aWNlcyBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgTkZEIG1vZHVsZXMuIFRoZXNlIGluY2x1ZGUKKyAgICBoYXNoIGNvbXB1dGF0aW9uIHJvdXRpbmVzLCBETlMgcmVzb2x2ZXIsIGNvbmZpZyBmaWxlLCBmYWNlIG1vbml0b3JpbmcsIGFuZAorICAgIHNldmVyYWwgb3RoZXIgbW9kdWxlcy4KKworLSBGYWNlcworICAgIEltcGxlbWVudHMgdGhlIE5ETiBmYWNlIGFic3RyYWN0aW9uIG9uIHRvcCBvZiBkaWZmZXJlbnQgbG93ZXIgbGV2ZWwgdHJhbnNwb3J0CisgICAgbWVjaGFuaXNtcy4KKworLSBUYWJsZXMKKyAgICBJbXBsZW1lbnRzIHRoZSBDb250ZW50IFN0b3JlIChDUyksIHRoZSBQZW5kaW5nIEludGVyZXN0IFRhYmxlIChQSVQpLCB0aGUgRm9yd2FyZGluZworICAgIEluZm9ybWF0aW9uIEJhc2UgKEZJQiksIGFuZCBvdGhlciBkYXRhIHN0cnVjdHVyZXMgdG8gc3VwcG9ydCBmb3J3YXJkaW5nIG9mIE5ETiBEYXRhCisgICAgYW5kIEludGVyZXN0IHBhY2tldHMuCisKKy0gRm9yd2FyZGluZworICAgIEltcGxlbWVudHMgYmFzaWMgcGFja2V0IHByb2Nlc3NpbmcgcGF0aHdheXMsIHdoaWNoIGludGVyYWN0IHdpdGggRmFjZXMsIFRhYmxlcywKKyAgICBhbmQgU3RyYXRlZ2llcy4KKworICArICoqU3RyYXRlZ3kgU3VwcG9ydCoqLCBhIG1ham9yIHBhcnQgb2YgdGhlIGZvcndhcmRpbmcgbW9kdWxlCisgICAgICBJbXBsZW1lbnRzIGEgZnJhbWV3b3JrIHRvIHN1cHBvcnQgZGlmZmVyZW50IGZvcndhcmRpbmcgc3RyYXRlZ2llcy4gSXQgaW5jbHVkZXMKKyAgICAgIFN0cmF0ZWd5Q2hvaWNlLCBNZWFzdXJlbWVudHMsIFN0cmF0ZWdpZXMsIGFuZCBob29rcyBpbiB0aGUgZm9yd2FyZGluZyBwaXBlbGluZXMuIFRoZQorICAgICAgU3RyYXRlZ3lDaG9pY2UgcmVjb3JkcyB0aGUgY2hvaWNlIG9mIHRoZSBzdHJhdGVneSBmb3IgYSBuYW1lc3BhY2UsIGFuZCBNZWFzdXJlbWVudAorICAgICAgcmVjb3JkcyBhcmUgdXNlZCBieSBzdHJhdGVnaWVzIHRvIHN0b3JlIHBhc3QgcGVyZm9ybWFuY2UgcmVzdWx0cyBmb3IgbmFtZXNwYWNlcy4KKworLSBNYW5hZ2VtZW50CisgICAgSW1wbGVtZW50cyB0aGUgYE5GRCBNYW5hZ2VtZW50IFByb3RvY29sCisgICAgPGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL01hbmFnZW1lbnQ+YF8sIHdoaWNoIGFsbG93cworICAgIGFwcGxpY2F0aW9ucyB0byBjb25maWd1cmUgTkZEIGFuZCBzZXQvcXVlcnkgTkZEJ3MgaW50ZXJuYWwgc3RhdGVzLiAgUHJvdG9jb2wgaW50ZXJhY3Rpb24KKyAgICBpcyBkb25lIHZpYSBORE4ncyBJbnRlcmVzdC9EYXRhIGV4Y2hhbmdlIGJldHdlZW4gYXBwbGljYXRpb25zIGFuZCBORkQuCisKKy0gUklCIE1hbmFnZW1lbnQKKyAgICBNYW5hZ2VzIHRoZSByb3V0aW5nIGluZm9ybWF0aW9uIGJhc2UgKFJJQikuICBUaGUgUklCIG1heSBiZSB1cGRhdGVkIGJ5IGRpZmZlcmVudCBwYXJ0aWVzCisgICAgaW4gZGlmZmVyZW50IHdheXMsIGluY2x1ZGluZyB2YXJpb3VzIHJvdXRpbmcgcHJvdG9jb2xzLCBhcHBsaWNhdGlvbidzIHByZWZpeAorICAgIHJlZ2lzdHJhdGlvbnMsIGFuZCBjb21tYW5kLWxpbmUgbWFuaXB1bGF0aW9uIGJ5IHN5c2FkbWlucy4gIFRoZSBSSUIgbWFuYWdlbWVudCBtb2R1bGUKKyAgICBwcm9jZXNzZXMgYWxsIHRoZXNlIHJlcXVlc3RzIHRvIGdlbmVyYXRlIGEgY29uc2lzdGVudCBmb3J3YXJkaW5nIHRhYmxlLCBhbmQgdGhlbiBzeW5jcworICAgIGl0IHVwIHdpdGggdGhlIE5GRCdzIEZJQiwgd2hpY2ggY29udGFpbnMgb25seSB0aGUgbWluaW1hbCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yCisgICAgZm9yd2FyZGluZyBkZWNpc2lvbnMuIFN0cmljdGx5IHNwZWFraW5nIFJJQiBtYW5hZ2VtZW50IGlzIHBhcnQgb2YgdGhlIE5GRCBtYW5hZ2VtZW50CisgICAgbW9kdWxlLiBIb3dldmVyLCBkdWUgdG8gaXRzIGltcG9ydGFuY2UgdG8gdGhlIG92ZXJhbGwgb3BlcmF0aW9ucyBhbmQgaXRzIG1vcmUgY29tcGxleAorICAgIHByb2Nlc3NpbmcsIHdlIG1ha2UgaXQgYSBzZXBhcmF0ZSBtb2R1bGUuCmRpZmYgLS1naXQgYS9ORkQvZG9jcy9zY2hlbWEucnN0IGIvTkZEL2RvY3Mvc2NoZW1hLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM3NjExCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL2RvY3Mvc2NoZW1hLnJzdApAQCAtMCwwICsxLDEyIEBACisuLiBfbmZkLXN0YXR1cyB4bWwgc2NoZW1hOgorCitORkQgU3RhdHVzIFhNTCBTY2hlbWEKKz09PT09PT09PT09PT09PT09PT09PQorCitUaGUgTkZEIHN0YXR1cyBYTUwgc2NoZW1hIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBORkQgc3RhdHVzIFhNTAorZG9jdW1lbnQgZ2VuZXJhdGVkIGJ5IGNvbW1hbmQgYGBuZmQtc3RhdHVzYGAuCisKK1VzZXJzIGNhbiB1c2UgdGhpcyBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGdlbmVyYXRlZCBYTUwgZG9jdW1lbnQuCisKKy4uIGxpdGVyYWxpbmNsdWRlOjogX3N0YXRpYy9uZmQtc3RhdHVzLnhzZAorICAgOmxhbmd1YWdlOiB4bWwKZGlmZiAtLWdpdCBhL05GRC9uZmQuY29uZi5zYW1wbGUuaW4gYi9ORkQvbmZkLmNvbmYuc2FtcGxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWUzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvbmZkLmNvbmYuc2FtcGxlLmluCkBAIC0wLDAgKzEsMzE2IEBACis7IFRoZSBnZW5lcmFsIHNlY3Rpb24gY29udGFpbnMgc2V0dGluZ3Mgb2YgbmZkIHByb2Nlc3MuCitnZW5lcmFsCit7CisgIDsgU3BlY2lmeSBhIHVzZXIgYW5kL29yIGdyb3VwIGZvciBORkQgdG8gZHJvcCBwcml2aWxlZ2VzIHRvCisgIDsgd2hlbiBub3QgcGVyZm9ybWluZyBwcml2aWxlZ2VkIHRhc2tzLiBORkQgZG9lcyBub3QgZHJvcAorICA7IHByaXZpbGVnZXMgYnkgZGVmYXVsdC4KKworICA7IHVzZXIgbmRuLXVzZXIKKyAgOyBncm91cCBuZG4tdXNlcgorfQorCitsb2cKK3sKKyAgOyBkZWZhdWx0X2xldmVsIHNwZWNpZmllcyB0aGUgbG9nZ2luZyBsZXZlbCBmb3IgbW9kdWxlcworICA7IHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IG5hbWVkLiBBbGwgZGVidWdnaW5nIGxldmVscworICA7IGxpc3RlZCBhYm92ZSB0aGUgc2VsZWN0ZWQgdmFsdWUgYXJlIGVuYWJsZWQuCisgIDsKKyAgOyBWYWxpZCB2YWx1ZXM6CisgIDsKKyAgOyAgTk9ORSA7IG5vIG1lc3NhZ2VzCisgIDsgIEVSUk9SIDsgZXJyb3IgbWVzc2FnZXMKKyAgOyAgV0FSTiA7IHdhcm5pbmcgbWVzc2FnZXMKKyAgOyAgSU5GTyA7IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKGRlZmF1bHQpCisgIDsgIERFQlVHIDsgZGVidWdnaW5nIG1lc3NhZ2VzCisgIDsgIFRSQUNFIDsgdHJhY2UgbWVzc2FnZXMgKG1vc3QgdmVyYm9zZSkKKyAgOyAgQUxMIDsgYWxsIG1lc3NhZ2VzCisKKyAgZGVmYXVsdF9sZXZlbCBJTkZPCisKKyAgOyBZb3UgbWF5IG92ZXJyaWRlIGRlZmF1bHRfbGV2ZWwgYnkgYXNzaWduaW5nIGEgbG9nZ2luZyBsZXZlbAorICA7IHRvIHRoZSBkZXNpcmVkIG1vZHVsZSBuYW1lLiBNb2R1bGUgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHR3byB3YXlzOgorICA7CisgIDsgUnVuOgorICA7ICAgbmZkIC0tbW9kdWxlcworICA7ICAgbnJkIC0tbW9kdWxlcworICA7CisgIDsgT3IgbG9vayBmb3IgTkZEX0xPR19JTklUKDxtb2R1bGUgbmFtZT4pIHN0YXRlbWVudHMgaW4gLmNwcCBmaWxlcworICA7CisgIDsgRXhhbXBsZSBtb2R1bGUtbGV2ZWwgc2V0dGluZ3M6CisgIDsKKyAgOyBGaWJNYW5hZ2VyIERFQlVHCisgIDsgRm9yd2FyZGVyIElORk8KK30KKworOyBUaGUgdGFibGVzIHNlY3Rpb24gY29uZmlndXJlcyB0aGUgQ1MsIFBJVCwgRklCLCBTdHJhdGVneSBDaG9pY2UsIGFuZCBNZWFzdXJlbWVudHMKK3RhYmxlcworeworCisgIDsgQ29udGVudFN0b3JlIHNpemUgbGltaXQgaW4gbnVtYmVyIG9mIHBhY2tldHMKKyAgOyBkZWZhdWx0IGlzIDY1NTM2LCBhYm91dCA1MDBNQiB3aXRoIDhLQiBwYWNrZXQgc2l6ZQorICBjc19tYXhfcGFja2V0cyA2NTUzNgorCisgIDsgU2V0IHRoZSBmb3J3YXJkaW5nIHN0cmF0ZWd5IGZvciB0aGUgc3BlY2lmaWVkIHByZWZpeGVzOgorICA7ICAgPHByZWZpeD4gPHN0cmF0ZWd5PgorICBzdHJhdGVneV9jaG9pY2UKKyAgeworICAgIC8gICAgICAgICAgICAgICAvbG9jYWxob3N0L25mZC9zdHJhdGVneS9iZXN0LXJvdXRlCisgICAgL2xvY2FsaG9zdCAgICAgIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jyb2FkY2FzdAorICAgIC9sb2NhbGhvc3QvbmZkICAvbG9jYWxob3N0L25mZC9zdHJhdGVneS9iZXN0LXJvdXRlCisgICAgL25kbi9icm9hZGNhc3QgIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jyb2FkY2FzdAorICB9Cit9CisKKzsgVGhlIGZhY2Vfc3lzdGVtIHNlY3Rpb24gZGVmaW5lcyB3aGF0IGZhY2VzIGFuZCBjaGFubmVscyBhcmUgY3JlYXRlZC4KK2ZhY2Vfc3lzdGVtCit7CisgIDsgVGhlIHVuaXggc2VjdGlvbiBjb250YWlucyBzZXR0aW5ncyBvZiBVbml4IHN0cmVhbSBmYWNlcyBhbmQgY2hhbm5lbHMuCisgIDsgVW5peCBjaGFubmVsIGlzIGFsd2F5cyBsaXN0ZW5pbmc7IGRlbGV0ZSB1bml4IHNlY3Rpb24gdG8gZGlzYWJsZQorICA7IFVuaXggc3RyZWFtIGZhY2VzIGFuZCBjaGFubmVscy4KKyAgOworICA7IFRoZSBuZG4tY3h4IGxpYnJhcnkgZXhwZWN0cyB1bml4Oi8vL3Zhci9ydW4vbmZkLnNvY2sKKyAgOyB0byBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCBvcHRpb24uIFBsZWFzZSBjaGFuZ2UKKyAgOyB0aGUgInRyYW5zcG9ydCIgZmllbGQgaW4gY2xpZW50LmNvbmYgdG8gYW4gYXBwcm9wcmlhdGUgdGNwNCBGYWNlVXJpCisgIDsgaWYgeW91IG5lZWQgdG8gZGlzYWJsZSB1bml4IHNvY2tldHMuCisgIHVuaXgKKyAgeworICAgIHBhdGggL3Zhci9ydW4vbmZkLnNvY2sgOyBVbml4IHN0cmVhbSBsaXN0ZW5lciBwYXRoCisgIH0KKworICA7IFRoZSB0Y3Agc2VjdGlvbiBjb250YWlucyBzZXR0aW5ncyBvZiBUQ1AgZmFjZXMgYW5kIGNoYW5uZWxzLgorICB0Y3AKKyAgeworICAgIGxpc3RlbiB5ZXMgOyBzZXQgdG8gJ25vJyB0byBkaXNhYmxlIFRDUCBsaXN0ZW5lciwgZGVmYXVsdCAneWVzJworICAgIHBvcnQgNjM2MyA7IFRDUCBsaXN0ZW5lciBwb3J0IG51bWJlcgorICAgIGVuYWJsZV92NCB5ZXMgOyBzZXQgdG8gJ25vJyB0byBkaXNhYmxlIElQdjQgY2hhbm5lbHMsIGRlZmF1bHQgJ3llcycKKyAgICBlbmFibGVfdjYgeWVzIDsgc2V0IHRvICdubycgdG8gZGlzYWJsZSBJUHY2IGNoYW5uZWxzLCBkZWZhdWx0ICd5ZXMnCisgIH0KKworICA7IFRoZSB1ZHAgc2VjdGlvbiBjb250YWlucyBzZXR0aW5ncyBvZiBVRFAgZmFjZXMgYW5kIGNoYW5uZWxzLgorICA7IFVEUCBjaGFubmVsIGlzIGFsd2F5cyBsaXN0ZW5pbmc7IGRlbGV0ZSB1ZHAgc2VjdGlvbiB0byBkaXNhYmxlIFVEUAorICB1ZHAKKyAgeworICAgIHBvcnQgNjM2MyA7IFVEUCB1bmljYXN0IHBvcnQgbnVtYmVyCisgICAgZW5hYmxlX3Y0IHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgSVB2NCBjaGFubmVscywgZGVmYXVsdCAneWVzJworICAgIGVuYWJsZV92NiB5ZXMgOyBzZXQgdG8gJ25vJyB0byBkaXNhYmxlIElQdjYgY2hhbm5lbHMsIGRlZmF1bHQgJ3llcycKKyAgICBpZGxlX3RpbWVvdXQgNjAwIDsgaWRsZSB0aW1lIChzZWNvbmRzKSBiZWZvcmUgY2xvc2luZyBhIFVEUCB1bmljYXN0IGZhY2UKKyAgICBrZWVwX2FsaXZlX2ludGVydmFsIDI1OyBpbnRlcnZhbCAoc2Vjb25kcykgYmV0d2VlbiBrZWVwLWFsaXZlIHJlZnJlc2hlcworCisgICAgOyBVRFAgbXVsdGljYXN0IHNldHRpbmdzCisgICAgOyBORkQgY3JlYXRlcyBvbmUgVURQIG11bHRpY2FzdCBmYWNlIHBlciBOSUMKKyAgICA7CisgICAgOyBJbiBtdWx0aS1ob21lZCBMaW51eCBtYWNoaW5lcyB0aGVzZSBzZXR0aW5ncyB3aWxsIE5PVCB3b3JrIHdpdGhvdXQKKyAgICA7IHJvb3Qgb3Igc2V0dGluZ3MgdGhlIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zOgorICAgIDsKKyAgICA7ICAgIHN1ZG8gc2V0Y2FwIGNhcF9uZXRfcmF3PWVpcCAvZnVsbC9wYXRoL25mZAorICAgIDsKKyAgICBtY2FzdCB5ZXMgOyBzZXQgdG8gJ25vJyB0byBkaXNhYmxlIFVEUCBtdWx0aWNhc3QsIGRlZmF1bHQgJ3llcycKKyAgICBtY2FzdF9wb3J0IDU2MzYzIDsgVURQIG11bHRpY2FzdCBwb3J0IG51bWJlcgorICAgIG1jYXN0X2dyb3VwIDIyNC4wLjIzLjE3MCA7IFVEUCBtdWx0aWNhc3QgZ3JvdXAgKElQdjQgb25seSkKKyAgfQorCisgIDsgVGhlIGV0aGVyIHNlY3Rpb24gY29udGFpbnMgc2V0dGluZ3Mgb2YgRXRoZXJuZXQgZmFjZXMgYW5kIGNoYW5uZWxzLgorICA7IFRoZXNlIHNldHRpbmdzIHdpbGwgTk9UIHdvcmsgd2l0aG91dCByb290IG9yIHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlCisgIDsgcGVybWlzc2lvbnM6CisgIDsKKyAgOyAgICBzdWRvIHNldGNhcCBjYXBfbmV0X3JhdyxjYXBfbmV0X2FkbWluPWVpcCAvZnVsbC9wYXRoL25mZAorICA7CisgIDsgWW91IG1heSBuZWVkIHRvIGluc3RhbGwgYSBwYWNrYWdlIHRvIHVzZSBzZXRjYXA6CisgIDsKKyAgOyAqKlVidW50dToqKgorICA7CisgIDsgICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgbGliY2FwMi1iaW4KKyAgOworICA7ICoqTWFjIE9TIFg6KioKKyAgOworICA7ICAgIGN1cmwgaHR0cHM6Ly9idWdzLndpcmVzaGFyay5vcmcvYnVnemlsbGEvYXR0YWNobWVudC5jZ2k/aWQ9MzM3MyAtbyBDaG1vZEJQRi50YXIuZ3oKKyAgOyAgICB0YXIgenh2ZiBDaG1vZEJQRi50YXIuZ3oKKyAgOyAgICBvcGVuIENobW9kQlBGL0luc3RhbGxcIENobW9kQlBGLmFwcAorICA7CisgIDsgb3IgbWFudWFsbHk6CisgIDsKKyAgOyAgICBzdWRvIGNoZ3JwIGFkbWluIC9kZXYvYnBmKgorICA7ICAgIHN1ZG8gY2htb2QgZytydyAvZGV2L2JwZioKKworICBASUZfSEFWRV9MSUJQQ0FQQGV0aGVyCisgIEBJRl9IQVZFX0xJQlBDQVBAeworICBASUZfSEFWRV9MSUJQQ0FQQCAgOyBFdGhlcm5ldCBtdWx0aWNhc3Qgc2V0dGluZ3MKKyAgQElGX0hBVkVfTElCUENBUEAgIDsgTkZEIGNyZWF0ZXMgb25lIEV0aGVybmV0IG11bHRpY2FzdCBmYWNlIHBlciBOSUMKKyAgQElGX0hBVkVfTElCUENBUEAKKyAgQElGX0hBVkVfTElCUENBUEAgIG1jYXN0IHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgRXRoZXJuZXQgbXVsdGljYXN0LCBkZWZhdWx0ICd5ZXMnCisgIEBJRl9IQVZFX0xJQlBDQVBAICBtY2FzdF9ncm91cCAwMTowMDo1RTowMDoxNzpBQSA7IEV0aGVybmV0IG11bHRpY2FzdCBncm91cAorICBASUZfSEFWRV9MSUJQQ0FQQH0KKworICA7IFRoZSB3ZWJzb2NrZXQgc2VjdGlvbiBjb250YWlucyBzZXR0aW5ncyBvZiBXZWJTb2NrZXQgZmFjZXMgYW5kIGNoYW5uZWxzLgorCisgIEBJRl9IQVZFX1dFQlNPQ0tFVEB3ZWJzb2NrZXQKKyAgQElGX0hBVkVfV0VCU09DS0VUQHsKKyAgQElGX0hBVkVfV0VCU09DS0VUQCAgbGlzdGVuIHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgV2ViU29ja2V0IGxpc3RlbmVyLCBkZWZhdWx0ICd5ZXMnCisgIEBJRl9IQVZFX1dFQlNPQ0tFVEAgIHBvcnQgOTY5NiA7IFdlYlNvY2tldCBsaXN0ZW5lciBwb3J0IG51bWJlcgorICBASUZfSEFWRV9XRUJTT0NLRVRAICBlbmFibGVfdjQgeWVzIDsgc2V0IHRvICdubycgdG8gZGlzYWJsZSBsaXN0ZW5pbmcgb24gSVB2NCBzb2NrZXQsIGRlZmF1bHQgJ3llcycKKyAgQElGX0hBVkVfV0VCU09DS0VUQCAgZW5hYmxlX3Y2IHllcyA7IHNldCB0byAnbm8nIHRvIGRpc2FibGUgbGlzdGVuaW5nIG9uIElQdjYgc29ja2V0LCBkZWZhdWx0ICd5ZXMnCisgIEBJRl9IQVZFX1dFQlNPQ0tFVEB9Cit9CisKKzsgVGhlIGF1dGhvcml6YXRpb25zIHNlY3Rpb24gZ3JhbnRzIHByaXZpbGVnZXMgdG8gYXV0aG9yaXplZCBrZXlzLgorYXV0aG9yaXphdGlvbnMKK3sKKyAgOyBBbiBhdXRob3JpemUgc2VjdGlvbiBncmFudHMgcHJpdmlsZWdlcyB0byBhIE5ETiBjZXJ0aWZpY2F0ZS4KKyAgYXV0aG9yaXplCisgIHsKKyAgICA7IElmIHlvdSBkbyBub3QgYWxyZWFkeSBoYXZlIE5ETiBjZXJ0aWZpY2F0ZSwgeW91IGNhbiBnZW5lcmF0ZQorICAgIDsgb25lIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kcy4KKyAgICA7CisgICAgOyAxLiBHZW5lcmF0ZSBhbmQgaW5zdGFsbCBhIHNlbGYtc2lnbmVkIGlkZW50aXR5IGNlcnRpZmljYXRlOgorICAgIDsKKyAgICA7ICAgICAgbmRuc2VjLWtleWdlbiAvYHdob2FtaWAgfCBuZG5zZWMtaW5zdGFsbC1jZXJ0IC0KKyAgICA7CisgICAgOyBOb3RlIHRoYXQgdGhlIGFyZ3VtZW50IHRvIG5kbnNlYy1rZXkgd2lsbCBiZSB0aGUgaWRlbnRpdHkgbmFtZSBvZiB0aGUKKyAgICA7IG5ldyBrZXkgKGluIHRoaXMgY2FzZSwgL3lvdXItdXNlcm5hbWUpLiBJZGVudGl0aWVzIGFyZSBoaWVyYXJjaGljYWwgTkROCisgICAgOyBuYW1lcyBhbmQgbWF5IGhhdmUgbXVsdGlwbGUgY29tcG9uZW50cyAoZS5nLiBgL25kbi91Y2xhL2VkdS9hbGljZWApLgorICAgIDsgWW91IG1heSBjcmVhdGUgYWRkaXRpb25hbCBrZXlzIGFuZCBpZGVudGl0aWVzIGFzIHlvdSBzZWUgZml0LgorICAgIDsKKyAgICA7IDIuIER1bXAgdGhlIE5ETiBjZXJ0aWZpY2F0ZSB0byBhIGZpbGU6CisgICAgOworICAgIDsgICAgICBzdWRvIG1rZGlyIC1wIEBTWVNDT05GRElSQC9uZG4va2V5cy8KKyAgICA7ICAgICAgbmRuc2VjLWNlcnQtZHVtcCAtaSAvYHdob2FtaWAgPiAgZGVmYXVsdC5uZG5jZXJ0CisgICAgOyAgICAgIHN1ZG8gbXYgZGVmYXVsdC5uZG5jZXJ0IEBTWVNDT05GRElSQC9uZG4va2V5cy9kZWZhdWx0Lm5kbmNlcnQKKyAgICA7CisgICAgOyBUaGUgImNlcnRmaWxlIiBmaWVsZCBiZWxvdyBzcGVjaWZpZXMgdGhlIGRlZmF1bHQga2V5IGRpcmVjdG9yeSBmb3IKKyAgICA7IHlvdXIgbWFjaGluZS4gWW91IG1heSBtb3ZlIHlvdXIgbmV3bHkgY3JlYXRlZCBrZXkgdG8gdGhlIGxvY2F0aW9uIGl0CisgICAgOyBzcGVjaWZpZXMgb3IgcGF0aC4KKworICAgIDsgY2VydGZpbGUga2V5cy9kZWZhdWx0Lm5kbmNlcnQgOyBORE4gaWRlbnRpdHkgY2VydGlmaWNhdGUgZmlsZQorICAgIGNlcnRmaWxlIGFueSA7ICJhbnkiIGF1dGhvcml6ZXMgY29tbWFuZCBpbnRlcmVzdHMgc2lnbmVkIHVuZGVyIGFueSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgOyBpLmUuLCBubyBhY3R1YWwgdmFsaWRhdGlvbi4KKyAgICBwcml2aWxlZ2VzIDsgc2V0IG9mIHByaXZpbGVnZXMgZ3JhbnRlZCB0byB0aGlzIGlkZW50aXR5CisgICAgeworICAgICAgZmFjZXMKKyAgICAgIGZpYgorICAgICAgc3RyYXRlZ3ktY2hvaWNlCisgICAgfQorICB9CisKKyAgOyBZb3UgbWF5IGhhdmUgbXVsdGlwbGUgYXV0aG9yaXplIHNlY3Rpb25zIHRoYXQgc3BlY2lmeSBhZGRpdGlvbmFsCisgIDsgY2VydGlmaWNhdGVzIGFuZCB0aGVpciBwcml2aWxlZ2VzLgorCisgIDsgYXV0aG9yaXplCisgIDsgeworICA7ICAgY2VydGZpbGUga2V5cy90aGlzX2NlcnRfZG9lc19ub3RfZXhpc3QubmRuY2VydAorICA7ICAgYXV0aG9yaXplCisgIDsgICBwcml2aWxlZ2VzCisgIDsgICB7CisgIDsgICAgIGZhY2VzCisgIDsgICB9CisgIDsgfQorfQorCityaWIKK3sKKyAgOyBUaGUgZm9sbG93aW5nIGxvY2FsaG9zdF9zZWN1cml0eSBhbGxvd3MgYW55b25lIHRvIHJlZ2lzdGVyIHJvdXRpbmcgZW50cmllcyBpbiBsb2NhbCBSSUIKKyAgbG9jYWxob3N0X3NlY3VyaXR5CisgIHsKKyAgICB0cnVzdC1hbmNob3IKKyAgICB7CisgICAgICB0eXBlIGFueQorICAgIH0KKyAgfQorCisgIDsgbG9jYWxob3Bfc2VjdXJpdHkgc2hvdWxkIGJlIGVuYWJsZWQgd2hlbiBORkQgcnVucyBvbiBhIGh1Yi4KKyAgOyAiL2xvY2FsaG9wL25mZC9maWIiIGNvbW1hbmQgcHJlZml4IHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBsb2NhbGhvcF9zZWN1cml0eSBzZWN0aW9uIGlzIG1pc3NpbmcuCisgIDsgbG9jYWxob3Bfc2VjdXJpdHkKKyAgOyB7CisgIDsgICA7IFRoaXMgc2VjdGlvbiBkZWZpbmVzIHRoZSB0cnVzdCBtb2RlbCBmb3IgTkZEIFJJQiBNYW5hZ2VtZW50LiBJdCBjb25zaXN0cyBvZiBydWxlcyBhbmQKKyAgOyAgIDsgdHJ1c3QtYW5jaG9ycywgd2hpY2ggYXJlIGJyaWVmbHkgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0bworICA7ICAgOyBtYW5wYWdlIG9mIG5kbi12YWxpZGF0b3IuY29uZjoKKyAgOyAgIDsKKyAgOyAgIDsgICAgIG1hbiBuZG4tdmFsaWRhdG9yLmNvbmYKKyAgOyAgIDsKKyAgOyAgIDsgQSB0cnVzdC1hbmNob3IgaXMgYSBwcmUtdHJ1c3RlZCBjZXJ0aWZpY2F0ZS4gIFRoaXMgY2FuIGJlIGFueSBjZXJ0aWZpY2F0ZSB0aGF0IGlzIHRoZQorICA7ICAgOyByb290IG9mIGNlcnRpZmljYXRpb24gY2hhaW4gKGUuZy4sIE5ETiB0ZXN0YmVkIHJvb3QgY2VydGlmaWNhdGUpIG9yIGFuIGV4aXN0aW5nCisgIDsgICA7IGRlZmF1bHQgc3lzdGVtIGNlcnRpZmljYXRlIGBkZWZhdWx0Lm5kbmNlcnRgLgorICA7ICAgOworICA7ICAgOyBBIHJ1bGUgZGVmaW5lcyBjb25kaXRpb25zIGEgdmFsaWQgcGFja2V0IE1VU1QgaGF2ZS4gQSBwYWNrZXQgbXVzdCBzYXRpc2Z5IG9uZSBvZiB0aGUKKyAgOyAgIDsgcnVsZXMgZGVmaW5lZCBoZXJlLiBBIHJ1bGUgY2FuIGJlIGJyb2tlbiBpbnRvIHR3byBwYXJ0czogbWF0Y2hpbmcgJiBjaGVja2luZy4gQSBwYWNrZXQKKyAgOyAgIDsgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgcnVsZXMgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIGxhc3QgdW50aWwgYSBtYXRjaGVkIHJ1bGUgaXMKKyAgOyAgIDsgZW5jb3VudGVyZWQuIFRoZSBtYXRjaGVkIHJ1bGUgd2lsbCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBwYWNrZXQuIElmIGEgcGFja2V0IGRvZXMgbm90CisgIDsgICA7IG1hdGNoIGFueSBydWxlLCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZC4gIFRoZSBtYXRjaGluZyBwYXJ0IG9mIGEgcnVsZSBjb25zaXN0cworICA7ICAgOyBvZiBgZm9yYCBhbmQgYGZpbHRlcmAgc2VjdGlvbnMuIFRoZXkgY29sbGVjdGl2ZWx5IGRlZmluZSB3aGljaCBwYWNrZXRzIGNhbiBiZSBjaGVja2VkCisgIDsgICA7IHdpdGggdGhpcyBydWxlLiBgZm9yYCBkZWZpbmVzIHBhY2tldCB0eXBlIChkYXRhIG9yIGludGVyZXN0KSBhbmQgYGZpbHRlcmAgZGVmaW5lcworICA7ICAgOyBjb25kaXRpb25zIG9uIG90aGVyIHByb3BlcnRpZXMgb2YgYSBwYWNrZXQuIFJpZ2h0IG5vdywgeW91IGNhbiBvbmx5IGRlZmluZSBjb25kaXRpb25zCisgIDsgICA7IG9uIHBhY2tldCBuYW1lLCBhbmQgeW91IGNhbiBvbmx5IHNwZWNpZnkgT05MWSBPTkUgZmlsdGVyIGZvciBwYWNrZXQgbmFtZS4gIFRoZQorICA7ICAgOyBjaGVja2luZyBwYXJ0IG9mIGEgcnVsZSBjb25zaXN0cyBvZiBgY2hlY2tlcmAsIHdoaWNoIGRlZmluZXMgdGhlIGNvbmRpdGlvbnMgdGhhdCBhCisgIDsgICA7IFZBTElEIHBhY2tldCBNVVNUIGhhdmUuIFNlZSBjb21tZW50cyBpbiBjaGVja2VyIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAgOworICA7ICAgcnVsZQorICA7ICAgeworICA7ICAgICBpZCAiTlJEIFByZWZpeCBSZWdpc3RyYXRpb24gQ29tbWFuZCBSdWxlIgorICA7ICAgICBmb3IgaW50ZXJlc3QgICAgICAgICAgICAgICAgICAgICAgICAgOyBydWxlIGZvciBJbnRlcmVzdHMgKHRvIHZhbGlkYXRlIENvbW1hbmRJbnRlcmVzdHMpCisgIDsgICAgIGZpbHRlcgorICA7ICAgICB7CisgIDsgICAgICAgdHlwZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICA7IGNvbmRpdGlvbiBvbiBpbnRlcmVzdCBuYW1lICh3L28gc2lnbmF0dXJlKQorICA7ICAgICAgIHJlZ2V4IF5bPGxvY2FsaG9wPjxsb2NhbGhvc3Q+XTxuZmQ+PHJpYj5bPHJlZ2lzdGVyPjx1bnJlZ2lzdGVyPl08PiQgOyBwcmVmaXggYmVmb3JlCisgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHRpbWVzdGFtcAorICA7ICAgICB9CisgIDsgICAgIGNoZWNrZXIKKyAgOyAgICAgeworICA7ICAgICAgIHR5cGUgY3VzdG9taXplZAorICA7ICAgICAgIHNpZy10eXBlIHJzYS1zaGEyNTYgICAgICAgICAgICAgICAgOyBpbnRlcmVzdCBtdXN0IGhhdmUgYSByc2Etc2hhMjU2IHNpZ25hdHVyZQorICA7ICAgICAgIGtleS1sb2NhdG9yCisgIDsgICAgICAgeworICA7ICAgICAgICAgdHlwZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgOyBrZXkgbG9jYXRvciBtdXN0IGJlIHRoZSBjZXJ0aWZpY2F0ZSBuYW1lIG9mIHRoZQorICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzaWduaW5nIGtleQorICA7ICAgICAgICAgcmVnZXggXltePEtFWT5dKjxLRVk+PD4qPGtzay0uKj48SUQtQ0VSVD4kCisgIDsgICAgICAgfQorICA7ICAgICB9CisgIDsgICB9CisgIDsgICBydWxlCisgIDsgICB7CisgIDsgICAgIGlkICJORE4gVGVzdGJlZCBIaWVyYXJjaHkgUnVsZSIKKyAgOyAgICAgZm9yIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcnVsZSBmb3IgRGF0YSAodG8gdmFsaWRhdGUgTkROIGNlcnRpZmljYXRlcykKKyAgOyAgICAgZmlsdGVyCisgIDsgICAgIHsKKyAgOyAgICAgICB0eXBlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDsgY29uZGl0aW9uIG9uIGRhdGEgbmFtZQorICA7ICAgICAgIHJlZ2V4IF5bXjxLRVk+XSo8S0VZPjw+Kjxrc2stLio+PElELUNFUlQ+PD4kCisgIDsgICAgIH0KKyAgOyAgICAgY2hlY2tlcgorICA7ICAgICB7CisgIDsgICAgICAgdHlwZSBoaWVyYXJjaGljYWwgICAgICAgICAgICAgICAgICA7IHRoZSBjZXJ0aWZpY2F0ZSBuYW1lIG9mIHRoZSBzaWduaW5nIGtleSBhbmQKKyAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgdGhlIGRhdGEgbmFtZSBtdXN0IGZvbGxvdyB0aGUgaGllcmFyY2hpY2FsIG1vZGVsCisgIDsgICAgICAgc2lnLXR5cGUgcnNhLXNoYTI1NiAgICAgICAgICAgICAgICA7IGRhdGEgbXVzdCBoYXZlIGEgcnNhLXNoYTI1NiBzaWduYXR1cmUKKyAgOyAgICAgfQorICA7ICAgfQorICA7ICAgdHJ1c3QtYW5jaG9yCisgIDsgICB7CisgIDsgICAgIHR5cGUgZmlsZQorICA7ICAgICBmaWxlLW5hbWUga2V5cy9kZWZhdWx0Lm5kbmNlcnQgOyB0aGUgZmlsZSBuYW1lLCBieSBkZWZhdWx0IHRoaXMgZmlsZSBzaG91bGQgYmUgcGxhY2VkIGluIHRoZQorICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzYW1lIGZvbGRlciBhcyB0aGlzIGNvbmZpZyBmaWxlLgorICA7ICAgfQorICA7ICAgOyB0cnVzdC1hbmNob3IgOyBDYW4gYmUgcmVwZWF0ZWQgbXVsdGlwbGUgdGltZXMgdG8gc3BlY2lmeSBtdWx0aXBsZSB0cnVzdCBhbmNob3JzCisgIDsgICA7IHsKKyAgOyAgIDsgICB0eXBlIGZpbGUKKyAgOyAgIDsgICBmaWxlLW5hbWUga2V5cy9uZG4tdGVzdGJlZC5uZG5jZXJ0CisgIDsgICA7IH0KKyAgOyB9CisKKyAgOyBUaGUgZm9sbG93aW5nIGxvY2FsaG9wX3NlY3VyaXR5IHNob3VsZCBiZSBlbmFibGVkIHdoZW4gTkZEIHJ1bnMgb24gYSBodWIsCisgIDsgd2hpY2ggYWNjZXB0cyBhbGwgcmVtb3RlIHJlZ2lzdHJhdGlvbnMgYW5kIGlzIGEgc2hvcnQtdGVybSBzb2x1dGlvbi4KKyAgOyBsb2NhbGhvcF9zZWN1cml0eQorICA7IHsKKyAgOyAgIHRydXN0LWFuY2hvcgorICA7ICAgeworICA7ICAgICB0eXBlIGFueQorICA7ICAgfQorICA7IH0KKworICByZW1vdGVfcmVnaXN0ZXIKKyAgeworICAgIGNvc3QgMTUgOyBmb3J3YXJkaW5nIGNvc3Qgb2YgcHJlZml4IHJlZ2lzdGVyZWQgb24gcmVtb3RlIHJvdXRlcgorICAgIHRpbWVvdXQgMTAwMDAgOyB0aW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIG9mIHJlbW90ZSBwcmVmaXggcmVnaXN0cmF0aW9uIGNvbW1hbmQKKyAgICByZXRyeSAwIDsgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgZWFjaCByZW1vdGUgcHJlZml4IHJlZ2lzdHJhdGlvbiBjb21tYW5kCisKKyAgICByZWZyZXNoX2ludGVydmFsIDMwMCA7IGludGVydmFsIChpbiBzZWNvbmRzKSBiZWZvcmUgcmVmcmVzaGluZyB0aGUgcmVnaXN0cmF0aW9uCisgICAgOyBUaGlzIHNldHRpbmcgc2hvdWxkIGJlIGxlc3MgdGhhbiBmYWNlX3N5c3RlbS51ZHAuaWRsZV90aW1lLAorICAgIDsgc28gdGhhdCB0aGUgZmFjZSBpcyBrZXB0IGFsaXZlIG9uIHRoZSByZW1vdGUgcm91dGVyLgorICB9Cit9CmRpZmYgLS1naXQgYS9ORkQvcmliL2ZhY2UtZW50cnkuaHBwIGIvTkZEL3JpYi9mYWNlLWVudHJ5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWVlYjMzCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3JpYi9mYWNlLWVudHJ5LmhwcApAQCAtMCwwICsxLDk0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9SSUJfRkFDRV9FTlRSWV9IUFAKKyNkZWZpbmUgTkZEX1JJQl9GQUNFX0VOVFJZX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CisKKy8qKiBcY2xhc3MgRmFjZUVudHJ5CisgKiAgXGJyaWVmIHJlcHJlc2VudHMgYSByb3V0ZSBmb3IgYSBuYW1lIHByZWZpeAorICovCitjbGFzcyBGYWNlRW50cnkKK3sKK3B1YmxpYzoKKyAgRmFjZUVudHJ5KCkKKyAgICA6IGZhY2VJZCgwKQorICAgICwgb3JpZ2luKDApCisgICAgLCBmbGFncygwKQorICAgICwgY29zdCgwKQorICAgICwgZXhwaXJlcyh0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludDo6bWluKCkpCisgICAgLCBtX2V4cGlyYXRpb25FdmVudCgpCisgIHsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQKKyAgc2V0RXhwaXJhdGlvbkV2ZW50KGNvbnN0IEV2ZW50SWQgZWlkKQorICB7CisgICAgbV9leHBpcmF0aW9uRXZlbnQgPSBlaWQ7CisgIH0KKworICBjb25zdCBFdmVudElkJgorICBnZXRFeHBpcmF0aW9uRXZlbnQoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZXhwaXJhdGlvbkV2ZW50OworICB9CisKK3B1YmxpYzoKKyAgdWludDY0X3QgZmFjZUlkOworICB1aW50NjRfdCBvcmlnaW47CisgIHVpbnQ2NF90IGZsYWdzOworICB1aW50NjRfdCBjb3N0OworICB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCBleHBpcmVzOworCitwcml2YXRlOgorICBFdmVudElkIG1fZXhwaXJhdGlvbkV2ZW50OworfTsKKworaW5saW5lIGJvb2wKK2NvbXBhcmVGYWNlSWRBbmRPcmlnaW4oY29uc3QgRmFjZUVudHJ5JiBlbnRyeTEsIGNvbnN0IEZhY2VFbnRyeSYgZW50cnkyKQoreworICByZXR1cm4gKGVudHJ5MS5mYWNlSWQgPT0gZW50cnkyLmZhY2VJZCAmJiBlbnRyeTEub3JpZ2luID09IGVudHJ5Mi5vcmlnaW4pOworfQorCitpbmxpbmUgYm9vbAorY29tcGFyZUZhY2VJZChjb25zdCBGYWNlRW50cnkmIGVudHJ5LCBjb25zdCB1aW50NjRfdCBmYWNlSWQpCit7CisgIHJldHVybiAoZW50cnkuZmFjZUlkID09IGZhY2VJZCk7Cit9CisKKy8vIE1ldGhvZCBkZWZpbml0aW9uIGluIHJpYi1lbnRyeS5jcHAKK3N0ZDo6b3N0cmVhbSYKK29wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRmFjZUVudHJ5JiBlbnRyeSk7CisKK30gLy8gbmFtZXNwYWNlIHJpYgorfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfUklCX1JJQl9FTlRSWV9IUFAKZGlmZiAtLWdpdCBhL05GRC9yaWIvZmliLXVwZGF0ZS5jcHAgYi9ORkQvcmliL2ZpYi11cGRhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTRmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL2ZpYi11cGRhdGUuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJmaWItdXBkYXRlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcmliIHsKKworc2hhcmVkX3B0cjxGaWJVcGRhdGU+CitGaWJVcGRhdGU6OmNyZWF0ZUFkZFVwZGF0ZShjb25zdCBOYW1lJiBuYW1lLCBjb25zdCB1aW50NjRfdCBmYWNlSWQsIGNvbnN0IHVpbnQ2NF90IGNvc3QpCit7CisgIHNoYXJlZF9wdHI8RmliVXBkYXRlPiB1cGRhdGUgPSBtYWtlX3NoYXJlZDxGaWJVcGRhdGU+KCk7CisKKyAgdXBkYXRlLT5uYW1lID0gbmFtZTsKKyAgdXBkYXRlLT5mYWNlSWQgPSBmYWNlSWQ7CisgIHVwZGF0ZS0+Y29zdCA9IGNvc3Q7CisgIHVwZGF0ZS0+YWN0aW9uID0gQUREX05FWFRIT1A7CisKKyAgcmV0dXJuIHVwZGF0ZTsKK30KKworc2hhcmVkX3B0cjxGaWJVcGRhdGU+CitGaWJVcGRhdGU6OmNyZWF0ZVJlbW92ZVVwZGF0ZShjb25zdCBOYW1lJiBuYW1lLCBjb25zdCB1aW50NjRfdCBmYWNlSWQpCit7CisgIHNoYXJlZF9wdHI8RmliVXBkYXRlPiB1cGRhdGUgPSBtYWtlX3NoYXJlZDxGaWJVcGRhdGU+KCk7CisKKyAgdXBkYXRlLT5uYW1lID0gbmFtZTsKKyAgdXBkYXRlLT5mYWNlSWQgPSBmYWNlSWQ7CisgIHVwZGF0ZS0+YWN0aW9uID0gUkVNT1ZFX05FWFRIT1A7CisKKyAgcmV0dXJuIHVwZGF0ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9yaWIvZmliLXVwZGF0ZS5ocHAgYi9ORkQvcmliL2ZpYi11cGRhdGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzEzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL2ZpYi11cGRhdGUuaHBwCkBAIC0wLDAgKzEsOTAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX1JJQl9GSUJfVVBEQVRFX0hQUAorI2RlZmluZSBORkRfUklCX0ZJQl9VUERBVEVfSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSByaWIgeworCisvKiogXGNsYXNzIEZpYlVwZGF0ZQorICogIFxicmllZiByZXByZXNlbnRzIGEgRklCIHVwZGF0ZQorICovCitjbGFzcyBGaWJVcGRhdGUKK3sKK3B1YmxpYzoKKyAgRmliVXBkYXRlKCkKKyAgICA6IGZhY2VJZCgwKQorICAgICwgY29zdCgwKQorICB7CisgIH0KKworICBzdGF0aWMgc2hhcmVkX3B0cjxGaWJVcGRhdGU+CisgIGNyZWF0ZUFkZFVwZGF0ZShjb25zdCBOYW1lJiBuYW1lLCBjb25zdCB1aW50NjRfdCBmYWNlSWQsIGNvbnN0IHVpbnQ2NF90IGNvc3QpOworCisgIHN0YXRpYyBzaGFyZWRfcHRyPEZpYlVwZGF0ZT4KKyAgY3JlYXRlUmVtb3ZlVXBkYXRlKGNvbnN0IE5hbWUmIG5hbWUsIGNvbnN0IHVpbnQ2NF90IGZhY2VJZCk7CisKKyAgZW51bSBBY3Rpb24KKyAgeworICAgIEFERF9ORVhUSE9QICAgID0gMCwKKyAgICBSRU1PVkVfTkVYVEhPUCA9IDEKKyAgfTsKKworcHVibGljOgorICBOYW1lIG5hbWU7CisgIHVpbnQ2NF90IGZhY2VJZDsKKyAgdWludDY0X3QgY29zdDsKKyAgQWN0aW9uIGFjdGlvbjsKK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEZpYlVwZGF0ZSYgdXBkYXRlKQoreworICBvcyA8PCAiRmliVXBkYXRlKCIKKyAgICAgPDwgIiBOYW1lOiAiIDw8IHVwZGF0ZS5uYW1lIDw8ICIsICIKKyAgICAgPDwgImZhY2VJZDogIiA8PCB1cGRhdGUuZmFjZUlkIDw8ICIsICI7CisKKyAgaWYgKHVwZGF0ZS5hY3Rpb24gPT0gRmliVXBkYXRlOjpBRERfTkVYVEhPUCkKKyAgICB7CisgICAgICBvcyA8PCAiY29zdDogIiA8PCB1cGRhdGUuY29zdCA8PCAiLCAiCisgICAgICAgICA8PCAiYWN0aW9uOiBBRERfTkVYVEhPUCI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgb3MgPDwgImFjdGlvbjogUkVNT1ZFX05FWFRIT1AiOworICAgIH0KKworICBvcyA8PCAiKSI7CisKKyAgcmV0dXJuIG9zOworfQorCit9IC8vIG5hbWVzcGFjZSByaWIKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1JJQl9GSUJfVVBEQVRFX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3JpYi9tYWluLmNwcCBiL05GRC9yaWIvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYTRmNwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9yaWIvbWFpbi5jcHAKQEAgLTAsMCArMSwyNzkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgInZlcnNpb24uaHBwIgorI2luY2x1ZGUgImNvbW1vbi5ocHAiCisjaW5jbHVkZSAicmliLW1hbmFnZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvY29uZmlnLWZpbGUuaHBwIgorI2luY2x1ZGUgImNvcmUvZ2xvYmFsLWlvLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CisKK05GRF9MT0dfSU5JVCgiTlJEIik7CisKK3N0cnVjdCBQcm9ncmFtT3B0aW9ucworeworICBib29sIHNob3dVc2FnZTsKKyAgYm9vbCBzaG93VmVyc2lvbjsKKyAgYm9vbCBzaG93TW9kdWxlczsKKyAgc3RkOjpzdHJpbmcgY29uZmlnOworfTsKKworY2xhc3MgTnJkIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgY2xhc3MgSWdub3JlTmZkQW5kTG9nU2VjdGlvbnMKKyAgeworICBwdWJsaWM6CisgICAgdm9pZAorICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnU2VjdGlvbiYgc2VjdGlvbiwKKyAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4pCisgICAgeworICAgICAgLy8gSWdub3JlICJsb2ciIGFuZCBzZWN0aW9ucyBiZWxvbmdpbmcgdG8gTkZELAorICAgICAgLy8gYnV0IHJhaXNlIGFuIGVycm9yIGlmIHdlJ3JlIG1pc3NpbmcgYSBoYW5kbGVyIGZvciBhbiAicmliXyIgc2VjdGlvbi4KKworICAgICAgaWYgKHNlY3Rpb25OYW1lLmZpbmQoInJpYl8iKSAhPSAwIHx8IHNlY3Rpb25OYW1lID09ICJsb2ciKQorICAgICAgICB7CisgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBtaXNzaW5nIE5SRCBzZWN0aW9uCisgICAgICAgICAgQ29uZmlnRmlsZTo6dGhyb3dFcnJvck9uVW5rbm93blNlY3Rpb24oZmlsZW5hbWUsIHNlY3Rpb25OYW1lLCBzZWN0aW9uLCBpc0RyeVJ1bik7CisgICAgICAgIH0KKyAgICB9CisgIH07CisKKyAgTnJkKCkKKyAgICA6IG1fZmFjZShnZXRHbG9iYWxJb1NlcnZpY2UoKSkKKyAgeworICB9CisKKyAgdm9pZAorICBpbml0aWFsaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb25maWdGaWxlKQorICB7CisgICAgaW5pdGlhbGl6ZUxvZ2dpbmcoY29uZmlnRmlsZSk7CisKKyAgICBtX3JpYk1hbmFnZXIgPSBtYWtlX3NoYXJlZDxSaWJNYW5hZ2VyPihuZG46OnJlZihtX2ZhY2UpKTsKKworICAgIENvbmZpZ0ZpbGUgY29uZmlnKChJZ25vcmVOZmRBbmRMb2dTZWN0aW9ucygpKSk7CisgICAgbV9yaWJNYW5hZ2VyLT5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgICAvLyBwYXJzZSBjb25maWcgZmlsZQorICAgIGNvbmZpZy5wYXJzZShjb25maWdGaWxlLCB0cnVlKTsKKyAgICBjb25maWcucGFyc2UoY29uZmlnRmlsZSwgZmFsc2UpOworCisgICAgbV9yaWJNYW5hZ2VyLT5yZWdpc3RlcldpdGhOZmQoKTsKKyAgICBtX3JpYk1hbmFnZXItPmVuYWJsZUxvY2FsQ29udHJvbEhlYWRlcigpOworICB9CisKKyAgdm9pZAorICBpbml0aWFsaXplTG9nZ2luZyhjb25zdCBzdGQ6OnN0cmluZyYgY29uZmlnRmlsZSkKKyAgeworICAgIENvbmZpZ0ZpbGUgY29uZmlnKCZDb25maWdGaWxlOjppZ25vcmVVbmtub3duU2VjdGlvbik7CisgICAgTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgICBjb25maWcucGFyc2UoY29uZmlnRmlsZSwgdHJ1ZSk7CisgICAgY29uZmlnLnBhcnNlKGNvbmZpZ0ZpbGUsIGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkCisgIHByaW50VXNhZ2Uoc3RkOjpvc3RyZWFtJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2dyYW1OYW1lKQorICB7CisgICAgb3MgPDwgIlVzYWdlOiBcbiIKKyAgICAgICA8PCAiICAiIDw8IHByb2dyYW1OYW1lIDw8ICIgW29wdGlvbnNdXG4iCisgICAgICAgPDwgIlxuIgorICAgICAgIDw8ICJSdW4gTlJEIGRhZW1vblxuIgorICAgICAgIDw8ICJcbiIKKyAgICAgICA8PCAiT3B0aW9uczpcbiIKKyAgICAgICA8PCAiICBbLS1oZWxwXSAgICAtIHByaW50IHRoaXMgaGVscCBtZXNzYWdlXG4iCisgICAgICAgPDwgIiAgWy0tdmVyc2lvbl0gLSBwcmludCB2ZXJzaW9uIGFuZCBleGl0XG4iCisgICAgICAgPDwgIiAgWy0tbW9kdWxlc10gLSBsaXN0IGF2YWlsYWJsZSBsb2dnaW5nIG1vZHVsZXNcbiIKKyAgICAgICA8PCAiICBbLS1jb25maWcgL3BhdGgvdG8vbmZkLmNvbmZdIC0gcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgIgorICAgICAgIDw8ICIoZGVmYXVsdDogIiA8PCBERUZBVUxUX0NPTkZJR19GSUxFIDw8ICIpXG4iCisgICAgICA7CisgIH0KKworICBzdGF0aWMgdm9pZAorICBwcmludE1vZHVsZXMoc3RkOjpvc3RyZWFtJiBvcykKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyAgICBvcyA8PCAiQXZhaWxhYmxlIGxvZ2dpbmcgbW9kdWxlczogXG4iOworCisgICAgbGlzdDxzdHJpbmc+IG1vZHVsZXMoTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5nZXRNb2R1bGVzKCkpOworICAgIGZvciAobGlzdDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpID0gbW9kdWxlcy5iZWdpbigpOyBpICE9IG1vZHVsZXMuZW5kKCk7ICsraSkKKyAgICAgIHsKKyAgICAgICAgb3MgPDwgKmkgPDwgIlxuIjsKKyAgICAgIH0KKyAgfQorCisgIHN0YXRpYyBib29sCisgIHBhcnNlQ29tbWFuZExpbmUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2LCBQcm9ncmFtT3B0aW9ucyYgb3B0aW9ucykKKyAgeworICAgIG9wdGlvbnMuc2hvd1VzYWdlID0gZmFsc2U7CisgICAgb3B0aW9ucy5zaG93VmVyc2lvbiA9IGZhbHNlOworICAgIG9wdGlvbnMuc2hvd01vZHVsZXMgPSBmYWxzZTsKKyAgICBvcHRpb25zLmNvbmZpZyA9IERFRkFVTFRfQ09ORklHX0ZJTEU7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaW50IG9wdGlvbkluZGV4ID0gMDsKKyAgICAgIHN0YXRpYyA6Om9wdGlvbiBsb25nT3B0aW9uc1tdID0geworICAgICAgICB7ICJoZWxwIiAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIDAgfSwKKyAgICAgICAgeyAibW9kdWxlcyIsIG5vX2FyZ3VtZW50ICAgICAgLCAwLCAwIH0sCisgICAgICAgIHsgImNvbmZpZyIgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMCB9LAorICAgICAgICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQgICAgICAsIDAsIDAgfSwKKyAgICAgICAgeyAwICAgICAgICAsIDAgICAgICAgICAgICAgICAgLCAwLCAwIH0KKyAgICAgIH07CisgICAgICBpbnQgYyA9IGdldG9wdF9sb25nX29ubHkoYXJnYywgYXJndiwgIiIsIGxvbmdPcHRpb25zLCAmb3B0aW9uSW5kZXgpOworICAgICAgaWYgKGMgPT0gLTEpCisgICAgICAgIGJyZWFrOworCisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgc3dpdGNoIChvcHRpb25JbmRleCkgeworICAgICAgICBjYXNlIDA6IC8vIGhlbHAKKyAgICAgICAgICBvcHRpb25zLnNob3dVc2FnZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLy8gbW9kdWxlcworICAgICAgICAgIG9wdGlvbnMuc2hvd01vZHVsZXMgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8vIGNvbmZpZworICAgICAgICAgIG9wdGlvbnMuY29uZmlnID0gOjpvcHRhcmc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLy8gdmVyc2lvbgorICAgICAgICAgIG9wdGlvbnMuc2hvd1ZlcnNpb24gPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisgIHZvaWQKKyAgdGVybWluYXRlKGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yLAorICAgICAgICAgICAgaW50IHNpZ25hbE5vLAorICAgICAgICAgICAgYm9vc3Q6OmFzaW86OnNpZ25hbF9zZXQmIHNpZ25hbFNldCkKKyAgeworICAgIGlmIChlcnJvcikKKyAgICAgIHJldHVybjsKKworICAgIGlmIChzaWduYWxObyA9PSBTSUdJTlQgfHwKKyAgICAgICAgc2lnbmFsTm8gPT0gU0lHVEVSTSkKKyAgICAgIHsKKyAgICAgICAgZ2V0R2xvYmFsSW9TZXJ2aWNlKCkuc3RvcCgpOworICAgICAgICBORkRfTE9HX0lORk8oIkNhdWdodCBzaWduYWwgJyIgPDwgc3Ryc2lnbmFsKHNpZ25hbE5vKSA8PCAiJywgZXhpdGluZy4uLiIpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8vIFx0b2RvIE1heSBiZSB0cnkgdG8gcmVsb2FkIGNvbmZpZyBmaWxlCisgICAgICAgIHNpZ25hbFNldC5hc3luY193YWl0KGJpbmQoJk5yZDo6dGVybWluYXRlLCB0aGlzLCBfMSwgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmKHNpZ25hbFNldCkpKTsKKyAgICAgIH0KKyAgfQorCitwcml2YXRlOgorICBzaGFyZWRfcHRyPFJpYk1hbmFnZXI+IG1fcmliTWFuYWdlcjsKKyAgbmRuOjpGYWNlIG1fZmFjZTsKK307CisKK30gLy8gbmFtZXNwYWNlIHJpYgorfSAvLyBuYW1lc3BhY2UgbmZkCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBuZmQ6OnJpYjsKKworICBQcm9ncmFtT3B0aW9ucyBvcHRpb25zOworICBib29sIGlzQ29tbWFuZExpbmVWYWxpZCA9IE5yZDo6cGFyc2VDb21tYW5kTGluZShhcmdjLCBhcmd2LCBvcHRpb25zKTsKKyAgaWYgKCFpc0NvbW1hbmRMaW5lVmFsaWQpIHsKKyAgICBOcmQ6OnByaW50VXNhZ2Uoc3RkOjpjZXJyLCBhcmd2WzBdKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAob3B0aW9ucy5zaG93VXNhZ2UpIHsKKyAgICBOcmQ6OnByaW50VXNhZ2Uoc3RkOjpjb3V0LCBhcmd2WzBdKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChvcHRpb25zLnNob3dNb2R1bGVzKSB7CisgICAgTnJkOjpwcmludE1vZHVsZXMoc3RkOjpjb3V0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChvcHRpb25zLnNob3dWZXJzaW9uKSB7CisgICAgc3RkOjpjb3V0IDw8IE5GRF9WRVJTSU9OX0JVSUxEX1NUUklORyA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBOcmQgbnJkSW5zdGFuY2U7CisKKyAgdHJ5IHsKKyAgICBucmRJbnN0YW5jZS5pbml0aWFsaXplKG9wdGlvbnMuY29uZmlnKTsKKyAgfQorICBjYXRjaCAoYm9vc3Q6OmZpbGVzeXN0ZW06OmZpbGVzeXN0ZW1fZXJyb3ImIGUpIHsKKyAgICBpZiAoZS5jb2RlKCkgPT0gYm9vc3Q6OnN5c3RlbTo6ZXJyYzo6cGVybWlzc2lvbl9kZW5pZWQpIHsKKyAgICAgIE5GRF9MT0dfRkFUQUwoIlBlcm1pc3Npb25zIGRlbmllZCBmb3IgIiA8PCBlLnBhdGgxKCkgPDwgIi4gIiA8PAorICAgICAgICAgICAgICAgICAgICBhcmd2WzBdIDw8ICIgc2hvdWxkIGJlIHJ1biBhcyBzdXBlcnVzZXIiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBORkRfTE9HX0ZBVEFMKGUud2hhdCgpKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgTkZEX0xPR19GQVRBTChlLndoYXQoKSk7CisgICAgcmV0dXJuIDI7CisgIH0KKworICBib29zdDo6YXNpbzo6c2lnbmFsX3NldCBzaWduYWxTZXQobmZkOjpnZXRHbG9iYWxJb1NlcnZpY2UoKSk7CisgIHNpZ25hbFNldC5hZGQoU0lHSU5UKTsKKyAgc2lnbmFsU2V0LmFkZChTSUdURVJNKTsKKyAgc2lnbmFsU2V0LmFkZChTSUdIVVApOworICBzaWduYWxTZXQuYWRkKFNJR1VTUjEpOworICBzaWduYWxTZXQuYWRkKFNJR1VTUjIpOworICBzaWduYWxTZXQuYXN5bmNfd2FpdChiaW5kKCZOcmQ6OnRlcm1pbmF0ZSwgJm5yZEluc3RhbmNlLCBfMSwgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpyZWYoc2lnbmFsU2V0KSkpOworCisgIHRyeSB7CisgICAgbmZkOjpnZXRHbG9iYWxJb1NlcnZpY2UoKS5ydW4oKTsKKyAgfQorICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICBORkRfTE9HX0ZBVEFMKGUud2hhdCgpKTsKKyAgICByZXR1cm4gMzsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvTkZEL3JpYi9yZW1vdGUtcmVnaXN0cmF0b3IuY3BwIGIvTkZEL3JpYi9yZW1vdGUtcmVnaXN0cmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODc2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL3JlbW90ZS1yZWdpc3RyYXRvci5jcHAKQEAgLTAsMCArMSw0NTEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJyZW1vdGUtcmVnaXN0cmF0b3IuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CisKK05GRF9MT0dfSU5JVCgiUmVtb3RlUmVnaXN0cmF0b3IiKTsKKwordXNpbmcgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzOwordXNpbmcgbmRuOjpuZmQ6OkNvbW1hbmRPcHRpb25zOworCitjb25zdCBOYW1lIFJlbW90ZVJlZ2lzdHJhdG9yOjpMT0NBTF9SRUdJU1RSQVRJT05fUFJFRklYID0gIi9sb2NhbGhvc3QiOworY29uc3QgTmFtZSBSZW1vdGVSZWdpc3RyYXRvcjo6UkVNT1RFX0hVQl9QUkVGSVggPSAiL2xvY2FsaG9wL25mZC9yaWIiOworY29uc3QgbmFtZTo6Q29tcG9uZW50IFJlbW90ZVJlZ2lzdHJhdG9yOjpJR05PUkVfQ09NTVBPTkVOVCgicmliIik7CisKK1JlbW90ZVJlZ2lzdHJhdG9yOjpSZW1vdGVSZWdpc3RyYXRvcihuZG46Om5mZDo6Q29udHJvbGxlciYgY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWImIHJpYikKKyAgOiBtX25mZENvbnRyb2xsZXIoY29udHJvbGxlcikKKyAgLCBtX2tleUNoYWluKGtleUNoYWluKQorICAsIG1fcmliKHJpYikKKyAgLCBtX3JlZnJlc2hJbnRlcnZhbCh0aW1lOjpzZWNvbmRzKDI1KSkKKyAgLCBtX2hhc0Nvbm5lY3RlZEh1YihmYWxzZSkKKyAgLCBtX25SZXRyaWVzKDApCit7Cit9CisKK1JlbW90ZVJlZ2lzdHJhdG9yOjp+UmVtb3RlUmVnaXN0cmF0b3IoKQoreworICAvLyBjYW5jZWwgYWxsIHBlcmlvZGljYWxseSByZWZyZXNoIGV2ZW50cy4KKyAgZm9yIChhdXRvJiYgZW50cnkgOiBtX3JlZ0VudHJpZXMpCisgICAgeworICAgICAgc2NoZWR1bGVyOjpjYW5jZWwoZW50cnkuc2Vjb25kKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JlbW90ZVJlZ2lzdHJhdG9yOjpsb2FkQ29uZmlnKGNvbnN0IENvbmZpZ1NlY3Rpb24mIGNvbmZpZ1NlY3Rpb24pCit7CisgIHNpemVfdCBjb3N0ID0gMTUsIHRpbWVvdXQgPSAxMDAwMDsKKyAgc2l6ZV90IHJldHJ5ID0gMDsKKyAgc2l6ZV90IGludGVydmFsID0gMDsKKyAgY29uc3Qgc2l6ZV90IGludGVydmFsRGVmID0gMjUsIGludGVydmFsTWF4ID0gNjAwOworCisgIE5GRF9MT0dfSU5GTygiTG9hZCByZW1vdGVfcmVnaXN0ZXIgc2VjdGlvbiBpbiByaWIgc2VjdGlvbiIpOworICBmb3IgKGF1dG8mJiBpIDogY29uZmlnU2VjdGlvbikKKyAgICB7CisgICAgICBpZiAoaS5maXJzdCA9PSAiY29zdCIpCisgICAgICAgIHsKKyAgICAgICAgICBjb3N0ID0gaS5zZWNvbmQuZ2V0X3ZhbHVlPHNpemVfdD4oKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaS5maXJzdCA9PSAidGltZW91dCIpCisgICAgICAgIHsKKyAgICAgICAgICB0aW1lb3V0ID0gaS5zZWNvbmQuZ2V0X3ZhbHVlPHNpemVfdD4oKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoaS5maXJzdCA9PSAicmV0cnkiKQorICAgICAgICB7CisgICAgICAgICAgcmV0cnkgPSBpLnNlY29uZC5nZXRfdmFsdWU8c2l6ZV90PigpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLmZpcnN0ID09ICJyZWZyZXNoX2ludGVydmFsIikKKyAgICAgICAgeworICAgICAgICAgIGludGVydmFsID0gaS5zZWNvbmQuZ2V0X3ZhbHVlPHNpemVfdD4oKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgQ29uZmlnRmlsZTo6RXJyb3IoIlVucmVjb2duaXplZCBvcHRpb24gXCIiICsgaS5maXJzdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGluIFwicmVtb3RlLXJlZ2lzdHJhdG9yXCIgc2VjdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICBtX2NvbnRyb2xQYXJhbWV0ZXJzCisgICAgIC5zZXRDb3N0KGNvc3QpCisgICAgIC5zZXRPcmlnaW4obmRuOjpuZmQ6OlJPVVRFX09SSUdJTl9DTElFTlQpLy8gc2V0IG9yaWdpbiB0byBjbGllbnQuCisgICAgIC5zZXRGYWNlSWQoMCk7Ly8gdGhlIHJlbW90ZSBodWIgd2lsbCB0YWtlIHRoZSBpbnB1dCBmYWNlIGFzIHRoZSBmYWNlSWQuCisKKyAgIE5hbWUgY29tbWFuZFByZWZpeCA9IFJFTU9URV9IVUJfUFJFRklYOworICAgaWYgKElHTk9SRV9DT01NUE9ORU5UID09IGNvbW1hbmRQcmVmaXguYXQoLTEpKQorICAgICB7CisgICAgICAgY29tbWFuZFByZWZpeCA9IGNvbW1hbmRQcmVmaXguZ2V0UHJlZml4KC0xKTsKKyAgICAgfQorCisgICBtX2NvbW1hbmRPcHRpb25zCisgICAgIC5zZXRQcmVmaXgoY29tbWFuZFByZWZpeCkKKyAgICAgLnNldFRpbWVvdXQodGltZTo6bWlsbGlzZWNvbmRzKHRpbWVvdXQpKTsKKworICAgbV9uUmV0cmllcyA9IHJldHJ5OworCisgICBpZiAoaW50ZXJ2YWwgPT0gMCkKKyAgICAgeworICAgICAgIGludGVydmFsID0gaW50ZXJ2YWxEZWY7CisgICAgIH0KKworICAgaW50ZXJ2YWwgPSBzdGQ6Om1pbihpbnRlcnZhbCwgaW50ZXJ2YWxNYXgpOworCisgICBtX3JlZnJlc2hJbnRlcnZhbCA9IHRpbWU6OnNlY29uZHMoaW50ZXJ2YWwpOworfQorCit2b2lkCitSZW1vdGVSZWdpc3RyYXRvcjo6ZW5hYmxlKCkKK3sKKyAgLy8gZG8gcmVtb3RlIHJlZ2lzdHJhdGlvbiBhZnRlciBhbiBlbnRyeSBpcyBpbnNlcnRlZCBpbnRvIHRoZSBSSUIuCisgIG1fYWZ0ZXJJbnNlcnRDb25uZWN0aW9uID0KKyAgICBtX3JpYi5hZnRlckluc2VydEVudHJ5LmNvbm5lY3QoW3RoaXNdIChjb25zdCBOYW1lJiBwcmVmaXgpIHsKKyAgICAgICAgcmVnaXN0ZXJQcmVmaXgocHJlZml4KTsKKyAgICAgIH0pOworCisgIC8vIGRvIHJlbW90ZSB1bnJlZ2lzdHJhdGlvbiBhZnRlciBhbiBlbnRyeSBpcyBlcmFzZWQgZnJvbSB0aGUgUklCLgorICBtX2FmdGVyRXJhc2VDb25uZWN0aW9uID0KKyAgICBtX3JpYi5hZnRlckVyYXNlRW50cnkuY29ubmVjdChbdGhpc10gKGNvbnN0IE5hbWUmIHByZWZpeCkgeworICAgICAgICB1bnJlZ2lzdGVyUHJlZml4KHByZWZpeCk7CisgICAgICB9KTsKK30KKwordm9pZAorUmVtb3RlUmVnaXN0cmF0b3I6OmRpc2FibGUoKQoreworICBtX2FmdGVySW5zZXJ0Q29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CisgIG1fYWZ0ZXJFcmFzZUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworfQorCit2b2lkCitSZW1vdGVSZWdpc3RyYXRvcjo6cmVnaXN0ZXJQcmVmaXgoY29uc3QgTmFtZSYgcHJlZml4KQoreworICBpZiAoTE9DQUxfUkVHSVNUUkFUSU9OX1BSRUZJWC5pc1ByZWZpeE9mKHByZWZpeCkpCisgICAgeworICAgICAgTkZEX0xPR19JTkZPKCJsb2NhbCByZWdpc3RyYXRpb24gb25seSBmb3IgIiA8PCBwcmVmaXgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBib29sIGlzSHViUHJlZml4ID0gcHJlZml4ID09IFJFTU9URV9IVUJfUFJFRklYOworCisgIGlmIChpc0h1YlByZWZpeCkKKyAgICB7CisgICAgICBORkRfTE9HX0lORk8oInRoaXMgaXMgYSBwcmVmaXggcmVnaXN0ZXJlZCBieSBzb21lIGh1YjogIiA8PCBwcmVmaXgpOworCisgICAgICBtX2hhc0Nvbm5lY3RlZEh1YiA9IHRydWU7CisKKyAgICAgIHJlZG9SZWdpc3RyYXRpb24oKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCFtX2hhc0Nvbm5lY3RlZEh1YikKKyAgICB7CisgICAgICBORkRfTE9HX0lORk8oIm5vIGh1YiBjb25uZWN0ZWQgd2hlbiByZWdpc3RlcmluZyAiIDw8IHByZWZpeCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN0ZDo6cGFpcjxOYW1lLCBzaXplX3Q+IGlkZW50aXR5ID0gZmluZElkZW50aXR5Rm9yUmVnaXN0cmF0aW9uKHByZWZpeCk7CisKKyAgaWYgKDAgPT0gaWRlbnRpdHkuc2Vjb25kKQorICAgIHsKKyAgICAgIE5GRF9MT0dfSU5GTygibm8gcHJvcGVyIGlkZW50aXR5IGZvdW5kIGZvciByZWdpc3RlcmluZyAiIDw8IHByZWZpeCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIE5hbWUgcHJlZml4Rm9yUmVnaXN0cmF0aW9uOworICBpZiAoaWRlbnRpdHkuZmlyc3Quc2l6ZSgpID09IGlkZW50aXR5LnNlY29uZCkKKyAgICB7CisgICAgICBwcmVmaXhGb3JSZWdpc3RyYXRpb24gPSBpZGVudGl0eS5maXJzdDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmVmaXhGb3JSZWdpc3RyYXRpb24gPSBpZGVudGl0eS5maXJzdC5nZXRQcmVmaXgoLTEpOworICAgIH0KKworICBpZiAobV9yZWdFbnRyaWVzLmZpbmQocHJlZml4Rm9yUmVnaXN0cmF0aW9uKSAhPSBtX3JlZ0VudHJpZXMuZW5kKCkpCisgICAgeworICAgICAgTkZEX0xPR19JTkZPKCJyZWdpc3RyYXRpb24gYWxyZWFkeSBpbiBwcm9jZXNzIGZvciAiIDw8IHByZWZpeCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8vIG1ha2UgY29waWVzIG9mIG1fY29udHJvbFBhcmFtZXRlcnMgYW5kIG1fY29tbWFuZE9wdGlvbnMgdG8KKyAgLy8gYXZvaWQgdW5yZWFzb25hYmxlIG92ZXJ3cml0aW5nIGR1cmluZyBjb25jdXJyZW50IHJlZ2lzdHJhdGlvbgorICAvLyBhbmQgdW5yZWdpc3RyYXRpb24uCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBtX2NvbnRyb2xQYXJhbWV0ZXJzOworICBDb21tYW5kT3B0aW9ucyAgICBvcHRpb25zICAgID0gbV9jb21tYW5kT3B0aW9uczsKKworICBzdGFydFJlZ2lzdHJhdGlvbihwYXJhbWV0ZXJzLnNldE5hbWUocHJlZml4Rm9yUmVnaXN0cmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRTaWduaW5nSWRlbnRpdHkoaWRlbnRpdHkuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICBtX25SZXRyaWVzKTsKK30KKwordm9pZAorUmVtb3RlUmVnaXN0cmF0b3I6OnVucmVnaXN0ZXJQcmVmaXgoY29uc3QgTmFtZSYgcHJlZml4KQoreworICBpZiAocHJlZml4ID09IFJFTU9URV9IVUJfUFJFRklYKQorICAgIHsKKyAgICAgIE5GRF9MT0dfSU5GTygiZGlzY29ubmVjdGVkIHRvIGh1YiB3aXRoIHByZWZpeDogIiA8PCBwcmVmaXgpOworCisgICAgICAvLyBmb3IgcGhhc2UgMTogc3VwcG9zZSB0aGVyZSBpcyBhdCBtb3N0IG9uZSBodWIgY29ubmVjdGVkLgorICAgICAgLy8gaWYgdGhlIGh1YiBwcmVmaXggaGFzIGJlZW4gdW5yZWdpc3RlcmVkIGxvY2FsbHksIHRoZXJlIG1heQorICAgICAgLy8gYmUgbm8gY29ubmVjdGVkIGh1Yi4KKyAgICAgIG1faGFzQ29ubmVjdGVkSHViID0gZmFsc2U7CisKKyAgICAgIGNsZWFyUmVmcmVzaEV2ZW50cygpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIW1faGFzQ29ubmVjdGVkSHViKQorICAgIHsKKyAgICAgIE5GRF9MT0dfSU5GTygibm8gaHViIGNvbm5lY3RlZCB3aGVuIHVucmVnaXN0ZXJpbmcgIiA8PCBwcmVmaXgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdGQ6OnBhaXI8TmFtZSwgc2l6ZV90PiBpZGVudGl0eSA9IGZpbmRJZGVudGl0eUZvclJlZ2lzdHJhdGlvbihwcmVmaXgpOworCisgIGlmICgwID09IGlkZW50aXR5LnNlY29uZCkKKyAgICB7CisgICAgICBORkRfTE9HX0lORk8oIm5vIHByb3BlciBpZGVudGl0eSBmb3VuZCBmb3IgdW5yZWdpc3RlcmluZyAiIDw8IHByZWZpeCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIE5hbWUgcHJlZml4Rm9yUmVnaXN0cmF0aW9uOworICBpZiAoaWRlbnRpdHkuZmlyc3Quc2l6ZSgpID09IGlkZW50aXR5LnNlY29uZCkKKyAgICB7CisgICAgICBwcmVmaXhGb3JSZWdpc3RyYXRpb24gPSBpZGVudGl0eS5maXJzdDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmVmaXhGb3JSZWdpc3RyYXRpb24gPSBpZGVudGl0eS5maXJzdC5nZXRQcmVmaXgoLTEpOworICAgIH0KKworICBSZWdpc3RlcmVkRW50cnlJdCBpUmVnRW50cnkgPSBtX3JlZ0VudHJpZXMuZmluZChwcmVmaXhGb3JSZWdpc3RyYXRpb24pOworICBpZiAobV9yZWdFbnRyaWVzLmVuZCgpID09IGlSZWdFbnRyeSkKKyAgICB7CisgICAgICBORkRfTE9HX0lORk8oIm5vIGV4aXN0aW5nIGVudHJ5IGZvdW5kIHdoZW4gdW5yZWdpc3RlcmluZyAiIDw8IHByZWZpeCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZvciAoYXV0byYmIGVudHJ5IDogbV9yaWIpCisgICAgeworICAgICAgaWYgKHByZWZpeEZvclJlZ2lzdHJhdGlvbi5pc1ByZWZpeE9mKGVudHJ5LmZpcnN0KSAmJgorICAgICAgICAgIGZpbmRJZGVudGl0eUZvclJlZ2lzdHJhdGlvbihlbnRyeS5maXJzdCkgPT0gaWRlbnRpdHkpCisgICAgICAgIHsKKyAgICAgICAgICBORkRfTE9HX0lORk8oInRoaXMgaWRlbnRpdHkgc2hvdWxkIGJlIGtlcHQgZm9yIG90aGVyIHJpYiBlbnRyeTogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbnRyeS5maXJzdCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgIHNjaGVkdWxlcjo6Y2FuY2VsKGlSZWdFbnRyeS0+c2Vjb25kKTsKKyAgbV9yZWdFbnRyaWVzLmVyYXNlKGlSZWdFbnRyeSk7CisKKyAgLy8gbWFrZSBjb3BpZXMgb2YgbV9jb250cm9sUGFyYW1ldGVycyBhbmQgbV9jb21tYW5kT3B0aW9ucyB0bworICAvLyBhdm9pZCB1bnJlYXNvbmFibGUgb3ZlcndyaXRpbmcgZHVyaW5nIGNvbmN1cnJlbnQgcmVnaXN0cmF0aW9uCisgIC8vIGFuZCB1bnJlZ2lzdHJhdGlvbi4KKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG1fY29udHJvbFBhcmFtZXRlcnM7CisgIENvbW1hbmRPcHRpb25zICAgIG9wdGlvbnMgICAgPSBtX2NvbW1hbmRPcHRpb25zOworCisgIHN0YXJ0VW5yZWdpc3RyYXRpb24ocGFyYW1ldGVycy5zZXROYW1lKHByZWZpeEZvclJlZ2lzdHJhdGlvbikudW5zZXRDb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRTaWduaW5nSWRlbnRpdHkoaWRlbnRpdHkuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgIG1fblJldHJpZXMpOworfQorCitzdGQ6OnBhaXI8TmFtZSwgc2l6ZV90PgorUmVtb3RlUmVnaXN0cmF0b3I6OmZpbmRJZGVudGl0eUZvclJlZ2lzdHJhdGlvbihjb25zdCBOYW1lJiBwcmVmaXgpCit7CisgIHN0ZDo6cGFpcjxOYW1lLCBzaXplX3Q+IGNhbmRpZGF0ZUlkZW50aXR5OworICBzdGQ6OnZlY3RvcjxOYW1lPiBpZGVudGl0aWVzOworICBib29sIGlzUHJlZml4ID0gZmFsc2U7CisgIHNpemVfdCBtYXhMZW5ndGggPSAwLCBjdXJMZW5ndGggPSAwOworCisgIC8vIGdldCBhbGwgaWRlbnRpZXMgZnJvbSB0aGUga2V5LWNhaGluIGV4Y2VwdCB0aGUgZGVmYXVsdCBvbmUuCisgIG1fa2V5Q2hhaW4uZ2V0QWxsSWRlbnRpdGllcyhpZGVudGl0aWVzLCBmYWxzZSk7CisKKyAgLy8gZ2V0IHRoZSBkZWZhdWx0IGlkZW50aXR5LgorICBpZGVudGl0aWVzLnB1c2hfYmFjayhtX2tleUNoYWluLmdldERlZmF1bHRJZGVudGl0eSgpKTsKKworICAvLyBsb25nZXN0IHByZWZpeCBtYXRjaGluZyB0byBhbGwgaW5kZW50aWVzLgorICBmb3IgKGF1dG8mJiBpIDogaWRlbnRpdGllcykKKyAgICB7CisgICAgICBpZiAoIWkuZW1wdHkoKSAmJiBJR05PUkVfQ09NTVBPTkVOVCA9PSBpLmF0KC0xKSkKKyAgICAgICAgeworICAgICAgICAgIGlzUHJlZml4ID0gaS5nZXRQcmVmaXgoLTEpLmlzUHJlZml4T2YocHJlZml4KTsKKyAgICAgICAgICBjdXJMZW5ndGggPSBpLnNpemUoKSAtIDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlzUHJlZml4ID0gaS5pc1ByZWZpeE9mKHByZWZpeCk7CisgICAgICAgICAgY3VyTGVuZ3RoID0gaS5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgaWYgKGlzUHJlZml4ICYmIGN1ckxlbmd0aCA+IG1heExlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgIGNhbmRpZGF0ZUlkZW50aXR5LmZpcnN0ID0gaTsKKyAgICAgICAgICBtYXhMZW5ndGggPSBjdXJMZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgY2FuZGlkYXRlSWRlbnRpdHkuc2Vjb25kID0gbWF4TGVuZ3RoOworCisgIHJldHVybiBjYW5kaWRhdGVJZGVudGl0eTsKK30KKwordm9pZAorUmVtb3RlUmVnaXN0cmF0b3I6OnN0YXJ0UmVnaXN0cmF0aW9uKGNvbnN0IENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUmV0cmllcykKK3sKKyAgTkZEX0xPR19JTkZPKCJzdGFydCByZWdpc3RlciAiIDw8IHBhcmFtZXRlcnMuZ2V0TmFtZSgpKTsKKworICBtX25mZENvbnRyb2xsZXIuc3RhcnQ8bmRuOjpuZmQ6OlJpYlJlZ2lzdGVyQ29tbWFuZD4oCisgICAgIHBhcmFtZXRlcnMsCisgICAgIGJpbmQoJlJlbW90ZVJlZ2lzdHJhdG9yOjpvblJlZ1N1Y2Nlc3MsCisgICAgICAgICAgdGhpcywgcGFyYW1ldGVycywgb3B0aW9ucyksCisgICAgIGJpbmQoJlJlbW90ZVJlZ2lzdHJhdG9yOjpvblJlZ0ZhaWx1cmUsCisgICAgICAgICAgdGhpcywgXzEsIF8yLCBwYXJhbWV0ZXJzLCBvcHRpb25zLCBuUmV0cmllcyksCisgICAgIG9wdGlvbnMpOworfQorCit2b2lkCitSZW1vdGVSZWdpc3RyYXRvcjo6c3RhcnRVbnJlZ2lzdHJhdGlvbihjb25zdCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5SZXRyaWVzKQoreworICBORkRfTE9HX0lORk8oInN0YXJ0IHVucmVnaXN0ZXIgIiA8PCBwYXJhbWV0ZXJzLmdldE5hbWUoKSk7CisKKyAgbV9uZmRDb250cm9sbGVyLnN0YXJ0PG5kbjo6bmZkOjpSaWJVbnJlZ2lzdGVyQ29tbWFuZD4oCisgICAgIHBhcmFtZXRlcnMsCisgICAgIGJpbmQoJlJlbW90ZVJlZ2lzdHJhdG9yOjpvblVucmVnU3VjY2VzcywKKyAgICAgICAgICB0aGlzLCBwYXJhbWV0ZXJzLCBvcHRpb25zKSwKKyAgICAgYmluZCgmUmVtb3RlUmVnaXN0cmF0b3I6Om9uVW5yZWdGYWlsdXJlLAorICAgICAgICAgIHRoaXMsIF8xLCBfMiwgcGFyYW1ldGVycywgb3B0aW9ucywgblJldHJpZXMpLAorICAgICBvcHRpb25zKTsKK30KKwordm9pZAorUmVtb3RlUmVnaXN0cmF0b3I6Om9uUmVnU3VjY2Vzcyhjb25zdCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE9wdGlvbnMmIG9wdGlvbnMpCit7CisgIE5GRF9MT0dfSU5GTygic3VjY2VzcyB0byByZWdpc3RlciAiIDw8IHBhcmFtZXRlcnMuZ2V0TmFtZSgpKTsKKworICBSZWdpc3RlcmVkRW50cnlJdCBpUmVnRW50cnkgPSBtX3JlZ0VudHJpZXMuZmluZChwYXJhbWV0ZXJzLmdldE5hbWUoKSk7CisKKyAgaWYgKG1fcmVnRW50cmllcy5lbmQoKSAhPSBpUmVnRW50cnkpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiRXhpc3RpbmcgRW50cnk6ICgiIDw8IGlSZWdFbnRyeS0+Zmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IGlSZWdFbnRyeS0+c2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikiKTsKKworICAgICAgc2NoZWR1bGVyOjpjYW5jZWwoaVJlZ0VudHJ5LT5zZWNvbmQpOworICAgICAgaVJlZ0VudHJ5LT5zZWNvbmQgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcmVmcmVzaEludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlbW90ZVJlZ2lzdHJhdG9yOjpzdGFydFJlZ2lzdHJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBhcmFtZXRlcnMsIG9wdGlvbnMsIG1fblJldHJpZXMpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJOZXcgRW50cnkiKTsKKyAgICAgIG1fcmVnRW50cmllcy5pbnNlcnQoUmVnaXN0ZXJlZEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZXI6OnNjaGVkdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JlZnJlc2hJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVtb3RlUmVnaXN0cmF0b3I6OnN0YXJ0UmVnaXN0cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBhcmFtZXRlcnMsIG9wdGlvbnMsIG1fblJldHJpZXMpKSkpOworICAgIH0KK30KKwordm9pZAorUmVtb3RlUmVnaXN0cmF0b3I6Om9uUmVnRmFpbHVyZSh1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUmV0cmllcykKK3sKKyAgTkZEX0xPR19JTkZPKCJmYWlsIHRvIHJlZ2lzdGVyICIgPDwgcGFyYW1ldGVycy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuXHQgcmVhc29uOiIgPDwgcmVhc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcblx0IHJlbWFpbiByZXRyaWVzOiIgPDwgblJldHJpZXMpOworCisgIGlmIChuUmV0cmllcyA+IDApCisgICAgeworICAgICAgc3RhcnRSZWdpc3RyYXRpb24ocGFyYW1ldGVycywgb3B0aW9ucywgblJldHJpZXMgLSAxKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JlbW90ZVJlZ2lzdHJhdG9yOjpvblVucmVnU3VjY2Vzcyhjb25zdCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kT3B0aW9ucyYgb3B0aW9ucykKK3sKKyAgTkZEX0xPR19JTkZPKCJzdWNjZXNzIHRvIHVucmVnaXN0ZXIgIiA8PCBwYXJhbWV0ZXJzLmdldE5hbWUoKSk7Cit9CisKK3ZvaWQKK1JlbW90ZVJlZ2lzdHJhdG9yOjpvblVucmVnRmFpbHVyZSh1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUmV0cmllcykKK3sKKyAgTkZEX0xPR19JTkZPKCJmYWlsIHRvIHVucmVnaXN0ZXIgIiA8PCBwYXJhbWV0ZXJzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcblx0IHJlYXNvbjoiIDw8IHJlYXNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcblx0IHJlbWFpbiByZXRyaWVzOiIgPDwgblJldHJpZXMpOworCisgIGlmIChuUmV0cmllcyA+IDApCisgICAgeworICAgICAgc3RhcnRVbnJlZ2lzdHJhdGlvbihwYXJhbWV0ZXJzLCBvcHRpb25zLCBuUmV0cmllcyAtIDEpOworICAgIH0KK30KKwordm9pZAorUmVtb3RlUmVnaXN0cmF0b3I6OnJlZG9SZWdpc3RyYXRpb24oKQoreworICBORkRfTE9HX0lORk8oInJlZG8gIiA8PCBtX3JlZ0VudHJpZXMuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmVnaXN0cmF0aW9uIHdoZW4gbmV3IEh1YiBjb25uZWN0aW9uIGlzIGJ1aWx0LiIpOworCisgIGZvciAoYXV0byYmIGVudHJ5IDogbV9yZWdFbnRyaWVzKQorICAgIHsKKyAgICAgIC8vIG1ha2UgY29waWVzIHRvIGF2b2lkIHVucmVhc29uYWJsZSBvdmVyd3JpdGUuCisgICAgICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbV9jb250cm9sUGFyYW1ldGVyczsKKyAgICAgIENvbW1hbmRPcHRpb25zICAgIG9wdGlvbnMgICAgPSBtX2NvbW1hbmRPcHRpb25zOworICAgICAgc3RhcnRSZWdpc3RyYXRpb24ocGFyYW1ldGVycy5zZXROYW1lKGVudHJ5LmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2lnbmluZ0lkZW50aXR5KGVudHJ5LmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fblJldHJpZXMpOworICAgIH0KK30KKwordm9pZAorUmVtb3RlUmVnaXN0cmF0b3I6OmNsZWFyUmVmcmVzaEV2ZW50cygpCit7CisgIGZvciAoYXV0byYmIGVudHJ5IDogbV9yZWdFbnRyaWVzKQorICAgIHsKKyAgICAgIHNjaGVkdWxlcjo6Y2FuY2VsKGVudHJ5LnNlY29uZCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSByaWIKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3JpYi9yZW1vdGUtcmVnaXN0cmF0b3IuaHBwIGIvTkZEL3JpYi9yZW1vdGUtcmVnaXN0cmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWVlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL3JlbW90ZS1yZWdpc3RyYXRvci5ocHAKQEAgLTAsMCArMSwyNTAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX1JJQl9SRU1PVEVfUkVHSVNUUkFUT1JfSFBQCisjZGVmaW5lIE5GRF9SSUJfUkVNT1RFX1JFR0lTVFJBVE9SX0hQUAorCisjaW5jbHVkZSAicmliLmhwcCIKKyNpbmNsdWRlICJjb3JlL2NvbmZpZy1maWxlLmhwcCIKKyNpbmNsdWRlICJyaWItc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkva2V5LWNoYWluLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWNvbnRyb2xsZXIuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY29udHJvbC1jb21tYW5kLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWNvbnRyb2wtcGFyYW1ldGVycy5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb21tYW5kLW9wdGlvbnMuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9zaWduYWwuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSByaWIgeworCisvKioKKyAqIEBicmllZiBkZWZpbmUgdGhlIFJlbW90ZVJlZ2lzdHJhdG9yIGNsYXNzLCB3aGljaCBoYW5kbGVzCisgKiAgICAgICAgdGhlIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiB0byByZW1vdGUgaHViKHMpLgorICovCitjbGFzcyBSZW1vdGVSZWdpc3RyYXRvciA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIGNsYXNzIEVycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0KQorICAgICAgOiBzdGQ6OnJ1bnRpbWVfZXJyb3Iod2hhdCkKKyAgICB7CisgICAgfQorICB9OworCisgIFJlbW90ZVJlZ2lzdHJhdG9yKG5kbjo6bmZkOjpDb250cm9sbGVyJiBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgUmliJiByaWIpOworCisgIH5SZW1vdGVSZWdpc3RyYXRvcigpOworCisgIC8qKgorICAgKiBAYnJpZWYgbG9hZCB0aGUgInJlbW90ZV9yZWdpc3RlciIgc2VjdGlvbiBmcm9tIGNvbmZpZyBmaWxlCisgICAqCisgICAqIEBwYXJhbSBjb25maWdTZWN0aW9uIHRoZSBzdWIgc2VjdGlvbiBpbiAicmliIiBzZWN0aW9uLgorICAgKi8KKyAgdm9pZAorICBsb2FkQ29uZmlnKGNvbnN0IENvbmZpZ1NlY3Rpb24mIGNvbmZpZ1NlY3Rpb24pOworCisgIC8qKgorICAgKiBAYnJpZWYgZW5hYmxlIHJlbW90ZSByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24uCisgICAqCisgICAqLworICB2b2lkCisgIGVuYWJsZSgpOworCisgIC8qKgorICAgKiBAYnJpZWYgZGlzYWJsZSByZW1vdGUgcmVnaXN0cmF0aW9uL3VucmVnaXN0cmF0aW9uLgorICAgKgorICAgKi8KKyAgdm9pZAorICBkaXNhYmxlKCk7CisKKyAgLyoqCisgICAqIEBicmllZiByZWdpc3RlciBhIHByZWZpeCB0byByZW1vdGUgaHViKHMpLgorICAgKgorICAgKiBGb3IgdGhlIGlucHV0IHByZWZpeCwgd2UgZmluZCB0aGUgbG9uZ2VzdCBpZGVudGl0eQorICAgKiBpbiB0aGUga2V5LWNoYWluIHRoYXQgY2FuIHNpZ24gaXQsIGFuZCB0aGVuCisgICAqIHJlZ2lzdGVyIHRoaXMgaWRlbnRpdHkgdG8gcmVtb3RlIGh1YihzKS4KKyAgICoKKyAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IGJlaW5nIHJlZ2lzdGVyZWQgaW4gbG9jYWwgUklCLgorICAgKi8KKyAgdm9pZAorICByZWdpc3RlclByZWZpeChjb25zdCBOYW1lJiBwcmVmaXgpOworCisgIC8qKgorICAgKiBAYnJpZWYgdW5yZWdpc3RlciBhIHByZWZpeCBmcm9tIHJlbW90ZSBodWIocykuCisgICAqCisgICAqIEZvciB0aGUgaW5wdXQgcHJlZml4LCBpZiB0aGUgbG9uZ2VzdCBpZGVudGl0eSBjYW4gc2lnbiBpdAorICAgKiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgcmVtb3RlbHksIHRoYXQgaWRlbnRpdHkgc2hvdWxkIGJlCisgICAqIHVucmVnaXN0ZXJlZCBmcm9tIHJlbW90ZSBodWIocykuCisgICAqCisgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBiZWluZyB1bnJlZ2lzdGVyZWQgaW4gbG9jYWwgUklCLgorICAgKi8KKyAgdm9pZAorICB1bnJlZ2lzdGVyUHJlZml4KGNvbnN0IE5hbWUmIHByZWZpeCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBAYnJpZWYgZmluZCB0aGUgbW9zdCBwcm9wZXIgaWRlbnRpdHkgdGhhdCBjYW4gc2lnbiB0aGUKKyAgICogICAgICAgIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjb21tYW5kIGZvciB0aGUgaW5wdXQgcHJlZml4LgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBpZGVudGl0eSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBtYXRjaCB0byB0aGUKKyAgICogICAgICAgICBpbnB1dCBwcmVmaXguCisgICAqCisgICAqIEByZXR2YWwgeyBpZ25vcmVkLCAwIH0gbm8gbWF0Y2hpbmcgaWRlbnRpdHkKKyAgICovCisgIHN0ZDo6cGFpcjxOYW1lLCBzaXplX3Q+CisgIGZpbmRJZGVudGl0eUZvclJlZ2lzdHJhdGlvbihjb25zdCBOYW1lJiBwcmVmaXgpOworCisgIC8qKgorICAgKiBAYnJpZWYgbWFrZSBhbmQgc2VuZCB0aGUgcmVtb3RlIHJlZ2lzdHJhdGlvbiBjb21tYW5kLgorICAgKgorICAgKiBAcGFyYW0gblJldHJpZXMgcmVtYWluaW5nIG51bWJlciBvZiByZXRyaWVzLgorICAgKi8KKyAgdm9pZAorICBzdGFydFJlZ2lzdHJhdGlvbihjb25zdCBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpDb21tYW5kT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgaW50IG5SZXRyaWVzKTsKKworICAvKioKKyAgICogQGJyaWVmIG1ha2UgYW5kIHNlbmQgdGhlIHJlbW90ZSB1bnJlZ2lzdHJhdGlvbiBjb21tYW5kLgorICAgKgorICAgKiBAcGFyYW0gblJldHJpZXMgcmVtYWluaW5nIG51bWJlciBvZiByZXRyaWVzLgorICAgKi8KKyAgdm9pZAorICBzdGFydFVucmVnaXN0cmF0aW9uKGNvbnN0IG5kbjo6bmZkOjpDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46Om5mZDo6Q29tbWFuZE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG5SZXRyaWVzKTsKKyAgLyoqCisgICAqIEBicmllZiByZWZyZXNoIHRoZSByZW1vdGVseSByZWdpc3RlcmVkIGVudHJ5IGlmIHJlZ2lzdHJhdGlvbgorICAgKiAgICAgICAgc3VjY2Vzc2VzIGJ5IHJlLXNlbmRpbmcgdGhlIHJlZ2lzdHJhdGlvbiBjb21tYW5kLgorICAgKgorICAgKiBUaGUgaW50ZXJ2YWwgb2Ygc2VuZGluZyByZWZyZXNoIGNvbW1hbmQgaXMgZGVmaW5lZCBpbiB0aGUKKyAgICogInJlbW90ZV9yZWdpc3RlciIgc2VjdGlvbiBvZiB0aGUgY29uZmlnIGZpbGUuCisgICAqCisgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBzYW1lIHBhcmVtZXRlcnMgZnJvbSBzdGFydFJlZ2lzdHJhdGlvbi4KKyAgICogQHBhcmFtIG9wdGlvbnMgdGhlIHNhbWUgb3B0aW9ucyBhcyBpbiBzdGFydFJlZ2lzdHJhdGlvbi4KKyAgICovCisgIHZvaWQKKyAgb25SZWdTdWNjZXNzKGNvbnN0IG5kbjo6bmZkOjpDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpDb21tYW5kT3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgLyoqCisgICAqIEBicmllZiByZXRyeSB0byBzZW5kIHJlZ2lzdHJhdGlvbiBjb21tYW5kIGlmIHJlZ2lzdHJhdGlvbiBmYWlscy4KKyAgICoKKyAgICogdGhlIG51bWJlciBvZiByZXRyaWVzIGlzIGRlZmluZWQgaW4gdGhlICJyZW1vdGVfcmVnaXN0ZXIiCisgICAqIHNlY3Rpb24gb2YgdGhlIGNvbmZpZyBmaWxlLgorICAgKgorICAgKiBAcGFyYW0gY29kZSBlcnJvciBjb2RlLgorICAgKiBAcGFyYW0gcmVhc29uIGVycm9yIHJlYXNvbiBpbiBzdHJpbmcuCisgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBzYW1lIHBhcmVtZXRlcnMgZnJvbSBzdGFydFJlZ2lzdHJhdGlvbi4KKyAgICogQHBhcmFtIG9wdGlvbnMgdGhlIHNhbWUgb3B0aW9ucyBmcm9tIHN0YXJ0UmVnaXN0cmF0aW9uLgorICAgKiBAcGFyYW0gblJldHJpZXMgcmVtYWluaW5nIG51bWJlciBvZiByZXRyaWVzLgorICAgKi8KKyAgdm9pZAorICBvblJlZ0ZhaWx1cmUodWludDMyX3QgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbiwKKyAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpDb21tYW5kT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgIGludCBuUmV0cmllcyk7CisKKyAgdm9pZAorICBvblVucmVnU3VjY2Vzcyhjb25zdCBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpDb21tYW5kT3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgLyoqCisgICAqIEBicmllZiByZXRyeSB0byBzZW5kIHVucmVnaXN0cmF0aW9uIGNvbW1hbmQgaWYgcmVnaXN0cmF0aW9uIGZhaWxzLgorICAgKgorICAgKiB0aGUgbnVtYmVyIG9mIHJldHJpZXMgaXMgZGVmaW5lZCBpbiB0aGUgInJlbW90ZV9yZWdpc3RlciIKKyAgICogc2VjdGlvbiBvZiB0aGUgY29uZmlnIGZpbGUuCisgICAqCisgICAqIEBwYXJhbSBjb2RlIGVycm9yIGNvZGUuCisgICAqIEBwYXJhbSByZWFzb24gZXJyb3IgcmVhc29uIGluIHN0cmluZy4KKyAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIHNhbWUgcGFyZW1ldGVycyBhcyBpbiBzdGFydFJlZ2lzdHJhdGlvbi4KKyAgICogQHBhcmFtIG9wdGlvbnMgdGhlIHNhbWUgb3B0aW9ucyBhcyBpbiBzdGFydFJlZ2lzdHJhdGlvbi4KKyAgICogQHBhcmFtIG5SZXRyaWVzIHJlbWFpbmluZyBudW1iZXIgb2YgcmV0cmllcy4KKyAgICovCisgIHZvaWQKKyAgb25VbnJlZ0ZhaWx1cmUodWludDMyX3QgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICBjb25zdCBuZG46Om5mZDo6Q29tbWFuZE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgIGludCBuUmV0cmllcyk7CisKKyAgLyoqCisgICAqIEBicmllZiByZS1yZWdpc3RlciBhbGwgcHJlZml4ZXMKKyAgICoKKyAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIEhVQiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLgorICAgKi8KKyAgdm9pZAorICByZWRvUmVnaXN0cmF0aW9uKCk7CisKKyAgLyoqCisgICAqIEBicmllZiBjbGVhciBhbGwgcmVmcmVzaCBldmVudHMKKyAgICoKKyAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbGwgSFVCIGNvbm5lY3Rpb25zIGFyZSBsb3N0LgorICAgKi8KKyAgdm9pZAorICBjbGVhclJlZnJlc2hFdmVudHMoKTsKKworUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFOgorICAvKioKKyAgICogV2hlbiBhIGxvY2FsbHkgcmVnaXN0ZXJlZCBwcmVmaXggdHJpZ2dsZXMgcmVtb3RlCisgICAqIHJlZ2lzdHJhdGlvbiwgd2UgYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGxvbmdlc3QKKyAgICogaWRlbnRpdHkgdGhhdCBjYW4gc2lnbiB0aGlzIHByZWZpeCB0byByZW1vdGUgaHViKHMpLgorICAgKgorICAgKiBUaHVzLCB0aGUgcmVtb3RlbHkgcmVpZ3N0ZXJlZCBwcmVmaXggZG9lcyBub3QgZXF1YWwKKyAgICogdG8gUm91dGUgTmFtZS4gU28gaXQgbmVlZHMgc2VwZXJhdGUgc290cmFnZSBpbnN0ZWFkCisgICAqIG9mIHN0b3Jpbmcgd2l0aGluIHRoZSBSSUIuCisgICAqLworICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxOYW1lLCBFdmVudElkPiBSZWdpc3RlcmVkTGlzdDsKKyAgdHlwZWRlZiBSZWdpc3RlcmVkTGlzdDo6aXRlcmF0b3IgUmVnaXN0ZXJlZEVudHJ5SXQ7CisgIHR5cGVkZWYgUmVnaXN0ZXJlZExpc3Q6OnZhbHVlX3R5cGUgUmVnaXN0ZXJlZEVudHJ5OworICBSZWdpc3RlcmVkTGlzdCBtX3JlZ0VudHJpZXM7CisKK3ByaXZhdGU6CisgIG5kbjo6bmZkOjpDb250cm9sbGVyJiBtX25mZENvbnRyb2xsZXI7CisgIG5kbjo6S2V5Q2hhaW4mIG1fa2V5Q2hhaW47CisgIFJpYiYgbV9yaWI7CisgIG5kbjo6dXRpbDo6c2lnbmFsOjpTY29wZWRDb25uZWN0aW9uIG1fYWZ0ZXJJbnNlcnRDb25uZWN0aW9uOworICBuZG46OnV0aWw6OnNpZ25hbDo6U2NvcGVkQ29ubmVjdGlvbiBtX2FmdGVyRXJhc2VDb25uZWN0aW9uOworICBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnMgbV9jb250cm9sUGFyYW1ldGVyczsKKyAgbmRuOjpuZmQ6OkNvbW1hbmRPcHRpb25zIG1fY29tbWFuZE9wdGlvbnM7CisgIHRpbWU6OnNlY29uZHMgbV9yZWZyZXNoSW50ZXJ2YWw7CisgIGJvb2wgbV9oYXNDb25uZWN0ZWRIdWI7CisgIGludCBtX25SZXRyaWVzOworCisgIHN0YXRpYyBjb25zdCBOYW1lIExPQ0FMX1JFR0lTVFJBVElPTl9QUkVGSVg7IC8vIC9sb2NhbGhvc3QKKyAgc3RhdGljIGNvbnN0IE5hbWUgUkVNT1RFX0hVQl9QUkVGSVg7IC8vIC9sb2NhbGhvcC9uZmQvcmliCisgIHN0YXRpYyBjb25zdCBuYW1lOjpDb21wb25lbnQgSUdOT1JFX0NPTU1QT05FTlQ7IC8vIHJpYgorfTsKKworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9SSUJfUkVNT1RFX1JFR0lTVFJBVE9SX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3JpYi9yaWItZW50cnkuY3BwIGIvTkZEL3JpYi9yaWItZW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjQyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL3JpYi1lbnRyeS5jcHAKQEAgLTAsMCArMSwyNTggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJyaWItZW50cnkuaHBwIgorCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sLWNvbW1hbmQuaHBwPgorCitORkRfTE9HX0lOSVQoIlJpYkVudHJ5Iik7CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CisKK1JpYkVudHJ5OjpGYWNlTGlzdDo6aXRlcmF0b3IKK1JpYkVudHJ5OjpmaW5kRmFjZShjb25zdCBGYWNlRW50cnkmIGZhY2UpCit7CisgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4oKSwgZW5kKCksIGJpbmQoJmNvbXBhcmVGYWNlSWRBbmRPcmlnaW4sIF8xLCBmYWNlKSk7Cit9CisKK2Jvb2wKK1JpYkVudHJ5OjppbnNlcnRGYWNlKGNvbnN0IEZhY2VFbnRyeSYgZW50cnkpCit7CisgIGl0ZXJhdG9yIGl0ID0gZmluZEZhY2UoZW50cnkpOworCisgIGlmIChpdCA9PSBlbmQoKSkKKyAgICB7CisgICAgICBpZiAoZW50cnkuZmxhZ3MgJiBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKQorICAgICAgICB7CisgICAgICAgICAgbV9uRmFjZXNXaXRoQ2FwdHVyZVNldCsrOworICAgICAgICB9CisKKyAgICAgIG1fZmFjZXMucHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQKK1JpYkVudHJ5OjplcmFzZUZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKQoreworICBSaWJFbnRyeTo6aXRlcmF0b3IgaXQgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oKSwgZW5kKCksIGJpbmQoJmNvbXBhcmVGYWNlSWRBbmRPcmlnaW4sIF8xLCBmYWNlKSk7CisgIGVyYXNlRmFjZShpdCk7Cit9CisKK2Jvb2wKK1JpYkVudHJ5OjpoYXNGYWNlKGNvbnN0IEZhY2VFbnRyeSYgZmFjZSkKK3sKKyAgUmliRW50cnk6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RkOjpmaW5kX2lmKGNiZWdpbigpLCBjZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZjb21wYXJlRmFjZUlkQW5kT3JpZ2luLCBfMSwgZmFjZSkpOworCisgIHJldHVybiBpdCAhPSBjZW5kKCk7Cit9CisKK2Jvb2wKK1JpYkVudHJ5OjpoYXNGYWNlSWQoY29uc3QgdWludDY0X3QgZmFjZUlkKSBjb25zdAoreworICBSaWJFbnRyeTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGQ6OmZpbmRfaWYoY2JlZ2luKCksIGNlbmQoKSwgYmluZCgmY29tcGFyZUZhY2VJZCwgXzEsIGZhY2VJZCkpOworCisgIHJldHVybiBpdCAhPSBjZW5kKCk7Cit9CisKK3ZvaWQKK1JpYkVudHJ5OjphZGRDaGlsZChzaGFyZWRfcHRyPFJpYkVudHJ5PiBjaGlsZCkKK3sKKyAgQk9PU1RfQVNTRVJUKCFzdGF0aWNfY2FzdDxib29sPihjaGlsZC0+Z2V0UGFyZW50KCkpKTsKKyAgY2hpbGQtPnNldFBhcmVudCh0aGlzLT5zaGFyZWRfZnJvbV90aGlzKCkpOworICBtX2NoaWxkcmVuLnB1c2hfYmFjayhjaGlsZCk7Cit9CisKK3ZvaWQKK1JpYkVudHJ5OjpyZW1vdmVDaGlsZChzaGFyZWRfcHRyPFJpYkVudHJ5PiBjaGlsZCkKK3sKKyAgQk9PU1RfQVNTRVJUKGNoaWxkLT5nZXRQYXJlbnQoKS5nZXQoKSA9PSB0aGlzKTsKKyAgY2hpbGQtPnNldFBhcmVudChzaGFyZWRfcHRyPFJpYkVudHJ5PigpKTsKKyAgbV9jaGlsZHJlbi5yZW1vdmUoY2hpbGQpOworfQorCitSaWJFbnRyeTo6RmFjZUxpc3Q6Oml0ZXJhdG9yCitSaWJFbnRyeTo6ZXJhc2VGYWNlKEZhY2VMaXN0OjppdGVyYXRvciBmYWNlKQoreworICBpZiAoZmFjZSAhPSBtX2ZhY2VzLmVuZCgpKQorICAgIHsKKyAgICAgIGlmIChmYWNlLT5mbGFncyAmIG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkUpCisgICAgICAgIHsKKyAgICAgICAgICBtX25GYWNlc1dpdGhDYXB0dXJlU2V0LS07CisgICAgICAgIH0KKworICAgICAgLy9jYW5jZWwgYW55IHNjaGVkdWxlZCBldmVudAorICAgICAgTkZEX0xPR19UUkFDRSgiQ2FuY2VsbGluZyBleHBpcmF0aW9uIGV2ZW50SWQ6ICIgPDwgZmFjZS0+Z2V0RXhwaXJhdGlvbkV2ZW50KCkpOworICAgICAgc2NoZWR1bGVyOjpjYW5jZWwoZmFjZS0+Z2V0RXhwaXJhdGlvbkV2ZW50KCkpOworCisgICAgICByZXR1cm4gbV9mYWNlcy5lcmFzZShmYWNlKTsKKyAgICB9CisKKyAgcmV0dXJuIG1fZmFjZXMuZW5kKCk7Cit9CisKK3ZvaWQKK1JpYkVudHJ5OjphZGRJbmhlcml0ZWRGYWNlKGNvbnN0IEZhY2VFbnRyeSYgZmFjZSkKK3sKKyAgbV9pbmhlcml0ZWRGYWNlcy5wdXNoX2JhY2soZmFjZSk7Cit9CisKK3ZvaWQKK1JpYkVudHJ5OjpyZW1vdmVJbmhlcml0ZWRGYWNlKGNvbnN0IEZhY2VFbnRyeSYgZmFjZSkKK3sKKyAgRmFjZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gZmluZEluaGVyaXRlZEZhY2UoZmFjZSk7CisgIG1faW5oZXJpdGVkRmFjZXMuZXJhc2UoaXQpOworfQorCitSaWJFbnRyeTo6RmFjZUxpc3Q6Oml0ZXJhdG9yCitSaWJFbnRyeTo6ZmluZEluaGVyaXRlZEZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKQoreworICByZXR1cm4gc3RkOjpmaW5kX2lmKG1faW5oZXJpdGVkRmFjZXMuYmVnaW4oKSwgbV9pbmhlcml0ZWRGYWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZjb21wYXJlRmFjZUlkLCBfMSwgZmFjZS5mYWNlSWQpKTsKK30KKworYm9vbAorUmliRW50cnk6Omhhc0luaGVyaXRlZEZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKQoreworICBGYWNlTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmaW5kSW5oZXJpdGVkRmFjZShmYWNlKTsKKworICByZXR1cm4gKGl0ICE9IG1faW5oZXJpdGVkRmFjZXMuZW5kKCkpOworfQorCitib29sCitSaWJFbnRyeTo6aGFzQ2FwdHVyZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX25GYWNlc1dpdGhDYXB0dXJlU2V0ID4gMDsKK30KKworYm9vbAorUmliRW50cnk6Omhhc0NoaWxkSW5oZXJpdE9uRmFjZUlkKHVpbnQ2NF90IGZhY2VJZCkgY29uc3QKK3sKKyAgZm9yIChSaWJFbnRyeTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2ZhY2VzLmJlZ2luKCk7IGl0ICE9IG1fZmFjZXMuZW5kKCk7ICsraXQpCisgICAgeworICAgICAgaWYgKGl0LT5mYWNlSWQgPT0gZmFjZUlkICYmIChpdC0+ZmxhZ3MgJiBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc2hhcmVkX3B0cjxGYWNlRW50cnk+CitSaWJFbnRyeTo6Z2V0RmFjZVdpdGhMb3dlc3RDb3N0QnlGYWNlSWQodWludDY0X3QgZmFjZUlkKQoreworICBzaGFyZWRfcHRyPEZhY2VFbnRyeT4gZmFjZTsKKworICBmb3IgKEZhY2VMaXN0OjppdGVyYXRvciBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgIC8vIENvcnJlY3QgZmFjZSBJRAorICAgICAgaWYgKGl0LT5mYWNlSWQgPT0gZmFjZUlkKQorICAgICAgICB7CisgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgZmFjZSB3aXRoIHRoaXMgSUQgZm91bmQKKyAgICAgICAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KGZhY2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYWNlID0gbWFrZV9zaGFyZWQ8RmFjZUVudHJ5PigqaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGl0LT5jb3N0IDwgZmFjZS0+Y29zdCkgLy8gRm91bmQgYSBmYWNlIHdpdGggYSBsb3dlciBjb3N0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhY2UgPSBtYWtlX3NoYXJlZDxGYWNlRW50cnk+KCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFjZTsKK30KKworc2hhcmVkX3B0cjxGYWNlRW50cnk+CitSaWJFbnRyeTo6Z2V0RmFjZVdpdGhMb3dlc3RDb3N0QW5kQ2hpbGRJbmhlcml0QnlGYWNlSWQodWludDY0X3QgZmFjZUlkKQoreworICBzaGFyZWRfcHRyPEZhY2VFbnRyeT4gZmFjZTsKKworICBmb3IgKEZhY2VMaXN0OjppdGVyYXRvciBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgIC8vIENvcnJlY3QgZmFjZSBJRCBhbmQgQ2hpbGQgSW5oZXJpdCBmbGFnIHNldAorICAgICAgaWYgKGl0LT5mYWNlSWQgPT0gZmFjZUlkICYmIGl0LT5mbGFncyAmIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBmYWNlIHdpdGggdGhpcyBJRCBmb3VuZAorICAgICAgICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhY2UgPSBtYWtlX3NoYXJlZDxGYWNlRW50cnk+KCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoaXQtPmNvc3QgPCBmYWNlLT5jb3N0KSAvLyBGb3VuZCBhIGZhY2Ugd2l0aCBhIGxvd2VyIGNvc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmFjZSA9IG1ha2Vfc2hhcmVkPEZhY2VFbnRyeT4oKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWNlOworfQorCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEZhY2VFbnRyeSYgZW50cnkpCit7CisgIG9zIDw8ICJGYWNlRW50cnkoIgorICAgICA8PCAiZmFjZWlkOiAiIDw8IGVudHJ5LmZhY2VJZAorICAgICA8PCAiLCBvcmlnaW46ICIgPDwgZW50cnkub3JpZ2luCisgICAgIDw8ICIsIGNvc3Q6ICIgPDwgZW50cnkuY29zdAorICAgICA8PCAiLCBmbGFnczogIiA8PCBlbnRyeS5mbGFnczsKKyAgaWYgKGVudHJ5LmV4cGlyZXMgIT0gdGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQ6Om1heCgpKSB7CisgICAgb3MgPDwgIiwgZXhwaXJlcyBpbjogIiA8PCAoZW50cnkuZXhwaXJlcyAtIHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCkpOworICB9CisgIGVsc2UgeworICAgIG9zIDw8ICIsIG5ldmVyIGV4cGlyZXMiOworICB9CisgIG9zIDw8ICIpIjsKKworICByZXR1cm4gb3M7Cit9CisKK3N0ZDo6b3N0cmVhbSYKK29wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgUmliRW50cnkmIGVudHJ5KQoreworICBvcyA8PCAiUmliRW50cnkge1xuIjsKKyAgb3MgPDwgIlx0TmFtZTogIiA8PCBlbnRyeS5nZXROYW1lKCkgPDwgIlxuIjsKKworICBmb3IgKFJpYkVudHJ5OjpGYWNlTGlzdDo6Y29uc3RfaXRlcmF0b3IgZmFjZUl0ID0gZW50cnkuY2JlZ2luKCk7IGZhY2VJdCAhPSBlbnRyeS5jZW5kKCk7ICsrZmFjZUl0KQorICAgIHsKKyAgICAgIG9zIDw8ICJcdCIgPDwgKCpmYWNlSXQpIDw8ICJcbiI7CisgICAgfQorCisgIG9zIDw8ICJ9IjsKKworICByZXR1cm4gb3M7Cit9CisKK30gLy8gbmFtZXNwYWNlIHJpYgorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvcmliL3JpYi1lbnRyeS5ocHAgYi9ORkQvcmliL3JpYi1lbnRyeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3MDg1YQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9yaWIvcmliLWVudHJ5LmhwcApAQCAtMCwwICsxLDI1OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfUklCX1JJQl9FTlRSWV9IUFAKKyNkZWZpbmUgTkZEX1JJQl9SSUJfRU5UUllfSFBQCisKKyNpbmNsdWRlICJmYWNlLWVudHJ5LmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcmliIHsKKworLyoqIFxjbGFzcyBSaWJFbnRyeQorICogIFxicmllZiByZXByZXNlbnRzIGEgbmFtZXNwYWNlCisgKi8KK2NsYXNzIFJpYkVudHJ5IDogcHVibGljIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFJpYkVudHJ5PgoreworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6bGlzdDxGYWNlRW50cnk+IEZhY2VMaXN0OworICB0eXBlZGVmIEZhY2VMaXN0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiBGYWNlTGlzdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgUmliRW50cnkoKQorICAgIDogbV9uRmFjZXNXaXRoQ2FwdHVyZVNldCgwKQorICB7CisgIH0KKworICB2b2lkCisgIHNldE5hbWUoY29uc3QgTmFtZSYgcHJlZml4KTsKKworICBjb25zdCBOYW1lJgorICBnZXROYW1lKCkgY29uc3Q7CisKKyAgc2hhcmVkX3B0cjxSaWJFbnRyeT4KKyAgZ2V0UGFyZW50KCkgY29uc3Q7CisKKyAgYm9vbAorICBoYXNQYXJlbnQoKSBjb25zdDsKKworICB2b2lkCisgIGFkZENoaWxkKHNoYXJlZF9wdHI8UmliRW50cnk+IGNoaWxkKTsKKworICB2b2lkCisgIHJlbW92ZUNoaWxkKHNoYXJlZF9wdHI8UmliRW50cnk+IGNoaWxkKTsKKworICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxSaWJFbnRyeT4gPiYKKyAgZ2V0Q2hpbGRyZW4oKTsKKworICBib29sCisgIGhhc0NoaWxkcmVuKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBpbnNlcnRzIGEgbmV3IGZhY2UgaW50byB0aGUgZW50cnkncyBmYWNlIGxpc3QKKyAgICogIElmIGFub3RoZXIgZW50cnkgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBmYWNlSWQgYW5kIG9yaWdpbiwKKyAgICogIHRoZSBuZXcgZmFjZSBpcyBub3QgaW5zZXJ0ZWQuCisgICAqICBccmV0dXJueyB0cnVlIGlmIHRoZSBmYWNlIGlzIGluc2VydGVkLCBmYWxzZSBvdGhlcndpc2UgfQorICAgKi8KKyAgYm9vbAorICBpbnNlcnRGYWNlKGNvbnN0IEZhY2VFbnRyeSYgZmFjZSk7CisKKyAgLyoqIFxicmllZiBlcmFzZXMgYSBGYWNlRW50cnkgd2l0aCB0aGUgc2FtZSBmYWNlSWQgYW5kIG9yaWdpbgorICAgKi8KKyAgdm9pZAorICBlcmFzZUZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKTsKKworICAvKiogXGJyaWVmIGVyYXNlcyBhIEZhY2VFbnRyeSB3aXRoIHRoZSBwYXNzZWQgaXRlcmF0b3IKKyAgICogIFxyZXR1cm57IGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IHRoYXQgZm9sbG93ZWQgdGhlIGVyYXNlZCBpdGVyYXRvciB9CisgICAqLworICBpdGVyYXRvcgorICBlcmFzZUZhY2UoRmFjZUxpc3Q6Oml0ZXJhdG9yIGZhY2UpOworCisgIGJvb2wKKyAgaGFzRmFjZUlkKGNvbnN0IHVpbnQ2NF90IGZhY2VJZCkgY29uc3Q7CisKKyAgRmFjZUxpc3QmCisgIGdldEZhY2VzKCk7CisKKyAgaXRlcmF0b3IKKyAgZmluZEZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKTsKKworICBib29sCisgIGhhc0ZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKTsKKworICB2b2lkCisgIGFkZEluaGVyaXRlZEZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKTsKKworICB2b2lkCisgIHJlbW92ZUluaGVyaXRlZEZhY2UoY29uc3QgRmFjZUVudHJ5JiBmYWNlKTsKKworICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGZhY2VzIHRoaXMgbmFtZXNwYWNlIGhhcyBpbmhlcml0ZWQuCisgICAqICBUaGUgaW5oZXJpdGVkIGZhY2VzIHJldHVybmVkIHJlcHJlc2VudCBpbmhlcml0ZWQgZW50cmllcyB0aGlzIG5hbWVzcGFjZSBoYXMgaW4gdGhlIEZJQi4KKyAgICogIFxyZXR1cm57IGZhY2VzIGluaGVyaXRlZCBieSB0aGlzIG5hbWVzcGFjZSB9CisgICAqLworICBGYWNlTGlzdCYKKyAgZ2V0SW5oZXJpdGVkRmFjZXMoKTsKKworICAvKiogXGJyaWVmIEZpbmRzIGFuIGluaGVyaXRlZCBmYWNlIHdpdGggYSBtYXRjaGluZyBmYWNlIElELgorICAgKiAgXHJldHVybnsgQW4gaXRlcmF0b3IgdG8gdGhlIG1hdGNoaW5nIGZhY2UgaWYgb25lIGlzIGZvdW5kOworICAgKiAgICAgICAgICAgb3RoZXJ3aXNlLCBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBlbnRyeSdzCisgICAqICAgICAgICAgICBpbmhlcml0ZWQgZmFjZSBsaXN0IH0KKyAgICovCisgIEZhY2VMaXN0OjppdGVyYXRvcgorICBmaW5kSW5oZXJpdGVkRmFjZShjb25zdCBGYWNlRW50cnkmIGZhY2UpOworCisgIC8qKiBcYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZW50cnkgaGFzIGFuIGluaGVyaXRlZCBmYWNlIHdpdGggYSBtYXRjaGluZyBmYWNlIElELgorICAgKiAgXHJldHVybnsgVHJ1ZSwgaWYgYSBtYXRjaGluZyBpbmhlcml0ZWQgZmFjZSBpcyBmb3VuZDsgb3RoZXJ3aXNlLCBmYWxzZS4gfQorICAgKi8KKyAgYm9vbAorICBoYXNJbmhlcml0ZWRGYWNlKGNvbnN0IEZhY2VFbnRyeSYgZmFjZSk7CisKKyAgYm9vbAorICBoYXNDYXB0dXJlKCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBlbnRyeSBoYXMgYW4gaW5oZXJpdGVkIGZhY2Ugd2l0aCB0aGUgcGFzc2VkCisgICAqICAgICAgICAgZmFjZSBJRCBhbmQgaXRzIGNoaWxkIGluaGVyaXQgZmxhZyBzZXQuCisgICAqICBccmV0dXJueyBUcnVlLCBpZiBhIG1hdGNoaW5nIGluaGVyaXRlZCBmYWNlIGlzIGZvdW5kOyBvdGhlcndpc2UsIGZhbHNlLiB9CisgICAqLworICBib29sCisgIGhhc0NoaWxkSW5oZXJpdE9uRmFjZUlkKHVpbnQ2NF90IGZhY2VJZCkgY29uc3Q7CisKKyAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBmYWNlIHdpdGggdGhlIGxvd2VzdCBjb3N0IHRoYXQgaGFzIHRoZSBwYXNzZWQgZmFjZSBJRC4KKyAgICogIFxyZXR1cm57IFRoZSBmYWNlIHdpdGggd2l0aCB0aGUgbG93ZXN0IGNvc3QgdGhhdCBoYXMgdGhlIHBhc3NlZCBmYWNlIElEfQorICAgKi8KKyAgc2hhcmVkX3B0cjxGYWNlRW50cnk+CisgIGdldEZhY2VXaXRoTG93ZXN0Q29zdEJ5RmFjZUlkKHVpbnQ2NF90IGZhY2VJZCk7CisKKyAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBmYWNlIHdpdGggdGhlIGxvd2VzdCBjb3N0IHRoYXQgaGFzIHRoZSBwYXNzZWQgZmFjZSBJRAorICAgKiAgICAgICAgIGFuZCBpdHMgY2hpbGQgaW5oZXJpdCBmbGFnIHNldC4KKyAgICogIFxyZXR1cm57IFRoZSBmYWNlIHdpdGggd2l0aCB0aGUgbG93ZXN0IGNvc3QgdGhhdCBoYXMgdGhlIHBhc3NlZCBmYWNlIElECisgICAqICAgICAgICAgICBhbmQgaXRzIGNoaWxkIGluaGVyaXQgZmxhZyBzZXQgfQorICAgKi8KKyAgc2hhcmVkX3B0cjxGYWNlRW50cnk+CisgIGdldEZhY2VXaXRoTG93ZXN0Q29zdEFuZENoaWxkSW5oZXJpdEJ5RmFjZUlkKHVpbnQ2NF90IGZhY2VJZCk7CisKKyAgY29uc3RfaXRlcmF0b3IKKyAgY2JlZ2luKCkgY29uc3Q7CisKKyAgY29uc3RfaXRlcmF0b3IKKyAgY2VuZCgpIGNvbnN0OworCisgIGl0ZXJhdG9yCisgIGJlZ2luKCk7CisKKyAgaXRlcmF0b3IKKyAgZW5kKCk7CisKK3ByaXZhdGU6CisgIHZvaWQKKyAgc2V0UGFyZW50KHNoYXJlZF9wdHI8UmliRW50cnk+IHBhcmVudCk7CisKK3ByaXZhdGU6CisgIE5hbWUgbV9uYW1lOworICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxSaWJFbnRyeT4gPiBtX2NoaWxkcmVuOworICBzaGFyZWRfcHRyPFJpYkVudHJ5PiBtX3BhcmVudDsKKyAgRmFjZUxpc3QgbV9mYWNlczsKKyAgRmFjZUxpc3QgbV9pbmhlcml0ZWRGYWNlczsKKworICAvKiogXGJyaWVmIFRoZSBudW1iZXIgb2YgZmFjZXMgb24gdGhpcyBuYW1lc3BhY2Ugd2l0aCB0aGUgY2FwdHVyZSBmbGFnIHNldC4KKyAgICoKKyAgICogIFRoaXMgY291bnQgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgbmFtZXNwYWNlIHdpbGwgYmxvY2sgaW5oZXJpdGVkIGZhY2VzLgorICAgKiAgSWYgdGhlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gemVybywgYSByb3V0ZSBvbiB0aGUgbmFtZXNwYWNlIGhhcyBpdCdzIGNhcHR1cmUKKyAgICogIGZsYWcgc2V0IHdoaWNoIG1lYW5zIHRoZSBuYW1lc3BhY2Ugc2hvdWxkIG5vdCBpbmhlcml0IGFueSBmYWNlcy4KKyAgICovCisgIHVpbnQ2NF90IG1fbkZhY2VzV2l0aENhcHR1cmVTZXQ7Cit9OworCitpbmxpbmUgdm9pZAorUmliRW50cnk6OnNldE5hbWUoY29uc3QgTmFtZSYgcHJlZml4KQoreworICBtX25hbWUgPSBwcmVmaXg7Cit9CisKK2lubGluZSBjb25zdCBOYW1lJgorUmliRW50cnk6OmdldE5hbWUoKSBjb25zdAoreworICByZXR1cm4gbV9uYW1lOworfQorCitpbmxpbmUgdm9pZAorUmliRW50cnk6OnNldFBhcmVudChzaGFyZWRfcHRyPFJpYkVudHJ5PiBwYXJlbnQpCit7CisgIG1fcGFyZW50ID0gcGFyZW50OworfQorCitpbmxpbmUgc2hhcmVkX3B0cjxSaWJFbnRyeT4KK1JpYkVudHJ5OjpnZXRQYXJlbnQoKSBjb25zdAoreworICByZXR1cm4gbV9wYXJlbnQ7Cit9CisKK2lubGluZSBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxSaWJFbnRyeT4gPiYKK1JpYkVudHJ5OjpnZXRDaGlsZHJlbigpCit7CisgIHJldHVybiBtX2NoaWxkcmVuOworfQorCitpbmxpbmUgUmliRW50cnk6OkZhY2VMaXN0JgorUmliRW50cnk6OmdldEZhY2VzKCkKK3sKKyAgcmV0dXJuIG1fZmFjZXM7Cit9CisKK2lubGluZSBSaWJFbnRyeTo6RmFjZUxpc3QmCitSaWJFbnRyeTo6Z2V0SW5oZXJpdGVkRmFjZXMoKQoreworICByZXR1cm4gbV9pbmhlcml0ZWRGYWNlczsKK30KKworaW5saW5lIFJpYkVudHJ5Ojpjb25zdF9pdGVyYXRvcgorUmliRW50cnk6OmNiZWdpbigpIGNvbnN0Cit7CisgIHJldHVybiBtX2ZhY2VzLmJlZ2luKCk7Cit9CisKK2lubGluZSBSaWJFbnRyeTo6Y29uc3RfaXRlcmF0b3IKK1JpYkVudHJ5OjpjZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fZmFjZXMuZW5kKCk7Cit9CisKK2lubGluZSBSaWJFbnRyeTo6aXRlcmF0b3IKK1JpYkVudHJ5OjpiZWdpbigpCit7CisgIHJldHVybiBtX2ZhY2VzLmJlZ2luKCk7Cit9CisKK2lubGluZSBSaWJFbnRyeTo6aXRlcmF0b3IKK1JpYkVudHJ5OjplbmQoKQoreworICByZXR1cm4gbV9mYWNlcy5lbmQoKTsKK30KKworc3RkOjpvc3RyZWFtJgorb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBSaWJFbnRyeSYgZW50cnkpOworCit9IC8vIG5hbWVzcGFjZSByaWIKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1JJQl9SSUJfRU5UUllfSFBQCmRpZmYgLS1naXQgYS9ORkQvcmliL3JpYi1tYW5hZ2VyLmNwcCBiL05GRC9yaWIvcmliLW1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMGY1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL3JpYi1tYW5hZ2VyLmNwcApAQCAtMCwwICsxLDg4MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInJpYi1tYW5hZ2VyLmhwcCIKKyNpbmNsdWRlICJjb3JlL2dsb2JhbC1pby5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvc2NoZWR1bGVyLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZhY2Utc3RhdHVzLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcmliIHsKKworTkZEX0xPR19JTklUKCJSaWJNYW5hZ2VyIik7CisKK2NvbnN0IE5hbWUgUmliTWFuYWdlcjo6Q09NTUFORF9QUkVGSVggPSAiL2xvY2FsaG9zdC9uZmQvcmliIjsKK2NvbnN0IE5hbWUgUmliTWFuYWdlcjo6UkVNT1RFX0NPTU1BTkRfUFJFRklYID0gIi9sb2NhbGhvcC9uZmQvcmliIjsKK2NvbnN0IE5hbWUgUmliTWFuYWdlcjo6RkFDRVNfTElTVF9EQVRBU0VUX1BSRUZJWCA9ICIvbG9jYWxob3N0L25mZC9mYWNlcy9saXN0IjsKKworY29uc3Qgc2l6ZV90IFJpYk1hbmFnZXI6OkNPTU1BTkRfVU5TSUdORURfTkNPTVBTID0KKyAgUmliTWFuYWdlcjo6Q09NTUFORF9QUkVGSVguc2l6ZSgpICsKKyAgMSArIC8vIHZlcmIKKyAgMTsgIC8vIHZlcmIgb3B0aW9ucworCitjb25zdCBzaXplX3QgUmliTWFuYWdlcjo6Q09NTUFORF9TSUdORURfTkNPTVBTID0KKyAgUmliTWFuYWdlcjo6Q09NTUFORF9VTlNJR05FRF9OQ09NUFMgKworICA0OyAvLyAodGltZXN0YW1wLCBub25jZSwgc2lnbmVkIGluZm8gdGx2LCBzaWduYXR1cmUgdGx2KQorCitjb25zdCBSaWJNYW5hZ2VyOjpTaWduZWRWZXJiQW5kUHJvY2Vzc29yIFJpYk1hbmFnZXI6OlNJR05FRF9DT01NQU5EX1ZFUkJTW10gPQorICB7CisgICAgU2lnbmVkVmVyYkFuZFByb2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgicmVnaXN0ZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZSaWJNYW5hZ2VyOjpyZWdpc3RlckVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorCisgICAgU2lnbmVkVmVyYkFuZFByb2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgidW5yZWdpc3RlciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJpYk1hbmFnZXI6OnVucmVnaXN0ZXJFbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgfTsKKworY29uc3QgUmliTWFuYWdlcjo6VW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yIFJpYk1hbmFnZXI6OlVOU0lHTkVEX0NPTU1BTkRfVkVSQlNbXSA9CisgIHsKKyAgICBVbnNpZ25lZFZlcmJBbmRQcm9jZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU6OkNvbXBvbmVudCgibGlzdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUmliTWFuYWdlcjo6bGlzdEVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgfTsKKworY29uc3QgTmFtZSBSaWJNYW5hZ2VyOjpMSVNUX0NPTU1BTkRfUFJFRklYKCIvbG9jYWxob3N0L25mZC9yaWIvbGlzdCIpOworY29uc3Qgc2l6ZV90IFJpYk1hbmFnZXI6OkxJU1RfQ09NTUFORF9OQ09NUFMgPSBMSVNUX0NPTU1BTkRfUFJFRklYLnNpemUoKTsKKworY29uc3QgdGltZTo6c2Vjb25kcyBSaWJNYW5hZ2VyOjpBQ1RJVkVfRkFDRV9GRVRDSF9JTlRFUlZBTCA9IHRpbWU6OnNlY29uZHMoMzAwKTsKKworUmliTWFuYWdlcjo6UmliTWFuYWdlcihuZG46OkZhY2UmIGZhY2UpCisgIDogbV9mYWNlKGZhY2UpCisgICwgbV9uZmRDb250cm9sbGVyKG1fZmFjZSwgbV9rZXlDaGFpbikKKyAgLCBtX2xvY2FsaG9zdFZhbGlkYXRvcihtX2ZhY2UpCisgICwgbV9sb2NhbGhvcFZhbGlkYXRvcihtX2ZhY2UpCisgICwgbV9mYWNlTW9uaXRvcihtX2ZhY2UpCisgICwgbV9pc0xvY2FsaG9wRW5hYmxlZChmYWxzZSkKKyAgLCBtX3JlbW90ZVJlZ2lzdHJhdG9yKG1fbmZkQ29udHJvbGxlciwgbV9rZXlDaGFpbiwgbV9tYW5hZ2VkUmliKQorICAsIG1fcmliU3RhdHVzUHVibGlzaGVyKG1fbWFuYWdlZFJpYiwgZmFjZSwgTElTVF9DT01NQU5EX1BSRUZJWCwgbV9rZXlDaGFpbikKKyAgLCBtX2xhc3RUcmFuc2FjdGlvbklkKDApCisgICwgbV9zaWduZWRWZXJiRGlzcGF0Y2goU0lHTkVEX0NPTU1BTkRfVkVSQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkVEX0NPTU1BTkRfVkVSQlMgKworICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoU0lHTkVEX0NPTU1BTkRfVkVSQlMpIC8gc2l6ZW9mKFNpZ25lZFZlcmJBbmRQcm9jZXNzb3IpKSkKKyAgLCBtX3Vuc2lnbmVkVmVyYkRpc3BhdGNoKFVOU0lHTkVEX0NPTU1BTkRfVkVSQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlNJR05FRF9DT01NQU5EX1ZFUkJTICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoVU5TSUdORURfQ09NTUFORF9WRVJCUykgLyBzaXplb2YoVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yKSkpCit7Cit9CisKK1JpYk1hbmFnZXI6On5SaWJNYW5hZ2VyKCkKK3sKKyAgc2NoZWR1bGVyOjpjYW5jZWwobV9hY3RpdmVGYWNlRmV0Y2hFdmVudCk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OnN0YXJ0TGlzdGVuaW5nKGNvbnN0IE5hbWUmIGNvbW1hbmRQcmVmaXgsIGNvbnN0IG5kbjo6T25JbnRlcmVzdCYgb25SZXF1ZXN0KQoreworICBORkRfTE9HX0lORk8oIkxpc3RlbmluZyBvbjogIiA8PCBjb21tYW5kUHJlZml4KTsKKworICBtX25mZENvbnRyb2xsZXIuc3RhcnQ8bmRuOjpuZmQ6OkZpYkFkZE5leHRIb3BDb21tYW5kPigKKyAgICBDb250cm9sUGFyYW1ldGVycygpCisgICAgICAuc2V0TmFtZShjb21tYW5kUHJlZml4KQorICAgICAgLnNldEZhY2VJZCgwKSwKKyAgICBiaW5kKCZSaWJNYW5hZ2VyOjpvbk5yZENvbW1hbmRQcmVmaXhBZGROZXh0SG9wU3VjY2VzcywgdGhpcywgY3JlZihjb21tYW5kUHJlZml4KSksCisgICAgYmluZCgmUmliTWFuYWdlcjo6b25OcmRDb21tYW5kUHJlZml4QWRkTmV4dEhvcEVycm9yLCB0aGlzLCBjcmVmKGNvbW1hbmRQcmVmaXgpLCBfMikpOworCisgIG1fZmFjZS5zZXRJbnRlcmVzdEZpbHRlcihjb21tYW5kUHJlZml4LCBvblJlcXVlc3QpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpyZWdpc3RlcldpdGhOZmQoKQoreworICAvL2NoZWNrIHdoZXRoZXIgdGhlIGNvbXBvbmVudHMgb2YgbG9jYWxob3AgYW5kIGxvY2FsaG9zdCBwcmVmaXhlcyBhcmUgc2FtZQorICBCT09TVF9BU1NFUlQoQ09NTUFORF9QUkVGSVguc2l6ZSgpID09IFJFTU9URV9DT01NQU5EX1BSRUZJWC5zaXplKCkpOworCisgIHRoaXMtPnN0YXJ0TGlzdGVuaW5nKENPTU1BTkRfUFJFRklYLCBiaW5kKCZSaWJNYW5hZ2VyOjpvbkxvY2FsaG9zdFJlcXVlc3QsIHRoaXMsIF8yKSk7CisKKyAgaWYgKG1faXNMb2NhbGhvcEVuYWJsZWQpIHsKKyAgICB0aGlzLT5zdGFydExpc3RlbmluZyhSRU1PVEVfQ09NTUFORF9QUkVGSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6b25Mb2NhbGhvcFJlcXVlc3QsIHRoaXMsIF8yKSk7CisgIH0KKworICBORkRfTE9HX0lORk8oIlN0YXJ0IG1vbml0b3JpbmcgZmFjZSBjcmVhdGUvZGVzdHJveSBldmVudHMiKTsKKyAgbV9mYWNlTW9uaXRvci5vbk5vdGlmaWNhdGlvbiArPSBiaW5kKCZSaWJNYW5hZ2VyOjpvbk5vdGlmaWNhdGlvbiwgdGhpcywgXzEpOworICBtX2ZhY2VNb25pdG9yLnN0YXJ0KCk7CisKKyAgc2NoZWR1bGVBY3RpdmVGYWNlRmV0Y2goQUNUSVZFX0ZBQ0VfRkVUQ0hfSU5URVJWQUwpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpzZXRDb25maWdGaWxlKENvbmZpZ0ZpbGUmIGNvbmZpZ0ZpbGUpCit7CisgIGNvbmZpZ0ZpbGUuYWRkU2VjdGlvbkhhbmRsZXIoInJpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6b25Db25maWcsIHRoaXMsIF8xLCBfMiwgXzMpKTsKK30KKwordm9pZAorUmliTWFuYWdlcjo6b25Db25maWcoY29uc3QgQ29uZmlnU2VjdGlvbiYgY29uZmlnU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEcnlSdW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIGJvb2wgaXNSZW1vdGVSZWdpc3RlckVuYWJsZWQgPSBmYWxzZTsKKworICBmb3IgKENvbmZpZ1NlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGkgPSBjb25maWdTZWN0aW9uLmJlZ2luKCk7CisgICAgICAgaSAhPSBjb25maWdTZWN0aW9uLmVuZCgpOyArK2kpCisgICAgeworICAgICAgaWYgKGktPmZpcnN0ID09ICJsb2NhbGhvc3Rfc2VjdXJpdHkiKQorICAgICAgICAgIG1fbG9jYWxob3N0VmFsaWRhdG9yLmxvYWQoaS0+c2Vjb25kLCBmaWxlbmFtZSk7CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAibG9jYWxob3Bfc2VjdXJpdHkiKQorICAgICAgICB7CisgICAgICAgICAgbV9sb2NhbGhvcFZhbGlkYXRvci5sb2FkKGktPnNlY29uZCwgZmlsZW5hbWUpOworICAgICAgICAgIG1faXNMb2NhbGhvcEVuYWJsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSAicmVtb3RlX3JlZ2lzdGVyIikKKyAgICAgICAgeworICAgICAgICAgIG1fcmVtb3RlUmVnaXN0cmF0b3IubG9hZENvbmZpZyhpLT5zZWNvbmQpOworICAgICAgICAgIGlzUmVtb3RlUmVnaXN0ZXJFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAvLyBhdm9pZCBvdGhlciBhY3Rpb25zIHdoZW4gaXNEcnlSdW4gPT0gdHJ1ZQorICAgICAgICAgIGlmIChpc0RyeVJ1bikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBtX3JlbW90ZVJlZ2lzdHJhdG9yLmVuYWJsZSgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgcmliIHByb3BlcnR5OiAiICsgaS0+Zmlyc3QpOworICAgIH0KKworICBpZiAoIWlzUmVtb3RlUmVnaXN0ZXJFbmFibGVkKQorICAgIHsKKyAgICAgIG1fcmVtb3RlUmVnaXN0cmF0b3IuZGlzYWJsZSgpOworICAgIH0KK30KKwordm9pZAorUmliTWFuYWdlcjo6c2VuZFJlc3BvbnNlKGNvbnN0IE5hbWUmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFJlc3BvbnNlJiByZXNwb25zZSkKK3sKKyAgY29uc3QgQmxvY2smIGVuY29kZWRDb250cm9sID0gcmVzcG9uc2Uud2lyZUVuY29kZSgpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gcmVzcG9uc2VEYXRhID0gbWFrZV9zaGFyZWQ8RGF0YT4obmFtZSk7CisgIHJlc3BvbnNlRGF0YS0+c2V0Q29udGVudChlbmNvZGVkQ29udHJvbCk7CisKKyAgbV9rZXlDaGFpbi5zaWduKCpyZXNwb25zZURhdGEpOworICBtX2ZhY2UucHV0KCpyZXNwb25zZURhdGEpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpzZW5kUmVzcG9uc2UoY29uc3QgTmFtZSYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KQoreworICBDb250cm9sUmVzcG9uc2UgcmVzcG9uc2UoY29kZSwgdGV4dCk7CisgIHNlbmRSZXNwb25zZShuYW1lLCByZXNwb25zZSk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6Om9uTG9jYWxob3N0UmVxdWVzdChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCkKK3sKKyAgY29uc3QgTmFtZSYgY29tbWFuZCA9IHJlcXVlc3QuZ2V0TmFtZSgpOworICBjb25zdCBOYW1lOjpDb21wb25lbnQmIHZlcmIgPSBjb21tYW5kLmdldChDT01NQU5EX1BSRUZJWC5zaXplKCkpOworCisgIFVuc2lnbmVkVmVyYkRpc3BhdGNoVGFibGU6OmNvbnN0X2l0ZXJhdG9yIHVuc2lnbmVkVmVyYlByb2Nlc3NvciA9IG1fdW5zaWduZWRWZXJiRGlzcGF0Y2guZmluZCh2ZXJiKTsKKworICBpZiAodW5zaWduZWRWZXJiUHJvY2Vzc29yICE9IG1fdW5zaWduZWRWZXJiRGlzcGF0Y2guZW5kKCkpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IHByb2Nlc3NpbmcgdW5zaWduZWQgdmVyYjogIiA8PCB2ZXJiKTsKKyAgICAgICh1bnNpZ25lZFZlcmJQcm9jZXNzb3ItPnNlY29uZCkodGhpcywgcmVxdWVzdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbV9sb2NhbGhvc3RWYWxpZGF0b3IudmFsaWRhdGUocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJpYk1hbmFnZXI6Om9uQ29tbWFuZFZhbGlkYXRlZCwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6b25Db21tYW5kVmFsaWRhdGlvbkZhaWxlZCwgdGhpcywgXzEsIF8yKSk7CisgICAgfQorfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvbkxvY2FsaG9wUmVxdWVzdChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCkKK3sKKyAgbV9sb2NhbGhvcFZhbGlkYXRvci52YWxpZGF0ZShyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJpYk1hbmFnZXI6Om9uQ29tbWFuZFZhbGlkYXRlZCwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJpYk1hbmFnZXI6Om9uQ29tbWFuZFZhbGlkYXRpb25GYWlsZWQsIHRoaXMsIF8xLCBfMikpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvbkNvbW1hbmRWYWxpZGF0ZWQoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QpCit7CisgIC8vIFJFTU9URV9DT01NQU5EX1BSRUZJWCBudW1iZXIgb2YgY29tcG9uZW5ldHMgYXJlIHNhbWUgYXMKKyAgLy8gTlJEX0NPTU1BTkRfUFJFRklYJ3Mgc28gbm8gZXh0cmEgY2hlY2tzIGFyZSByZXF1aXJlZC4KKworICBjb25zdCBOYW1lJiBjb21tYW5kID0gcmVxdWVzdC0+Z2V0TmFtZSgpOworICBjb25zdCBOYW1lOjpDb21wb25lbnQmIHZlcmIgPSBjb21tYW5kW0NPTU1BTkRfUFJFRklYLnNpemUoKV07CisgIGNvbnN0IE5hbWU6OkNvbXBvbmVudCYgcGFyYW1ldGVyQ29tcG9uZW50ID0gY29tbWFuZFtDT01NQU5EX1BSRUZJWC5zaXplKCkgKyAxXTsKKworICBTaWduZWRWZXJiRGlzcGF0Y2hUYWJsZTo6Y29uc3RfaXRlcmF0b3IgdmVyYlByb2Nlc3NvciA9IG1fc2lnbmVkVmVyYkRpc3BhdGNoLmZpbmQodmVyYik7CisgIGlmICh2ZXJiUHJvY2Vzc29yICE9IG1fc2lnbmVkVmVyYkRpc3BhdGNoLmVuZCgpKQorICAgIHsKKyAgICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgICAgICBpZiAoIWV4dHJhY3RQYXJhbWV0ZXJzKHBhcmFtZXRlckNvbXBvbmVudCwgcGFyYW1ldGVycykpCisgICAgICAgIHsKKyAgICAgICAgICBORkRfTE9HX0RFQlVHKCJjb21tYW5kIHJlc3VsdDogbWFsZm9ybWVkIHZlcmI6ICIgPDwgdmVyYik7CisgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHJlcXVlc3QpKQorICAgICAgICAgICAgc2VuZFJlc3BvbnNlKGNvbW1hbmQsIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIE5GRF9MT0dfREVCVUcoImNvbW1hbmQgcmVzdWx0OiBwcm9jZXNzaW5nIHZlcmI6ICIgPDwgdmVyYik7CisgICAgICAodmVyYlByb2Nlc3Nvci0+c2Vjb25kKSh0aGlzLCByZXF1ZXN0LCBwYXJhbWV0ZXJzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBORkRfTE9HX0RFQlVHKCJVbnN1cHBvcnRlZCBjb21tYW5kOiAiIDw8IHZlcmIpOworICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHJlcXVlc3QpKQorICAgICAgICBzZW5kUmVzcG9uc2UocmVxdWVzdC0+Z2V0TmFtZSgpLCA1MDEsICJVbnN1cHBvcnRlZCBjb21tYW5kIik7CisgICAgfQorfQorCit2b2lkCitSaWJNYW5hZ2VyOjpyZWdpc3RlckVudHJ5KGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycykKK3sKKyAgbmRuOjpuZmQ6OlJpYlJlZ2lzdGVyQ29tbWFuZCBjb21tYW5kOworCisgIGlmICghdmFsaWRhdGVQYXJhbWV0ZXJzKGNvbW1hbmQsIHBhcmFtZXRlcnMpKQorICAgIHsKKyAgICAgIE5GRF9MT0dfREVCVUcoInJlZ2lzdGVyIHJlc3VsdDogRkFJTCByZWFzb246IG1hbGZvcm1lZCIpOworCisgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocmVxdWVzdCkpCisgICAgICAgIHsKKyAgICAgICAgICBzZW5kUmVzcG9uc2UocmVxdWVzdC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICAgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYm9vbCBpc1NlbGZSZWdpc3RyYXRpb24gPSAoIXBhcmFtZXRlcnMuaGFzRmFjZUlkKCkgfHwgcGFyYW1ldGVycy5nZXRGYWNlSWQoKSA9PSAwKTsKKyAgaWYgKGlzU2VsZlJlZ2lzdHJhdGlvbikKKyAgICB7CisgICAgICBwYXJhbWV0ZXJzLnNldEZhY2VJZChyZXF1ZXN0LT5nZXRJbmNvbWluZ0ZhY2VJZCgpKTsKKyAgICB9CisKKyAgRmFjZUVudHJ5IGZhY2VFbnRyeTsKKyAgZmFjZUVudHJ5LmZhY2VJZCA9IHBhcmFtZXRlcnMuZ2V0RmFjZUlkKCk7CisgIGZhY2VFbnRyeS5vcmlnaW4gPSBwYXJhbWV0ZXJzLmdldE9yaWdpbigpOworICBmYWNlRW50cnkuY29zdCA9IHBhcmFtZXRlcnMuZ2V0Q29zdCgpOworICBmYWNlRW50cnkuZmxhZ3MgPSBwYXJhbWV0ZXJzLmdldEZsYWdzKCk7CisKKyAgaWYgKHBhcmFtZXRlcnMuaGFzRXhwaXJhdGlvblBlcmlvZCgpICYmCisgICAgICBwYXJhbWV0ZXJzLmdldEV4cGlyYXRpb25QZXJpb2QoKSAhPSB0aW1lOjptaWxsaXNlY29uZHM6Om1heCgpKQorICAgIHsKKyAgICAgIGZhY2VFbnRyeS5leHBpcmVzID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSArIHBhcmFtZXRlcnMuZ2V0RXhwaXJhdGlvblBlcmlvZCgpOworCisgICAgICAvLyBTY2hlZHVsZSBhIG5ldyBldmVudCwgdGhlIG9sZCBvbmUgd2lsbCBiZSBjYW5jZWxsZWQgZHVyaW5nIHJpYiBpbnNlcnRpb24uCisgICAgICBFdmVudElkIGV2ZW50SWQ7CisgICAgICBldmVudElkID0gc2NoZWR1bGVyOjpzY2hlZHVsZShwYXJhbWV0ZXJzLmdldEV4cGlyYXRpb25QZXJpb2QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJpYk1hbmFnZXI6OmV4cGlyZUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2hhcmVkX3B0cjxJbnRlcmVzdD4oKSwgcGFyYW1ldGVycykpOworICAgICAgTkZEX0xPR19UUkFDRSgiU2NoZWR1bGVkIHVucmVnaXN0cmF0aW9uIGF0OiAiIDw8IGZhY2VFbnRyeS5leHBpcmVzIDw8CisgICAgICAgICAgICAgICAgICAgICIgd2l0aCBFdmVudElkOiAiIDw8IGV2ZW50SWQpOworCisgICAgICAvL3NldCB0aGUgIE5ld0V2ZW50SWQgb2YgdGhpcyBlbnRyeQorICAgICAgZmFjZUVudHJ5LnNldEV4cGlyYXRpb25FdmVudChldmVudElkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmYWNlRW50cnkuZXhwaXJlcyA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50OjptYXgoKTsKKyAgICB9CisKKyAgTkZEX0xPR19UUkFDRSgicmVnaXN0ZXIgcHJlZml4OiAiIDw8IGZhY2VFbnRyeSk7CisKKyAgbV9tYW5hZ2VkUmliLmluc2VydChwYXJhbWV0ZXJzLmdldE5hbWUoKSwgZmFjZUVudHJ5KTsKKyAgbV9yZWdpc3RlcmVkRmFjZXMuaW5zZXJ0KGZhY2VFbnRyeS5mYWNlSWQpOworCisgIHNlbmRVcGRhdGVzVG9GaWIocmVxdWVzdCwgcGFyYW1ldGVycyk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OmV4cGlyZUVudHJ5KGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1zKQoreworICBGYWNlRW50cnkgZmFjZTsKKyAgZmFjZS5mYWNlSWQgPSBwYXJhbXMuZ2V0RmFjZUlkKCk7CisgIGZhY2Uub3JpZ2luID0gcGFyYW1zLmdldE9yaWdpbigpOworICBmYWNlLmNvc3QgPSBwYXJhbXMuZ2V0Q29zdCgpOworICBmYWNlLmZsYWdzID0gcGFyYW1zLmdldEZsYWdzKCk7CisKKyAgTkZEX0xPR19ERUJVRyhmYWNlIDw8ICIgZm9yICIgPDwgcGFyYW1zLmdldE5hbWUoKSA8PCAiIGhhcyBleHBpcmVkIik7CisgIHVucmVnaXN0ZXJFbnRyeShyZXF1ZXN0LCBwYXJhbXMpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjp1bnJlZ2lzdGVyRW50cnkoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgbmRuOjpuZmQ6OlJpYlVucmVnaXN0ZXJDb21tYW5kIGNvbW1hbmQ7CisKKyAgLy9wYXNzaW5nIGFsbCBwYXJhbWV0ZXJzIGdpdmVzIGVycm9yIGluIHZhbGlkYXRpb24uCisgIC8vc28gcGFzc2luZyBvbmx5IHRoZSByZXF1aXJlZCBhcmd1bWVudHMuCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZShwYXJhbXMuZ2V0TmFtZSgpKTsKKyAgaWYgKHBhcmFtcy5oYXNGYWNlSWQoKSkKKyAgICBwYXJhbWV0ZXJzLnNldEZhY2VJZChwYXJhbXMuZ2V0RmFjZUlkKCkpOworICBpZiAocGFyYW1zLmhhc09yaWdpbigpKQorICAgIHBhcmFtZXRlcnMuc2V0T3JpZ2luKHBhcmFtcy5nZXRPcmlnaW4oKSk7CisKKyAgaWYgKCF2YWxpZGF0ZVBhcmFtZXRlcnMoY29tbWFuZCwgcGFyYW1ldGVycykpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygidW5yZWdpc3RlciByZXN1bHQ6IEZBSUwgcmVhc29uOiBtYWxmb3JtZWQiKTsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihyZXF1ZXN0KSkKKyAgICAgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYm9vbCBpc1NlbGZSZWdpc3RyYXRpb24gPSAoIXBhcmFtZXRlcnMuaGFzRmFjZUlkKCkgfHwgcGFyYW1ldGVycy5nZXRGYWNlSWQoKSA9PSAwKTsKKyAgaWYgKGlzU2VsZlJlZ2lzdHJhdGlvbikKKyAgICB7CisgICAgICBwYXJhbWV0ZXJzLnNldEZhY2VJZChyZXF1ZXN0LT5nZXRJbmNvbWluZ0ZhY2VJZCgpKTsKKyAgICB9CisKKyAgRmFjZUVudHJ5IGZhY2VFbnRyeTsKKyAgZmFjZUVudHJ5LmZhY2VJZCA9IHBhcmFtZXRlcnMuZ2V0RmFjZUlkKCk7CisgIGZhY2VFbnRyeS5vcmlnaW4gPSBwYXJhbWV0ZXJzLmdldE9yaWdpbigpOworCisgIE5GRF9MT0dfVFJBQ0UoInVucmVnaXN0ZXIgcHJlZml4OiAiIDw8IGZhY2VFbnRyeSk7CisKKyAgbV9tYW5hZ2VkUmliLmVyYXNlKHBhcmFtZXRlcnMuZ2V0TmFtZSgpLCBmYWNlRW50cnkpOworCisgIHNlbmRVcGRhdGVzVG9GaWIocmVxdWVzdCwgcGFyYW1ldGVycyk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6Om9uQ29tbWFuZFZhbGlkYXRpb25GYWlsZWQoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmYWlsdXJlSW5mbykKK3sKKyAgTkZEX0xPR19ERUJVRygiUmliUmVxdWVzdFZhbGlkYXRpb25GYWlsZWQ6ICIgPDwgZmFpbHVyZUluZm8pOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocmVxdWVzdCkpCisgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QtPmdldE5hbWUoKSwgNDAzLCBmYWlsdXJlSW5mbyk7Cit9CisKKworYm9vbAorUmliTWFuYWdlcjo6ZXh0cmFjdFBhcmFtZXRlcnMoY29uc3QgTmFtZTo6Q29tcG9uZW50JiBwYXJhbWV0ZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyYgZXh0cmFjdGVkUGFyYW1ldGVycykKK3sKKyAgdHJ5CisgICAgeworICAgICAgQmxvY2sgcmF3UGFyYW1ldGVycyA9IHBhcmFtZXRlckNvbXBvbmVudC5ibG9ja0Zyb21WYWx1ZSgpOworICAgICAgZXh0cmFjdGVkUGFyYW1ldGVycy53aXJlRGVjb2RlKHJhd1BhcmFtZXRlcnMpOworICAgIH0KKyAgY2F0Y2ggKGNvbnN0IHRsdjo6RXJyb3ImKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgTkZEX0xPR19ERUJVRygiUGFyYW1ldGVycyBwYXJzZWQgT0siKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK1JpYk1hbmFnZXI6OnZhbGlkYXRlUGFyYW1ldGVycyhjb25zdCBDb250cm9sQ29tbWFuZCYgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycykKK3sKKyAgdHJ5CisgICAgeworICAgICAgY29tbWFuZC52YWxpZGF0ZVJlcXVlc3QocGFyYW1ldGVycyk7CisgICAgfQorICBjYXRjaCAoY29uc3QgQ29udHJvbENvbW1hbmQ6OkFyZ3VtZW50RXJyb3ImKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgY29tbWFuZC5hcHBseURlZmF1bHRzVG9SZXF1ZXN0KHBhcmFtZXRlcnMpOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvbkNvbW1hbmRFcnJvcih1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VFbnRyeSYgZmFjZUVudHJ5KQoreworICBORkRfTE9HX0VSUk9SKCJORkQgcmV0dXJuZWQgYW4gZXJyb3I6ICIgPDwgZXJyb3IgPDwgIiAoY29kZTogIiA8PCBjb2RlIDw8ICIpIik7CisKKyAgQ29udHJvbFJlc3BvbnNlIHJlc3BvbnNlOworCisgIGlmIChjb2RlID09IDQwNCkKKyAgICB7CisgICAgICByZXNwb25zZS5zZXRDb2RlKGNvZGUpOworICAgICAgcmVzcG9uc2Uuc2V0VGV4dChlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzcG9uc2Uuc2V0Q29kZSg1MzMpOworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkZhaWx1cmUgdG8gdXBkYXRlIE5GRCAiIDw8ICIoTkZEIEVycm9yOiAiIDw8IGNvZGUgPDwgIiAiIDw8IGVycm9yIDw8ICIpIjsKKyAgICAgIHJlc3BvbnNlLnNldFRleHQob3Muc3RyKCkpOworICAgIH0KKworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocmVxdWVzdCkpCisgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QtPmdldE5hbWUoKSwgcmVzcG9uc2UpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvblJlZ1N1Y2Nlc3MoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUVudHJ5JiBmYWNlRW50cnkpCit7CisgIENvbnRyb2xSZXNwb25zZSByZXNwb25zZTsKKworICByZXNwb25zZS5zZXRDb2RlKDIwMCk7CisgIHJlc3BvbnNlLnNldFRleHQoIlN1Y2Nlc3MiKTsKKyAgcmVzcG9uc2Uuc2V0Qm9keShwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTkZEX0xPR19UUkFDRSgib25SZWdTdWNjZXNzOiByZWdpc3RlcmVkICIgPDwgZmFjZUVudHJ5KTsKKworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocmVxdWVzdCkpCisgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QtPmdldE5hbWUoKSwgcmVzcG9uc2UpOworfQorCisKK3ZvaWQKK1JpYk1hbmFnZXI6Om9uVW5SZWdTdWNjZXNzKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlRW50cnkmIGZhY2VFbnRyeSkKK3sKKyAgQ29udHJvbFJlc3BvbnNlIHJlc3BvbnNlOworCisgIHJlc3BvbnNlLnNldENvZGUoMjAwKTsKKyAgcmVzcG9uc2Uuc2V0VGV4dCgiU3VjY2VzcyIpOworICByZXNwb25zZS5zZXRCb2R5KHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBORkRfTE9HX1RSQUNFKCJvblVuUmVnU3VjY2VzczogdW5yZWdpc3RlcmVkICIgPDwgZmFjZUVudHJ5KTsKKworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocmVxdWVzdCkpCisgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QtPmdldE5hbWUoKSwgcmVzcG9uc2UpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpzZW5kU3VjY2Vzc1Jlc3BvbnNlKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycykKK3sKKyAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihyZXF1ZXN0KSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIENvbnRyb2xSZXNwb25zZSByZXNwb25zZTsKKworICByZXNwb25zZS5zZXRDb2RlKDIwMCk7CisgIHJlc3BvbnNlLnNldFRleHQoIlN1Y2Nlc3MiKTsKKyAgcmVzcG9uc2Uuc2V0Qm9keShwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHJlcXVlc3QpKQorICAgIHNlbmRSZXNwb25zZShyZXF1ZXN0LT5nZXROYW1lKCksIHJlc3BvbnNlKTsKK30KKwordm9pZAorUmliTWFuYWdlcjo6c2VuZEVycm9yUmVzcG9uc2UodWludDMyX3QgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QpCit7CisgIE5GRF9MT0dfRVJST1IoIk5GRCByZXR1cm5lZCBhbiBlcnJvcjogIiA8PCBlcnJvciA8PCAiIChjb2RlOiAiIDw8IGNvZGUgPDwgIikiKTsKKworICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHJlcXVlc3QpKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgQ29udHJvbFJlc3BvbnNlIHJlc3BvbnNlOworCisgIGlmIChjb2RlID09IDQwNCkKKyAgICB7CisgICAgICByZXNwb25zZS5zZXRDb2RlKGNvZGUpOworICAgICAgcmVzcG9uc2Uuc2V0VGV4dChlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzcG9uc2Uuc2V0Q29kZSg1MzMpOworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkZhaWx1cmUgdG8gdXBkYXRlIE5GRCAiIDw8ICIoTkZEIEVycm9yOiAiIDw8IGNvZGUgPDwgIiAiIDw8IGVycm9yIDw8ICIpIjsKKyAgICAgIHJlc3BvbnNlLnNldFRleHQob3Muc3RyKCkpOworICAgIH0KKworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocmVxdWVzdCkpCisgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QtPmdldE5hbWUoKSwgcmVzcG9uc2UpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvbk5yZENvbW1hbmRQcmVmaXhBZGROZXh0SG9wU3VjY2Vzcyhjb25zdCBOYW1lJiBwcmVmaXgpCit7CisgIE5GRF9MT0dfREVCVUcoIlN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkICIgKyBwcmVmaXgudG9VcmkoKSArICIgd2l0aCBORkQiKTsKK30KKwordm9pZAorUmliTWFuYWdlcjo6b25OcmRDb21tYW5kUHJlZml4QWRkTmV4dEhvcEVycm9yKGNvbnN0IE5hbWUmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpCit7CisgIHRocm93IEVycm9yKCJFcnJvciBpbiBzZXR0aW5nIGludGVyZXN0IGZpbHRlciAoIiArIG5hbWUudG9VcmkoKSArICIpOiAiICsgbXNnKTsKK30KKworYm9vbAorUmliTWFuYWdlcjo6aXNUcmFuc2FjdGlvbkNvbXBsZXRlKGNvbnN0IFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCkKK3sKKyAgRmliVHJhbnNhY3Rpb25UYWJsZTo6aXRlcmF0b3IgaXQgPSBtX3BlbmRpbmdGaWJUcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKworICBpZiAoaXQgIT0gbV9wZW5kaW5nRmliVHJhbnNhY3Rpb25zLmVuZCgpKQorICAgIHsKKyAgICAgIGludCYgdXBkYXRlc0xlZnQgPSBpdC0+c2Vjb25kOworCisgICAgICB1cGRhdGVzTGVmdC0tOworCisgICAgICAvLyBBbGwgb2YgdGhlIHVwZGF0ZXMgaGF2ZSBiZWVuIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5CisgICAgICBpZiAodXBkYXRlc0xlZnQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIG1fcGVuZGluZ0ZpYlRyYW5zYWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OmludmFsaWRhdGVUcmFuc2FjdGlvbihjb25zdCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQpCit7CisgIEZpYlRyYW5zYWN0aW9uVGFibGU6Oml0ZXJhdG9yIGl0ID0gbV9wZW5kaW5nRmliVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisKKyAgaWYgKGl0ICE9IG1fcGVuZGluZ0ZpYlRyYW5zYWN0aW9ucy5lbmQoKSkKKyAgICB7CisgICAgICBtX3BlbmRpbmdGaWJUcmFuc2FjdGlvbnMuZXJhc2UoaXQpOworICAgIH0KK30KKwordm9pZAorUmliTWFuYWdlcjo6b25BZGROZXh0SG9wU3VjY2Vzcyhjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBzaG91bGRTZW5kUmVzcG9uc2UpCit7CisgIGlmIChpc1RyYW5zYWN0aW9uQ29tcGxldGUodHJhbnNhY3Rpb25JZCkgJiYgc2hvdWxkU2VuZFJlc3BvbnNlKQorICAgIHsKKyAgICAgIHNlbmRTdWNjZXNzUmVzcG9uc2UocmVxdWVzdCwgcGFyYW1ldGVycyk7CisgICAgfQorfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvbkFkZE5leHRIb3BFcnJvcih1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgY29uc3QgYm9vbCBzaG91bGRTZW5kUmVzcG9uc2UpCit7CisgIGludmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbklkKTsKKworICBpZiAoc2hvdWxkU2VuZFJlc3BvbnNlKQorICB7CisgICAgc2VuZEVycm9yUmVzcG9uc2UoY29kZSwgZXJyb3IsIHJlcXVlc3QpOworICB9CisKKyAgLy8gU2luY2UgdGhlIEZJQiByZWplY3RlZCB0aGUgdXBkYXRlLCBjbGVhbiB1cCB0aGUgaW52YWxpZCBmYWNlCisgIHNjaGVkdWxlQWN0aXZlRmFjZUZldGNoKHRpbWU6OnNlY29uZHMoMSkpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvblJlbW92ZU5leHRIb3BTdWNjZXNzKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHNob3VsZFNlbmRSZXNwb25zZSkKK3sKKyAgaWYgKGlzVHJhbnNhY3Rpb25Db21wbGV0ZSh0cmFuc2FjdGlvbklkKSAmJiBzaG91bGRTZW5kUmVzcG9uc2UpCisgICAgeworICAgICAgc2VuZFN1Y2Nlc3NSZXNwb25zZShyZXF1ZXN0LCBwYXJhbWV0ZXJzKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6Om9uUmVtb3ZlTmV4dEhvcEVycm9yKHVpbnQzMl90IGNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBjb25zdCBib29sIHNob3VsZFNlbmRSZXNwb25zZSkKK3sKKyAgaW52YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uSWQpOworCisgIGlmIChzaG91bGRTZW5kUmVzcG9uc2UpCisgIHsKKyAgICBzZW5kRXJyb3JSZXNwb25zZShjb2RlLCBlcnJvciwgcmVxdWVzdCk7CisgIH0KK30KKwordm9pZAorUmliTWFuYWdlcjo6b25Db250cm9sSGVhZGVyU3VjY2VzcygpCit7CisgIE5GRF9MT0dfREVCVUcoIkxvY2FsIGNvbnRyb2wgaGVhZGVyIGVuYWJsZWQiKTsKK30KKwordm9pZAorUmliTWFuYWdlcjo6b25Db250cm9sSGVhZGVyRXJyb3IodWludDMyX3QgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbikKK3sKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICBvcyA8PCAiQ291bGRuJ3QgZW5hYmxlIGxvY2FsIGNvbnRyb2wgaGVhZGVyICIKKyAgICAgPDwgIihjb2RlOiAiIDw8IGNvZGUgPDwgIiwgaW5mbzogIiA8PCByZWFzb24gPDwgIikiOworICB0aHJvdyBFcnJvcihvcy5zdHIoKSk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OmVuYWJsZUxvY2FsQ29udHJvbEhlYWRlcigpCit7CisgIG1fbmZkQ29udHJvbGxlci5zdGFydDxuZG46Om5mZDo6RmFjZUVuYWJsZUxvY2FsQ29udHJvbENvbW1hbmQ+KAorICAgIENvbnRyb2xQYXJhbWV0ZXJzKCkKKyAgICAgIC5zZXRMb2NhbENvbnRyb2xGZWF0dXJlKG5kbjo6bmZkOjpMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCksCisgICAgYmluZCgmUmliTWFuYWdlcjo6b25Db250cm9sSGVhZGVyU3VjY2VzcywgdGhpcyksCisgICAgYmluZCgmUmliTWFuYWdlcjo6b25Db250cm9sSGVhZGVyRXJyb3IsIHRoaXMsIF8xLCBfMikpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpvbk5vdGlmaWNhdGlvbihjb25zdCBGYWNlRXZlbnROb3RpZmljYXRpb24mIG5vdGlmaWNhdGlvbikKK3sKKyAgTkZEX0xPR19UUkFDRSgib25Ob3RpZmljYXRpb246ICIgPDwgbm90aWZpY2F0aW9uKTsKKworICBpZiAobm90aWZpY2F0aW9uLmdldEtpbmQoKSA9PSBuZG46Om5mZDo6RkFDRV9FVkVOVF9ERVNUUk9ZRUQpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiUmVjZWl2ZWQgbm90aWZpY2F0aW9uIGZvciBkZXN0cm95ZWQgZmFjZUlkOiAiIDw8IG5vdGlmaWNhdGlvbi5nZXRGYWNlSWQoKSk7CisKKyAgICAgIHNjaGVkdWxlcjo6c2NoZWR1bGUodGltZTo6c2Vjb25kcygwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6cHJvY2Vzc0VyYXN1cmVBZnRlck5vdGlmaWNhdGlvbiwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uZ2V0RmFjZUlkKCkpKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OnByb2Nlc3NFcmFzdXJlQWZ0ZXJOb3RpZmljYXRpb24odWludDY0X3QgZmFjZUlkKQoreworICBtX21hbmFnZWRSaWIuZXJhc2UoZmFjZUlkKTsKKyAgbV9yZWdpc3RlcmVkRmFjZXMuZXJhc2UoZmFjZUlkKTsKKworICBzZW5kVXBkYXRlc1RvRmliQWZ0ZXJGYWNlRGVzdHJveUV2ZW50KCk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OnNlbmRVcGRhdGVzVG9GaWIoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKQoreworICBjb25zdCBSaWI6OkZpYlVwZGF0ZUxpc3QmIHVwZGF0ZXMgPSBtX21hbmFnZWRSaWIuZ2V0RmliVXBkYXRlcygpOworCisgIC8vIElmIG5vIHVwZGF0ZXMgd2VyZSBnZW5lcmF0ZWQsIGNvbnNpZGVyIHRoZSBvcGVyYXRpb24gYSBzdWNjZXNzCisgIGlmICh1cGRhdGVzLmVtcHR5KCkpCisgICAgeworICAgICAgc2VuZFN1Y2Nlc3NSZXNwb25zZShyZXF1ZXN0LCBwYXJhbWV0ZXJzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYm9vbCBzaG91bGRXYWl0VG9SZXNwb25kID0gZmFsc2U7CisKKyAgLy8gQW4gYXBwbGljYXRpb24gcmVxdWVzdCBzaG91bGQgd2FpdCBmb3IgYWxsIEZJQiB1cGRhdGVzIHRvIGJlIGFwcGxpZWQKKyAgLy8gc3VjY2Vzc2Z1bGx5IGJlZm9yZSBzZW5kaW5nIGEgcmVzcG9uc2UKKyAgaWYgKHBhcmFtZXRlcnMuZ2V0T3JpZ2luKCkgPT0gbmRuOjpuZmQ6OlJPVVRFX09SSUdJTl9BUFApCisgICAgeworICAgICAgc2hvdWxkV2FpdFRvUmVzcG9uZCA9IHRydWU7CisgICAgfQorICBlbHNlIC8vIFJlc3BvbmQgaW1tZWRpYXRlbHkKKyAgICB7CisgICAgICBzZW5kU3VjY2Vzc1Jlc3BvbnNlKHJlcXVlc3QsIHBhcmFtZXRlcnMpOworICAgIH0KKworICBzdGQ6OnN0cmluZyB1cGRhdGVTdHJpbmcgPSAodXBkYXRlcy5zaXplKCkgPT0gMSkgPyAiIHVwZGF0ZSIgOiAiIHVwZGF0ZXMiOworICBORkRfTE9HX0RFQlVHKCJBcHBseWluZyAiIDw8IHVwZGF0ZXMuc2l6ZSgpIDw8IHVwZGF0ZVN0cmluZyA8PCAiIHRvIEZJQiIpOworCisgIC8vIEFzc2lnbiBhbiBJRCB0byB0aGlzIEZJQiB0cmFuc2FjdGlvbgorICBUcmFuc2FjdGlvbklkIGN1cnJlbnRUcmFuc2FjdGlvbklkID0gKyttX2xhc3RUcmFuc2FjdGlvbklkOworCisgIC8vIEFkZCB0aGlzIHRyYW5zYWN0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiB0YWJsZQorICBtX3BlbmRpbmdGaWJUcmFuc2FjdGlvbnNbY3VycmVudFRyYW5zYWN0aW9uSWRdID0gdXBkYXRlcy5zaXplKCk7CisKKyAgZm9yIChSaWI6OkZpYlVwZGF0ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdXBkYXRlcy5iZWdpbigpOyBpdCAhPSB1cGRhdGVzLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgIHNoYXJlZF9wdHI8Y29uc3QgRmliVXBkYXRlPiB1cGRhdGUoKml0KTsKKyAgICAgIE5GRF9MT0dfREVCVUcoIlNlbmRpbmcgRklCIHVwZGF0ZTogIiA8PCAqdXBkYXRlKTsKKworICAgICAgaWYgKHVwZGF0ZS0+YWN0aW9uID09IEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApCisgICAgICAgIHsKKyAgICAgICAgICBGYWNlRW50cnkgZmFjZUVudHJ5OworICAgICAgICAgIGZhY2VFbnRyeS5mYWNlSWQgPSB1cGRhdGUtPmZhY2VJZDsKKyAgICAgICAgICBmYWNlRW50cnkuY29zdCA9IHVwZGF0ZS0+Y29zdDsKKworICAgICAgICAgIG1fbmZkQ29udHJvbGxlci5zdGFydDxuZG46Om5mZDo6RmliQWRkTmV4dEhvcENvbW1hbmQ+KAorICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAuc2V0TmFtZSh1cGRhdGUtPm5hbWUpCisgICAgICAgICAgICAgIC5zZXRGYWNlSWQoZmFjZUVudHJ5LmZhY2VJZCkKKyAgICAgICAgICAgICAgLnNldENvc3QoZmFjZUVudHJ5LmNvc3QpLAorICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6b25BZGROZXh0SG9wU3VjY2VzcywgdGhpcywgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFdhaXRUb1Jlc3BvbmQpLAorICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6b25BZGROZXh0SG9wRXJyb3IsIHRoaXMsIF8xLCBfMiwgcmVxdWVzdCwgY3VycmVudFRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRXYWl0VG9SZXNwb25kKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHVwZGF0ZS0+YWN0aW9uID09IEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApCisgICAgICAgIHsKKyAgICAgICAgICBGYWNlRW50cnkgZmFjZUVudHJ5OworICAgICAgICAgIGZhY2VFbnRyeS5mYWNlSWQgPSB1cGRhdGUtPmZhY2VJZDsKKworICAgICAgICAgIG1fbmZkQ29udHJvbGxlci5zdGFydDxuZG46Om5mZDo6RmliUmVtb3ZlTmV4dEhvcENvbW1hbmQ+KAorICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAuc2V0TmFtZSh1cGRhdGUtPm5hbWUpCisgICAgICAgICAgICAgIC5zZXRGYWNlSWQoZmFjZUVudHJ5LmZhY2VJZCksCisgICAgICAgICAgICBiaW5kKCZSaWJNYW5hZ2VyOjpvblJlbW92ZU5leHRIb3BTdWNjZXNzLCB0aGlzLCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkV2FpdFRvUmVzcG9uZCksCisgICAgICAgICAgICBiaW5kKCZSaWJNYW5hZ2VyOjpvblJlbW92ZU5leHRIb3BFcnJvciwgdGhpcywgXzEsIF8yLCByZXF1ZXN0LCBjdXJyZW50VHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFdhaXRUb1Jlc3BvbmQpKTsKKyAgICAgICAgfQorICAgIH0KKworICBtX21hbmFnZWRSaWIuY2xlYXJGaWJVcGRhdGVzKCk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OnNlbmRVcGRhdGVzVG9GaWJBZnRlckZhY2VEZXN0cm95RXZlbnQoKQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE9yaWdpbihuZG46Om5mZDo6Uk9VVEVfT1JJR0lOX1NUQVRJQyk7CisKKyAgc2VuZFVwZGF0ZXNUb0ZpYihzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PigpLCBwYXJhbWV0ZXJzKTsKK30KKwordm9pZAorUmliTWFuYWdlcjo6bGlzdEVudHJpZXMoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpCit7CisgIGNvbnN0IE5hbWUmIGNvbW1hbmQgPSByZXF1ZXN0LmdldE5hbWUoKTsKKyAgY29uc3Qgc2l6ZV90IGNvbW1hbmROQ29tcHMgPSBjb21tYW5kLnNpemUoKTsKKworICBpZiAoY29tbWFuZE5Db21wcyA8IExJU1RfQ09NTUFORF9OQ09NUFMgfHwKKyAgICAgICFMSVNUX0NPTU1BTkRfUFJFRklYLmlzUHJlZml4T2YoY29tbWFuZCkpCisgICAgeworICAgICAgTkZEX0xPR19ERUJVRygiY29tbWFuZCByZXN1bHQ6IG1hbGZvcm1lZCIpOworICAgICAgc2VuZFJlc3BvbnNlKGNvbW1hbmQsIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG1fcmliU3RhdHVzUHVibGlzaGVyLnB1Ymxpc2goKTsKK30KKwordm9pZAorUmliTWFuYWdlcjo6c2NoZWR1bGVBY3RpdmVGYWNlRmV0Y2goY29uc3QgdGltZTo6c2Vjb25kcyYgdGltZVRvV2FpdCkKK3sKKyAgc2NoZWR1bGVyOjpjYW5jZWwobV9hY3RpdmVGYWNlRmV0Y2hFdmVudCk7CisKKyAgbV9hY3RpdmVGYWNlRmV0Y2hFdmVudCA9IHNjaGVkdWxlcjo6c2NoZWR1bGUodGltZVRvV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6ZmV0Y2hBY3RpdmVGYWNlcywgdGhpcykpOworfQorCit2b2lkCitSaWJNYW5hZ2VyOjpmZXRjaEFjdGl2ZUZhY2VzKCkKK3sKKyAgTkZEX0xPR19ERUJVRygiRmV0Y2hpbmcgYWN0aXZlIGZhY2VzIik7CisKKyAgSW50ZXJlc3QgaW50ZXJlc3QoRkFDRVNfTElTVF9EQVRBU0VUX1BSRUZJWCk7CisgIGludGVyZXN0LnNldENoaWxkU2VsZWN0b3IoMSk7CisgIGludGVyZXN0LnNldE11c3RCZUZyZXNoKHRydWUpOworCisgIHNoYXJlZF9wdHI8bmRuOjpPQnVmZmVyU3RyZWFtPiBidWZmZXIgPSBtYWtlX3NoYXJlZDxuZG46Ok9CdWZmZXJTdHJlYW0+KCk7CisKKyAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSaWJNYW5hZ2VyOjpmZXRjaFNlZ21lbnRzLCB0aGlzLCBfMiwgYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSaWJNYW5hZ2VyOjpvbkZldGNoRmFjZVN0YXR1c1RpbWVvdXQsIHRoaXMpKTsKK30KKwordm9pZAorUmliTWFuYWdlcjo6ZmV0Y2hTZWdtZW50cyhjb25zdCBEYXRhJiBkYXRhLCBzaGFyZWRfcHRyPG5kbjo6T0J1ZmZlclN0cmVhbT4gYnVmZmVyKQoreworICBidWZmZXItPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEuZ2V0Q29udGVudCgpLnZhbHVlKCkpLAorICAgICAgICAgICAgICAgIGRhdGEuZ2V0Q29udGVudCgpLnZhbHVlX3NpemUoKSk7CisKKyAgdWludDY0X3QgY3VycmVudFNlZ21lbnQgPSBkYXRhLmdldE5hbWUoKS5nZXQoLTEpLnRvU2VnbWVudCgpOworCisgIGNvbnN0IG5hbWU6OkNvbXBvbmVudCYgZmluYWxCbG9ja0lkID0gZGF0YS5nZXRNZXRhSW5mbygpLmdldEZpbmFsQmxvY2tJZCgpOworICBpZiAoZmluYWxCbG9ja0lkLmVtcHR5KCkgfHwgZmluYWxCbG9ja0lkLnRvU2VnbWVudCgpID4gY3VycmVudFNlZ21lbnQpCisgICAgeworICAgICAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChkYXRhLmdldE5hbWUoKS5nZXRQcmVmaXgoLTEpLmFwcGVuZFNlZ21lbnQoY3VycmVudFNlZ21lbnQrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJpYk1hbmFnZXI6OmZldGNoU2VnbWVudHMsIHRoaXMsIF8yLCBidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSaWJNYW5hZ2VyOjpvbkZldGNoRmFjZVN0YXR1c1RpbWVvdXQsIHRoaXMpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZW1vdmVJbnZhbGlkRmFjZXMoYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6OnJlbW92ZUludmFsaWRGYWNlcyhzaGFyZWRfcHRyPG5kbjo6T0J1ZmZlclN0cmVhbT4gYnVmZmVyKQoreworICBORkRfTE9HX0RFQlVHKCJDaGVja2luZyBmb3IgaW52YWxpZCBmYWNlIHJlZ2lzdHJhdGlvbnMiKTsKKworICBuZG46OkNvbnN0QnVmZmVyUHRyIGJ1ZiA9IGJ1ZmZlci0+YnVmKCk7CisKKyAgQmxvY2sgYmxvY2s7CisgIHNpemVfdCBvZmZzZXQgPSAwOworICBGYWNlSWRTZXQgYWN0aXZlRmFjZXM7CisKKyAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgIHsKKyAgICAgIGlmICghQmxvY2s6OmZyb21CdWZmZXIoYnVmLCBvZmZzZXQsIGJsb2NrKSkKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IGNhbm5vdCBkZWNvZGUgRmFjZVN0YXR1cyBUTFYiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBvZmZzZXQgKz0gYmxvY2suc2l6ZSgpOworCisgICAgICBuZG46Om5mZDo6RmFjZVN0YXR1cyBzdGF0dXMoYmxvY2spOworICAgICAgYWN0aXZlRmFjZXMuaW5zZXJ0KHN0YXR1cy5nZXRGYWNlSWQoKSk7CisgICAgfQorCisgIC8vIExvb2sgZm9yIGZhY2UgSURzIHRoYXQgd2VyZSByZWdpc3RlcmVkIGJ1dCBub3QgYWN0aXZlIHRvIGZpbmQgbWlzc2VkCisgIC8vIGZhY2UgZGVzdHJveWVkIGV2ZW50cworICBmb3IgKEZhY2VJZFNldDo6aXRlcmF0b3IgaXQgPSBtX3JlZ2lzdGVyZWRGYWNlcy5iZWdpbigpOyBpdCAhPSBtX3JlZ2lzdGVyZWRGYWNlcy5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICBpZiAoYWN0aXZlRmFjZXMuZmluZCgqaXQpID09IGFjdGl2ZUZhY2VzLmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgTkZEX0xPR19ERUJVRygiUmVtb3ZpbmcgaW52YWxpZCBmYWNlIElEOiAiIDw8ICppdCk7CisgICAgICAgICAgc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjpzZWNvbmRzKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmliTWFuYWdlcjo6cHJvY2Vzc0VyYXN1cmVBZnRlck5vdGlmaWNhdGlvbiwgdGhpcywgKml0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgLy8gUmVzY2hlZHVsZSB0aGUgY2hlY2sgZm9yIGZ1dHVyZSBjbGVhbiB1cAorICBzY2hlZHVsZUFjdGl2ZUZhY2VGZXRjaChBQ1RJVkVfRkFDRV9GRVRDSF9JTlRFUlZBTCk7Cit9CisKK3ZvaWQKK1JpYk1hbmFnZXI6Om9uRmV0Y2hGYWNlU3RhdHVzVGltZW91dCgpCit7CisgIHN0ZDo6Y2VyciA8PCAiRmFjZSBTdGF0dXMgRGF0YXNldCByZXF1ZXN0IHRpbWVkIG91dCIgPDwgc3RkOjplbmRsOworICBzY2hlZHVsZUFjdGl2ZUZhY2VGZXRjaChBQ1RJVkVfRkFDRV9GRVRDSF9JTlRFUlZBTCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHJpYgorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvcmliL3JpYi1tYW5hZ2VyLmhwcCBiL05GRC9yaWIvcmliLW1hbmFnZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MWQyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL3JpYi1tYW5hZ2VyLmhwcApAQCAtMCwwICsxLDMxMSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfUklCX1JJQl9NQU5BR0VSX0hQUAorI2RlZmluZSBORkRfUklCX1JJQl9NQU5BR0VSX0hQUAorCisjaW5jbHVkZSAicmliLmhwcCIKKyNpbmNsdWRlICJjb3JlL2NvbmZpZy1maWxlLmhwcCIKKyNpbmNsdWRlICJyaWItc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisjaW5jbHVkZSAicmVtb3RlLXJlZ2lzdHJhdG9yLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkvdmFsaWRhdG9yLWNvbmZpZy5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1mYWNlLW1vbml0b3IuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY29udHJvbGxlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sLWNvbW1hbmQuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY29udHJvbC1yZXNwb25zZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sLXBhcmFtZXRlcnMuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSByaWIgeworCit1c2luZyBuZG46Om5mZDo6Q29udHJvbENvbW1hbmQ7Cit1c2luZyBuZG46Om5mZDo6Q29udHJvbFJlc3BvbnNlOwordXNpbmcgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzOworCit1c2luZyBuZG46Om5mZDo6RmFjZUV2ZW50Tm90aWZpY2F0aW9uOworCitjbGFzcyBSaWJNYW5hZ2VyIDogbm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IHN0ZDo6cnVudGltZV9lcnJvcih3aGF0KQorICAgIHsKKyAgICB9CisgIH07CisKKyAgZXhwbGljaXQKKyAgUmliTWFuYWdlcihuZG46OkZhY2UmIGZhY2UpOworCisgIH5SaWJNYW5hZ2VyKCk7CisKKyAgdm9pZAorICByZWdpc3RlcldpdGhOZmQoKTsKKworICB2b2lkCisgIGVuYWJsZUxvY2FsQ29udHJvbEhlYWRlcigpOworCisgIHZvaWQKKyAgc2V0Q29uZmlnRmlsZShDb25maWdGaWxlJiBjb25maWdGaWxlKTsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiB1aW50MzJfdCBUcmFuc2FjdGlvbklkOworCisgIHZvaWQKKyAgb25Db25maWcoY29uc3QgQ29uZmlnU2VjdGlvbiYgY29uZmlnU2VjdGlvbiwKKyAgICAgICAgICAgYm9vbCBpc0RyeVJ1biwKKyAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworICB2b2lkCisgIHN0YXJ0TGlzdGVuaW5nKGNvbnN0IE5hbWUmIGNvbW1hbmRQcmVmaXgsIGNvbnN0IG5kbjo6T25JbnRlcmVzdCYgb25SZXF1ZXN0KTsKKworICB2b2lkCisgIG9uTG9jYWxob3BSZXF1ZXN0KGNvbnN0IEludGVyZXN0JiByZXF1ZXN0KTsKKworICB2b2lkCisgIG9uTG9jYWxob3N0UmVxdWVzdChjb25zdCBJbnRlcmVzdCYgcmVxdWVzdCk7CisKKyAgdm9pZAorICBzZW5kUmVzcG9uc2UoY29uc3QgTmFtZSYgbmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UpOworCisgIHZvaWQKKyAgc2VuZFJlc3BvbnNlKGNvbnN0IE5hbWUmIG5hbWUsCisgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpOworCisgIHZvaWQKKyAgc2VuZFN1Y2Nlc3NSZXNwb25zZShjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycyk7CisKKyAgdm9pZAorICBzZW5kRXJyb3JSZXNwb25zZSh1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0KTsKKworICB2b2lkCisgIHJlZ2lzdGVyRW50cnkoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpOworCisgIHZvaWQKKyAgdW5yZWdpc3RlckVudHJ5KGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpOworCisgIHZvaWQKKyAgZXhwaXJlRW50cnkoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsIENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbXMpOworCisgIHZvaWQKKyAgb25Db21tYW5kVmFsaWRhdGVkKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0KTsKKworICB2b2lkCisgIG9uQ29tbWFuZFZhbGlkYXRpb25GYWlsZWQoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZhaWx1cmVJbmZvKTsKKworCisgIHZvaWQKKyAgb25Db21tYW5kRXJyb3IodWludDMyX3QgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yLAorICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgRmFjZUVudHJ5JiBmYWNlRW50cnkpOworCisgIHZvaWQKKyAgb25SZWdTdWNjZXNzKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICBjb25zdCBGYWNlRW50cnkmIGZhY2VFbnRyeSk7CisKKyAgdm9pZAorICBvblVuUmVnU3VjY2Vzcyhjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZhY2VFbnRyeSYgZmFjZUVudHJ5KTsKKworICB2b2lkCisgIG9uTnJkQ29tbWFuZFByZWZpeEFkZE5leHRIb3BTdWNjZXNzKGNvbnN0IE5hbWUmIHByZWZpeCk7CisKKyAgdm9pZAorICBvbk5yZENvbW1hbmRQcmVmaXhBZGROZXh0SG9wRXJyb3IoY29uc3QgTmFtZSYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgdm9pZAorICBvbkFkZE5leHRIb3BTdWNjZXNzKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHNob3VsZFNlbmRSZXNwb25zZSk7CisKKyAgdm9pZAorICBvbkFkZE5leHRIb3BFcnJvcih1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGNvbnN0IGJvb2wgc2hvdWxkU2VuZFJlc3BvbnNlKTsKKworICB2b2lkCisgIG9uUmVtb3ZlTmV4dEhvcFN1Y2Nlc3MoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2hvdWxkU2VuZFJlc3BvbnNlKTsKKworICB2b2lkCisgIG9uUmVtb3ZlTmV4dEhvcEVycm9yKHVpbnQzMl90IGNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgY29uc3QgYm9vbCBzaG91bGRTZW5kUmVzcG9uc2UpOworCisgIHZvaWQKKyAgb25Db250cm9sSGVhZGVyU3VjY2VzcygpOworCisgIHZvaWQKKyAgb25Db250cm9sSGVhZGVyRXJyb3IodWludDMyX3QgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbik7CisKKyAgc3RhdGljIGJvb2wKKyAgZXh0cmFjdFBhcmFtZXRlcnMoY29uc3QgTmFtZTo6Q29tcG9uZW50JiBwYXJhbWV0ZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJiBleHRyYWN0ZWRQYXJhbWV0ZXJzKTsKKworICBib29sCisgIHZhbGlkYXRlUGFyYW1ldGVycyhjb25zdCBDb250cm9sQ29tbWFuZCYgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKTsKKworICB2b2lkCisgIG9uTm90aWZpY2F0aW9uKGNvbnN0IEZhY2VFdmVudE5vdGlmaWNhdGlvbiYgbm90aWZpY2F0aW9uKTsKKworICB2b2lkCisgIHByb2Nlc3NFcmFzdXJlQWZ0ZXJOb3RpZmljYXRpb24odWludDY0X3QgZmFjZUlkKTsKKworICB2b2lkCisgIHNlbmRVcGRhdGVzVG9GaWIoY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpOworCisgIHZvaWQKKyAgc2VuZFVwZGF0ZXNUb0ZpYkFmdGVyRmFjZURlc3Ryb3lFdmVudCgpOworCisgIC8qKiBcYnJpZWYgQ2hlY2tzIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgcmVjZWl2ZWQgYWxsIG9mIHRoZSBleHBlY3RlZCByZXNwb25zZXMKKyAgICogICAgICAgICBmcm9tIHRoZSBGSUIuCisgICAqICBccmV0dXJueyBUcnVlIGlmIHRoZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBwYXNzZWQgdHJhbnNhY3Rpb25JZCBoYXMgYXBwbGllZAorICAgKiAgICAgICAgICAgYWxsIG9mIGl0cyBGSUIgdXBkYXRlcyBzdWNjZXNzZnVsbHk7IG90aGVyd2lzZSwgZmFsc2UgfQorICAgKi8KKyAgYm9vbAorICBpc1RyYW5zYWN0aW9uQ29tcGxldGUoY29uc3QgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkKTsKKworICB2b2lkCisgIGludmFsaWRhdGVUcmFuc2FjdGlvbihjb25zdCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQpOworCisgIHZvaWQKKyAgbGlzdEVudHJpZXMoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QpOworCisgIHZvaWQKKyAgc2NoZWR1bGVBY3RpdmVGYWNlRmV0Y2goY29uc3QgdGltZTo6c2Vjb25kcyYgdGltZVRvV2FpdCk7CisKKyAgdm9pZAorICBmZXRjaEFjdGl2ZUZhY2VzKCk7CisKKyAgdm9pZAorICBmZXRjaFNlZ21lbnRzKGNvbnN0IERhdGEmIGRhdGEsIHNoYXJlZF9wdHI8bmRuOjpPQnVmZmVyU3RyZWFtPiBidWZmZXIpOworCisgIHZvaWQKKyAgb25GZXRjaEZhY2VTdGF0dXNUaW1lb3V0KCk7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKyAgLyoqIFxwYXJhbSBidWZmZXIgRmFjZSBkYXRhc2V0IGNvbnRlbnRzCisgICovCisgIHZvaWQKKyAgcmVtb3ZlSW52YWxpZEZhY2VzKHNoYXJlZF9wdHI8bmRuOjpPQnVmZmVyU3RyZWFtPiBidWZmZXIpOworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BSSVZBVEU6CisgIFJpYiBtX21hbmFnZWRSaWI7CisKK3ByaXZhdGU6CisgIG5kbjo6RmFjZSYgbV9mYWNlOworICBuZG46Om5mZDo6Q29udHJvbGxlciBtX25mZENvbnRyb2xsZXI7CisgIG5kbjo6S2V5Q2hhaW4gbV9rZXlDaGFpbjsKKyAgbmRuOjpWYWxpZGF0b3JDb25maWcgbV9sb2NhbGhvc3RWYWxpZGF0b3I7CisgIG5kbjo6VmFsaWRhdG9yQ29uZmlnIG1fbG9jYWxob3BWYWxpZGF0b3I7CisgIG5kbjo6bmZkOjpGYWNlTW9uaXRvciBtX2ZhY2VNb25pdG9yOworICBib29sIG1faXNMb2NhbGhvcEVuYWJsZWQ7CisgIFJlbW90ZVJlZ2lzdHJhdG9yIG1fcmVtb3RlUmVnaXN0cmF0b3I7CisKKyAgUmliU3RhdHVzUHVibGlzaGVyIG1fcmliU3RhdHVzUHVibGlzaGVyOworCisgIC8qKiBcYnJpZWYgVGhlIGxhc3QgdHJhbnNhY3Rpb24gSUQgZm9yIEZJQiB1cGRhdGUgcmVzcG9uc2UgbWVzc2FnZXMuCisgICAqICAgICAgICAgRWFjaCBncm91cCBvZiBGSUIgdXBkYXRlcyBhcHBsaWVkIHRvIHRoZSBGSUIgaXMgYXNzaWduZWQgYW4gaW5jcmVtZW50aW5nCisgICAqICAgICAgICAgSUQgdGhhdCBpcyB1c2VkIHRvIHRyYWNrIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IGFwcGxpZWQgdXBkYXRlcy4KKyAgICovCisgIFRyYW5zYWN0aW9uSWQgbV9sYXN0VHJhbnNhY3Rpb25JZDsKKworICAvLy8gdGFibGUgb2YgRklCIHVwZGF0ZSB0cmFuc2FjdGlvbnMgPT4gY291bnQgb2YgcGVuZGluZyBGSUIgdXBkYXRlcworICB0eXBlZGVmIHN0ZDo6bWFwPFRyYW5zYWN0aW9uSWQsIGludD4gRmliVHJhbnNhY3Rpb25UYWJsZTsKKworICAvKiogXGJyaWVmIFRhYmxlIHVzZWQgdG8gdHJhY2sgdGhlIG51bWJlciBvZiBGSUIgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCByZWNlaXZlZAorICAgKiAgICAgICAgIGEgcmVzcG9uc2UgZnJvbSB0aGUgRklCLgorICAgKiAgICAgICAgIFRoZSB0YWJsZSBtYXBzIGEgdHJhbnNhY3Rpb24gSUQgdG8gdGhlIG51bWJlciBvZiB1cGRhdGVzIHJlbWFpbmluZyBmb3IgdGhhdAorICAgKiAgICAgICAgIHNwZWNpZmljIHRyYW5zYWN0aW9uLgorICAgKi8KKyAgRmliVHJhbnNhY3Rpb25UYWJsZSBtX3BlbmRpbmdGaWJUcmFuc2FjdGlvbnM7CisKKyAgdHlwZWRlZiBmdW5jdGlvbjx2b2lkKFJpYk1hbmFnZXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxjb25zdCBJbnRlcmVzdD4mIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycyk+IFNpZ25lZFZlcmJQcm9jZXNzb3I7CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxuYW1lOjpDb21wb25lbnQsIFNpZ25lZFZlcmJQcm9jZXNzb3I+IFNpZ25lZFZlcmJEaXNwYXRjaFRhYmxlOworCisgIHR5cGVkZWYgc3RkOjpwYWlyPG5hbWU6OkNvbXBvbmVudCwgU2lnbmVkVmVyYlByb2Nlc3Nvcj4gU2lnbmVkVmVyYkFuZFByb2Nlc3NvcjsKKworCisgIGNvbnN0IFNpZ25lZFZlcmJEaXNwYXRjaFRhYmxlIG1fc2lnbmVkVmVyYkRpc3BhdGNoOworCisgIHN0YXRpYyBjb25zdCBOYW1lIENPTU1BTkRfUFJFRklYOyAvLyAvbG9jYWxob3N0L25yZAorICBzdGF0aWMgY29uc3QgTmFtZSBSRU1PVEVfQ09NTUFORF9QUkVGSVg7IC8vIC9sb2NhbGhvcC9ucmQKKworICAvLyBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhbiBpbnZhbGlkLCBidXQgbm90IG1hbGZvcm1lZCwgdW5zaWduZWQgY29tbWFuZC4KKyAgLy8gKC9sb2NhbGhvc3QvbnJkICsgdmVyYiArIG9wdGlvbnMpID0gNAorICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTU1BTkRfVU5TSUdORURfTkNPTVBTOworCisgIC8vIG51bWJlciBvZiBjb21wb25lbnRzIGluIGEgdmFsaWQgc2lnbmVkIEludGVyZXN0LgorICAvLyA4IHdpdGggc2lnbmVkIEludGVyZXN0IHN1cHBvcnQuCisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ09NTUFORF9TSUdORURfTkNPTVBTOworCisgIHN0YXRpYyBjb25zdCBTaWduZWRWZXJiQW5kUHJvY2Vzc29yIFNJR05FRF9DT01NQU5EX1ZFUkJTW107CisKKyAgdHlwZWRlZiBmdW5jdGlvbjx2b2lkKFJpYk1hbmFnZXIqLCBjb25zdCBJbnRlcmVzdCYpPiBVbnNpZ25lZFZlcmJQcm9jZXNzb3I7CisgIHR5cGVkZWYgc3RkOjptYXA8TmFtZTo6Q29tcG9uZW50LCBVbnNpZ25lZFZlcmJQcm9jZXNzb3I+IFVuc2lnbmVkVmVyYkRpc3BhdGNoVGFibGU7CisgIHR5cGVkZWYgc3RkOjpwYWlyPE5hbWU6OkNvbXBvbmVudCwgVW5zaWduZWRWZXJiUHJvY2Vzc29yPiBVbnNpZ25lZFZlcmJBbmRQcm9jZXNzb3I7CisKKyAgY29uc3QgVW5zaWduZWRWZXJiRGlzcGF0Y2hUYWJsZSBtX3Vuc2lnbmVkVmVyYkRpc3BhdGNoOworICBzdGF0aWMgY29uc3QgVW5zaWduZWRWZXJiQW5kUHJvY2Vzc29yIFVOU0lHTkVEX0NPTU1BTkRfVkVSQlNbXTsKKworICBzdGF0aWMgY29uc3QgTmFtZSBMSVNUX0NPTU1BTkRfUFJFRklYOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IExJU1RfQ09NTUFORF9OQ09NUFM7CisKKyAgc3RhdGljIGNvbnN0IE5hbWUgRkFDRVNfTElTVF9EQVRBU0VUX1BSRUZJWDsKKworICBzdGF0aWMgY29uc3QgdGltZTo6c2Vjb25kcyBBQ1RJVkVfRkFDRV9GRVRDSF9JTlRFUlZBTDsKKyAgRXZlbnRJZCBtX2FjdGl2ZUZhY2VGZXRjaEV2ZW50OworCisgIHR5cGVkZWYgc3RkOjpzZXQ8dWludDY0X3Q+IEZhY2VJZFNldDsKKyAgLyoqIFxicmllZiBjb250YWlucyBGYWNlSWRzIHdpdGggb25lIG9yIG1vcmUgUm91dGVzIGluIHRoZSBSSUIKKyAgKi8KKyAgRmFjZUlkU2V0IG1fcmVnaXN0ZXJlZEZhY2VzOworfTsKKworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9SSUJfUklCX01BTkFHRVJfSFBQCmRpZmYgLS1naXQgYS9ORkQvcmliL3JpYi1zdGF0dXMtcHVibGlzaGVyLmNwcCBiL05GRC9yaWIvcmliLXN0YXR1cy1wdWJsaXNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTE2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvcmliL3JpYi1zdGF0dXMtcHVibGlzaGVyLmNwcApAQCAtMCwwICsxLDk3IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAicmliL3JpYi1zdGF0dXMtcHVibGlzaGVyLmhwcCIKKyNpbmNsdWRlICJyaWIvcmliLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLXJpYi1lbnRyeS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9mYWNlLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcmliIHsKKworTkZEX0xPR19JTklUKCJSaWJTdGF0dXNQdWJsaXNoZXIiKTsKKworUmliU3RhdHVzUHVibGlzaGVyOjpSaWJTdGF0dXNQdWJsaXNoZXIoY29uc3QgUmliJiByaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OkZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbikKKyAgOiBTZWdtZW50UHVibGlzaGVyPG5kbjo6RmFjZT4oZmFjZSwgcHJlZml4LCBrZXlDaGFpbikKKyAgLCBtX3JpYihyaWIpCit7Cit9CisKK1JpYlN0YXR1c1B1Ymxpc2hlcjo6flJpYlN0YXR1c1B1Ymxpc2hlcigpCit7Cit9CisKK3NpemVfdAorUmliU3RhdHVzUHVibGlzaGVyOjpnZW5lcmF0ZShuZG46OkVuY29kaW5nQnVmZmVyJiBvdXRCdWZmZXIpCit7CisgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisKKyAgZm9yIChSaWI6OmNvbnN0X2l0ZXJhdG9yIHJpYkl0ID0gbV9yaWIuYmVnaW4oKTsgcmliSXQgIT0gbV9yaWIuZW5kKCk7ICsrcmliSXQpCisgICAgeworICAgICAgUmliRW50cnkmIGVudHJ5ID0gKnJpYkl0LT5zZWNvbmQ7CisKKyAgICAgIGNvbnN0IE5hbWUmIHByZWZpeCA9IGVudHJ5LmdldE5hbWUoKTsKKyAgICAgIHNpemVfdCByaWJFbnRyeUxlbmd0aCA9IDA7CisKKyAgICAgIG5kbjo6bmZkOjpSaWJFbnRyeSB0bHZFbnRyeTsKKyAgICAgIGNvbnN0IFJpYkVudHJ5OjpGYWNlTGlzdCYgZmFjZXMgPSBlbnRyeS5nZXRGYWNlcygpOworCisgICAgICBmb3IgKFJpYkVudHJ5OjpGYWNlTGlzdDo6Y29uc3RfaXRlcmF0b3IgZmFjZUl0ID0gZmFjZXMuYmVnaW4oKTsKKyAgICAgICAgICAgZmFjZUl0ICE9IGZhY2VzLmVuZCgpOyArK2ZhY2VJdCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IEZhY2VFbnRyeSYgZmFjZSA9ICpmYWNlSXQ7CisKKyAgICAgICAgICBuZG46Om5mZDo6Um91dGUgcm91dGU7CisgICAgICAgICAgcm91dGUKKyAgICAgICAgICAgIC5zZXRGYWNlSWQoZmFjZS5mYWNlSWQpCisgICAgICAgICAgICAuc2V0T3JpZ2luKGZhY2Uub3JpZ2luKQorICAgICAgICAgICAgLnNldENvc3QoZmFjZS5jb3N0KQorICAgICAgICAgICAgLnNldEZsYWdzKGZhY2UuZmxhZ3MpOworICAgICAgICAgIGlmIChmYWNlLmV4cGlyZXMgPCB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludDo6bWF4KCkpIHsKKyAgICAgICAgICAgIHJvdXRlLnNldEV4cGlyYXRpb25QZXJpb2QodGltZTo6ZHVyYXRpb25fY2FzdDx0aW1lOjptaWxsaXNlY29uZHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmYWNlLmV4cGlyZXMgLSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHRsdkVudHJ5LmFkZFJvdXRlKHJvdXRlKTsKKyAgICAgICAgfQorCisgICAgICB0bHZFbnRyeS5zZXROYW1lKHByZWZpeCk7CisgICAgICByaWJFbnRyeUxlbmd0aCArPSB0bHZFbnRyeS53aXJlRW5jb2RlKG91dEJ1ZmZlcik7CisKKyAgICAgIE5GRF9MT0dfREVCVUcoImdlbmVyYXRlOiByaWIgZW50cnkgbGVuZ3RoID0gIiA8PCByaWJFbnRyeUxlbmd0aCk7CisKKyAgICAgIHRvdGFsTGVuZ3RoICs9IHJpYkVudHJ5TGVuZ3RoOworICAgIH0KKyAgTkZEX0xPR19ERUJVRygiZ2VuZXJhdGU6IFRvdGFsIGxlbmd0aCA9ICIgPDwgdG90YWxMZW5ndGgpOworICByZXR1cm4gdG90YWxMZW5ndGg7Cit9CisKKworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9yaWIvcmliLXN0YXR1cy1wdWJsaXNoZXIuaHBwIGIvTkZEL3JpYi9yaWItc3RhdHVzLXB1Ymxpc2hlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3Mzk4MwotLS0gL2Rldi9udWxsCisrKyBiL05GRC9yaWIvcmliLXN0YXR1cy1wdWJsaXNoZXIuaHBwCkBAIC0wLDAgKzEsNjAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX1JJQl9SSUJfU1RBVFVTX1BVQkxJU0hFUl9IUFAKKyNkZWZpbmUgTkZEX1JJQl9SSUJfU1RBVFVTX1BVQkxJU0hFUl9IUFAKKworI2luY2x1ZGUgImNvcmUvc2VnbWVudC1wdWJsaXNoZXIuaHBwIgorI2luY2x1ZGUgPG5kbi1jeHgvZmFjZS5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CisKK2NsYXNzIFJpYjsKKworY2xhc3MgUmliU3RhdHVzUHVibGlzaGVyIDogcHVibGljIFNlZ21lbnRQdWJsaXNoZXI8bmRuOjpGYWNlPgoreworcHVibGljOgorICBSaWJTdGF0dXNQdWJsaXNoZXIoY29uc3QgUmliJiByaWIsCisgICAgICAgICAgICAgICAgICAgICBuZG46OkZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICBuZG46OktleUNoYWluJiBrZXlDaGFpbik7CisKKyAgdmlydHVhbAorICB+UmliU3RhdHVzUHVibGlzaGVyKCk7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzaXplX3QKKyAgZ2VuZXJhdGUobmRuOjpFbmNvZGluZ0J1ZmZlciYgb3V0QnVmZmVyKTsKKworcHJpdmF0ZToKKyAgY29uc3QgUmliJiBtX3JpYjsKK307CisKKworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ORkQvcmliL3JpYi5jcHAgYi9ORkQvcmliL3JpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkZjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC9yaWIvcmliLmNwcApAQCAtMCwwICsxLDg2NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInJpYi5ocHAiCisKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKK05GRF9MT0dfSU5JVCgiUmliIik7CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorc29ydEZhY2UoY29uc3QgRmFjZUVudHJ5JiBlbnRyeTEsIGNvbnN0IEZhY2VFbnRyeSYgZW50cnkyKQoreworICByZXR1cm4gZW50cnkxLmZhY2VJZCA8IGVudHJ5Mi5mYWNlSWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraXNDaGlsZEluaGVyaXRGbGFnU2V0KHVpbnQ2NF90IGZsYWdzKQoreworICByZXR1cm4gZmxhZ3MgJiBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2lzQ2FwdHVyZUZsYWdTZXQodWludDY0X3QgZmxhZ3MpCit7CisgIHJldHVybiBmbGFncyAmIG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraXNBbnlGbGFnU2V0KHVpbnQ2NF90IGZsYWdzKQoreworICByZXR1cm4gaXNDaGlsZEluaGVyaXRGbGFnU2V0KGZsYWdzKSB8fCBpc0NhcHR1cmVGbGFnU2V0KGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBib29sCithcmVCb3RoRmxhZ3NTZXQodWludDY0X3QgZmxhZ3MpCit7CisgIHJldHVybiBpc0NoaWxkSW5oZXJpdEZsYWdTZXQoZmxhZ3MpICYmIGlzQ2FwdHVyZUZsYWdTZXQoZmxhZ3MpOworfQorCitSaWI6OlJpYigpCisgIDogbV9uSXRlbXMoMCkKK3sKK30KKworUmliOjpjb25zdF9pdGVyYXRvcgorUmliOjpmaW5kKGNvbnN0IE5hbWUmIHByZWZpeCkgY29uc3QKK3sKKyAgcmV0dXJuIG1fcmliLmZpbmQocHJlZml4KTsKK30KKworRmFjZUVudHJ5KgorUmliOjpmaW5kKGNvbnN0IE5hbWUmIHByZWZpeCwgY29uc3QgRmFjZUVudHJ5JiBmYWNlKSBjb25zdAoreworICBSaWJUYWJsZTo6Y29uc3RfaXRlcmF0b3IgcmliSXQgPSBtX3JpYi5maW5kKHByZWZpeCk7CisKKyAgLy8gTmFtZSBwcmVmaXggZXhpc3RzCisgIGlmIChyaWJJdCAhPSBtX3JpYi5lbmQoKSkKKyAgICB7CisgICAgICBzaGFyZWRfcHRyPFJpYkVudHJ5PiBlbnRyeShyaWJJdC0+c2Vjb25kKTsKKworICAgICAgUmliRW50cnk6Oml0ZXJhdG9yIGZhY2VJdCA9IHN0ZDo6ZmluZF9pZihlbnRyeS0+YmVnaW4oKSwgZW50cnktPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZjb21wYXJlRmFjZUlkQW5kT3JpZ2luLCBfMSwgZmFjZSkpOworCisgICAgICBpZiAoZmFjZUl0ICE9IGVudHJ5LT5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiAmKCgqZmFjZUl0KSk7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiAwOworfQorCit2b2lkCitSaWI6Omluc2VydChjb25zdCBOYW1lJiBwcmVmaXgsIGNvbnN0IEZhY2VFbnRyeSYgZmFjZSkKK3sKKyAgUmliVGFibGU6Oml0ZXJhdG9yIHJpYkl0ID0gbV9yaWIuZmluZChwcmVmaXgpOworCisgIC8vIE5hbWUgcHJlZml4IGV4aXN0cworICBpZiAocmliSXQgIT0gbV9yaWIuZW5kKCkpCisgICAgeworICAgICAgc2hhcmVkX3B0cjxSaWJFbnRyeT4gZW50cnkocmliSXQtPnNlY29uZCk7CisKKyAgICAgIFJpYkVudHJ5OjppdGVyYXRvciBmYWNlSXQgPSBzdGQ6OmZpbmRfaWYoZW50cnktPmdldEZhY2VzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmdldEZhY2VzKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmNvbXBhcmVGYWNlSWRBbmRPcmlnaW4sIF8xLCBmYWNlKSk7CisKKyAgICAgIGlmIChmYWNlSXQgPT0gZW50cnktPmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgLy8gV2lsbCB0aGUgbmV3IGZhY2UgY2hhbmdlIHRoZSBuYW1lc3BhY2UncyBjYXB0dXJlIGZsYWc/CisgICAgICAgICAgYm9vbCBjYXB0dXJlV2FzVHVybmVkT24gPSAoZW50cnktPmhhc0NhcHR1cmUoKSA9PSBmYWxzZSAmJiBpc0NhcHR1cmVGbGFnU2V0KGZhY2UuZmxhZ3MpKTsKKworICAgICAgICAgIC8vIE5ldyBmYWNlCisgICAgICAgICAgZW50cnktPmluc2VydEZhY2UoZmFjZSk7CisgICAgICAgICAgbV9uSXRlbXMrKzsKKworICAgICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggZmFjZSBsb29rdXAgdGFibGUKKyAgICAgICAgICBtX2ZhY2VNYXBbZmFjZS5mYWNlSWRdLnB1c2hfYmFjayhlbnRyeSk7CisKKyAgICAgICAgICBjcmVhdGVGaWJVcGRhdGVzRm9yTmV3RmFjZUVudHJ5KCplbnRyeSwgZmFjZSwgY2FwdHVyZVdhc1R1cm5lZE9uKTsKKyAgICAgICAgfQorICAgICAgZWxzZSAvLyBFbnRyeSBleGlzdHMsIHVwZGF0ZSBmaWVsZHMKKyAgICAgICAgeworICAgICAgICAgIC8vIEZpcnN0IGNhbmNlbCBvbGQgc2NoZWR1bGVkIGV2ZW50LCBpZiBhbnksIHRoZW4gc2V0IHRoZSBFdmVudElkIHRvIG5ldyBvbmUKKyAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZUl0LT5nZXRFeHBpcmF0aW9uRXZlbnQoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIE5GRF9MT0dfVFJBQ0UoIkNhbmNlbGxpbmcgZXhwaXJhdGlvbiBldmVudCBmb3IgIiA8PCBlbnRyeS0+Z2V0TmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKmZhY2VJdCk7CisgICAgICAgICAgICAgIHNjaGVkdWxlcjo6Y2FuY2VsKGZhY2VJdC0+Z2V0RXhwaXJhdGlvbkV2ZW50KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLy8gTm8gY2hlY2tzIGFyZSByZXF1aXJlZCBoZXJlIGFzIHRoZSBpdGVyYXRvciBuZWVkcyB0byBiZSB1cGRhdGVkIGluIGFsbCBjYXNlcy4KKyAgICAgICAgICBmYWNlSXQtPnNldEV4cGlyYXRpb25FdmVudChmYWNlLmdldEV4cGlyYXRpb25FdmVudCgpKTsKKworICAgICAgICAgIC8vIFNhdmUgZmxhZ3MgZm9yIHVwZGF0ZSBwcm9jZXNzaW5nCisgICAgICAgICAgdWludDY0X3QgcHJldmlvdXNGbGFncyA9IGZhY2VJdC0+ZmxhZ3M7CisKKyAgICAgICAgICAvLyBJZiB0aGUgZW50cnkncyBjb3N0IGRpZG4ndCBjaGFuZ2UgYW5kIGNoaWxkIGluaGVyaXQgaXMgbm90IHNldCwKKyAgICAgICAgICAvLyBubyBuZWVkIHRvIHRyYXZlcnNlIHN1YnRyZWUuCisgICAgICAgICAgdWludDY0X3QgcHJldmlvdXNDb3N0ID0gZmFjZUl0LT5jb3N0OworCisgICAgICAgICAgZmFjZUl0LT5mbGFncyA9IGZhY2UuZmxhZ3M7CisgICAgICAgICAgZmFjZUl0LT5jb3N0ID0gZmFjZS5jb3N0OworICAgICAgICAgIGZhY2VJdC0+ZXhwaXJlcyA9IGZhY2UuZXhwaXJlczsKKworICAgICAgICAgIGNyZWF0ZUZpYlVwZGF0ZXNGb3JVcGRhdGVkRW50cnkoKmVudHJ5LCBmYWNlLCBwcmV2aW91c0ZsYWdzLCBwcmV2aW91c0Nvc3QpOworICAgICAgICB9CisgICAgfQorICBlbHNlIC8vIE5ldyBuYW1lIHByZWZpeAorICAgIHsKKyAgICAgIHNoYXJlZF9wdHI8UmliRW50cnk+IGVudHJ5KG1ha2Vfc2hhcmVkPFJpYkVudHJ5PihSaWJFbnRyeSgpKSk7CisKKyAgICAgIG1fcmliW3ByZWZpeF0gPSBlbnRyeTsKKyAgICAgIG1fbkl0ZW1zKys7CisKKyAgICAgIGVudHJ5LT5zZXROYW1lKHByZWZpeCk7CisgICAgICBlbnRyeS0+aW5zZXJ0RmFjZShmYWNlKTsKKworICAgICAgLy8gRmluZCBwcmVmaXgncyBwYXJlbnQKKyAgICAgIHNoYXJlZF9wdHI8UmliRW50cnk+IHBhcmVudCA9IGZpbmRQYXJlbnQocHJlZml4KTsKKworICAgICAgLy8gQWRkIHNlbGYgdG8gcGFyZW50J3MgY2hpbGRyZW4KKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihwYXJlbnQpKQorICAgICAgICB7CisgICAgICAgICAgcGFyZW50LT5hZGRDaGlsZChlbnRyeSk7CisgICAgICAgIH0KKworICAgICAgUmliRW50cnlMaXN0IGNoaWxkcmVuID0gZmluZERlc2NlbmRhbnRzKHByZWZpeCk7CisKKyAgICAgIGZvciAoc3RkOjpsaXN0PHNoYXJlZF9wdHI8UmliRW50cnk+ID46Oml0ZXJhdG9yIGNoaWxkID0gY2hpbGRyZW4uYmVnaW4oKTsKKyAgICAgICAgICAgY2hpbGQgIT0gY2hpbGRyZW4uZW5kKCk7ICsrY2hpbGQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKCpjaGlsZCktPmdldFBhcmVudCgpID09IHBhcmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gUmVtb3ZlIGNoaWxkIGZyb20gcGFyZW50IGFuZCBpbmhlcml0IHBhcmVudCdzIGNoaWxkCisgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihwYXJlbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBhcmVudC0+cmVtb3ZlQ2hpbGQoKCpjaGlsZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZW50cnktPmFkZENoaWxkKCgqY2hpbGQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvLyBSZWdpc3RlciB3aXRoIGZhY2UgbG9va3VwIHRhYmxlCisgICAgICBtX2ZhY2VNYXBbZmFjZS5mYWNlSWRdLnB1c2hfYmFjayhlbnRyeSk7CisKKyAgICAgIGNyZWF0ZUZpYlVwZGF0ZXNGb3JOZXdSaWJFbnRyeSgqZW50cnksIGZhY2UpOworCisgICAgICAvLyBkbyBzb21ldGhpbmcgYWZ0ZXIgaW5zZXJ0aW5nIGFuIGVudHJ5CisgICAgICBhZnRlckluc2VydEVudHJ5KHByZWZpeCk7CisgICAgfQorfQorCit2b2lkCitSaWI6OmVyYXNlKGNvbnN0IE5hbWUmIHByZWZpeCwgY29uc3QgRmFjZUVudHJ5JiBmYWNlKQoreworICBSaWJUYWJsZTo6aXRlcmF0b3IgcmliSXQgPSBtX3JpYi5maW5kKHByZWZpeCk7CisKKyAgLy8gTmFtZSBwcmVmaXggZXhpc3RzCisgIGlmIChyaWJJdCAhPSBtX3JpYi5lbmQoKSkKKyAgICB7CisgICAgICBzaGFyZWRfcHRyPFJpYkVudHJ5PiBlbnRyeShyaWJJdC0+c2Vjb25kKTsKKworICAgICAgY29uc3QgYm9vbCBoYWRDYXB0dXJlID0gZW50cnktPmhhc0NhcHR1cmUoKTsKKworICAgICAgLy8gTmVlZCB0byBjb3B5IGZhY2UgdG8gZG8gRklCIHVwZGF0ZXMgd2l0aCBjb3JyZWN0IGNvc3QgYW5kIGZsYWdzIHNpbmNlIG5mZGMgZG9lcyBub3QKKyAgICAgIC8vIHBhc3MgZmxhZ3Mgb3IgY29zdAorICAgICAgUmliRW50cnk6Oml0ZXJhdG9yIGZhY2VJdCA9IGVudHJ5LT5maW5kRmFjZShmYWNlKTsKKworICAgICAgaWYgKGZhY2VJdCAhPSBlbnRyeS0+ZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICBGYWNlRW50cnkgZmFjZVRvRXJhc2UgPSAqZmFjZUl0OworICAgICAgICAgIGZhY2VUb0VyYXNlLmZsYWdzID0gZmFjZUl0LT5mbGFnczsKKyAgICAgICAgICBmYWNlVG9FcmFzZS5jb3N0ID0gZmFjZUl0LT5jb3N0OworCisgICAgICAgICAgZW50cnktPmVyYXNlRmFjZShmYWNlSXQpOworCisgICAgICAgICAgbV9uSXRlbXMtLTsKKworICAgICAgICAgIGNvbnN0IGJvb2wgY2FwdHVyZVdhc1R1cm5lZE9mZiA9IChoYWRDYXB0dXJlICYmICFlbnRyeS0+aGFzQ2FwdHVyZSgpKTsKKworICAgICAgICAgIGNyZWF0ZUZpYlVwZGF0ZXNGb3JFcmFzZWRGYWNlRW50cnkoKmVudHJ5LCBmYWNlVG9FcmFzZSwgY2FwdHVyZVdhc1R1cm5lZE9mZik7CisKKyAgICAgICAgICAvLyBJZiB0aGlzIFJpYkVudHJ5IG5vIGxvbmdlciBoYXMgdGhpcyBmYWNlSWQsIHVucmVnaXN0ZXIgZnJvbSBmYWNlIGxvb2t1cCB0YWJsZQorICAgICAgICAgIGlmICghZW50cnktPmhhc0ZhY2VJZChmYWNlLmZhY2VJZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1fZmFjZU1hcFtmYWNlLmZhY2VJZF0ucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIFRoZSBSaWJFbnRyeSBzdGlsbCBoYXMgdGhlIGZhY2UgSUQ7IG5lZWQgdG8gdXBkYXRlIEZJQgorICAgICAgICAgICAgICAvLyB3aXRoIGxvd2VzdCBjb3N0IGZvciB0aGUgc2FtZSBmYWNlIGluc3RlYWQgb2YgcmVtb3ZpbmcgdGhlIGZhY2UgZnJvbSB0aGUgRklCCisgICAgICAgICAgICAgIHNoYXJlZF9wdHI8RmFjZUVudHJ5PiBsb3dDb3N0RmFjZSA9IGVudHJ5LT5nZXRGYWNlV2l0aExvd2VzdENvc3RCeUZhY2VJZChmYWNlLmZhY2VJZCk7CisKKyAgICAgICAgICAgICAgQk9PU1RfQVNTRVJUKHN0YXRpY19jYXN0PGJvb2w+KGxvd0Nvc3RGYWNlKSk7CisKKyAgICAgICAgICAgICAgY3JlYXRlRmliVXBkYXRlc0Zvck5ld0ZhY2VFbnRyeSgqZW50cnksICpsb3dDb3N0RmFjZSwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLy8gSWYgYSBSaWJFbnRyeSdzIGZhY2VsaXN0IGlzIGVtcHR5LCByZW1vdmUgaXQgZnJvbSB0aGUgdHJlZQorICAgICAgICAgIGlmIChlbnRyeS0+Z2V0RmFjZXMoKS5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZXJhc2VFbnRyeShyaWJJdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK1JpYjo6ZXJhc2UoY29uc3QgdWludDY0X3QgZmFjZUlkKQoreworICBGYWNlTG9va3VwVGFibGU6Oml0ZXJhdG9yIGxvb2t1cEl0ID0gbV9mYWNlTWFwLmZpbmQoZmFjZUlkKTsKKworICAvLyBObyBSSUIgZW50cmllcyBoYXZlIHRoaXMgZmFjZQorICBpZiAobG9va3VwSXQgPT0gbV9mYWNlTWFwLmVuZCgpKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgUmliRW50cnlMaXN0JiByaWJFbnRyaWVzID0gbG9va3VwSXQtPnNlY29uZDsKKworICAvLyBGb3IgZWFjaCBSSUIgZW50cnkgdGhhdCBoYXMgZmFjZUlkLCByZW1vdmUgdGhlIGZhY2UgZnJvbSB0aGUgZW50cnkKKyAgZm9yIChSaWJFbnRyeUxpc3Q6Oml0ZXJhdG9yIGVudHJ5SXQgPSByaWJFbnRyaWVzLmJlZ2luKCk7IGVudHJ5SXQgIT0gcmliRW50cmllcy5lbmQoKTsgKytlbnRyeUl0KQorICAgIHsKKyAgICAgIHNoYXJlZF9wdHI8UmliRW50cnk+IGVudHJ5ID0gKmVudHJ5SXQ7CisKKyAgICAgIGNvbnN0IGJvb2wgaGFkQ2FwdHVyZSA9IGVudHJ5LT5oYXNDYXB0dXJlKCk7CisKKyAgICAgIC8vIEZpbmQgdGhlIGZhY2VzIGluIHRoZSBlbnRyeQorICAgICAgZm9yIChSaWJFbnRyeTo6aXRlcmF0b3IgZmFjZUl0ID0gZW50cnktPmJlZ2luKCk7IGZhY2VJdCAhPSBlbnRyeS0+ZW5kKCk7ICsrZmFjZUl0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKGZhY2VJdC0+ZmFjZUlkID09IGZhY2VJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgRmFjZUVudHJ5IGNvcHkgPSAqZmFjZUl0OworCisgICAgICAgICAgICAgIGZhY2VJdCA9IGVudHJ5LT5lcmFzZUZhY2UoZmFjZUl0KTsKKyAgICAgICAgICAgICAgbV9uSXRlbXMtLTsKKworICAgICAgICAgICAgICBjb25zdCBib29sIGNhcHR1cmVXYXNUdXJuZWRPZmYgPSAoaGFkQ2FwdHVyZSAmJiAhZW50cnktPmhhc0NhcHR1cmUoKSk7CisgICAgICAgICAgICAgIGNyZWF0ZUZpYlVwZGF0ZXNGb3JFcmFzZWRGYWNlRW50cnkoKmVudHJ5LCBjb3B5LCBjYXB0dXJlV2FzVHVybmVkT2ZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGEgUmliRW50cnkncyBmYWNlbGlzdCBpcyBlbXB0eSwgcmVtb3ZlIGl0IGZyb20gdGhlIHRyZWUKKyAgICAgICAgaWYgKGVudHJ5LT5nZXRGYWNlcygpLnNpemUoKSA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGVyYXNlRW50cnkobV9yaWIuZmluZChlbnRyeS0+Z2V0TmFtZSgpKSk7CisgICAgICAgICAgfQorICAgIH0KKworICAvLyBGYWNlIG5vIGxvbmdlciBleGlzdHMsIHJlbW92ZSBmcm9tIGZhY2UgbG9va3VwIHRhYmxlCisgIEZhY2VMb29rdXBUYWJsZTo6aXRlcmF0b3IgZW50cnlUb0RlbGV0ZSA9IG1fZmFjZU1hcC5maW5kKGZhY2VJZCk7CisKKyAgaWYgKGVudHJ5VG9EZWxldGUgIT0gbV9mYWNlTWFwLmVuZCgpKQorICAgIHsKKyAgICAgIG1fZmFjZU1hcC5lcmFzZShlbnRyeVRvRGVsZXRlKTsKKyAgICB9Cit9CisKK3NoYXJlZF9wdHI8UmliRW50cnk+CitSaWI6OmZpbmRQYXJlbnQoY29uc3QgTmFtZSYgcHJlZml4KSBjb25zdAoreworICBmb3IgKGludCBpID0gcHJlZml4LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIFJpYlRhYmxlOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmliLmZpbmQocHJlZml4LmdldFByZWZpeChpKSk7CisgICAgICBpZiAoaXQgIT0gbV9yaWIuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gKGl0LT5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBzaGFyZWRfcHRyPFJpYkVudHJ5PigpOworfQorCitzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxSaWJFbnRyeT4gPgorUmliOjpmaW5kRGVzY2VuZGFudHMoY29uc3QgTmFtZSYgcHJlZml4KSBjb25zdAoreworICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxSaWJFbnRyeT4gPiBjaGlsZHJlbjsKKworICBSaWJUYWJsZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JpYi5maW5kKHByZWZpeCk7CisKKyAgaWYgKGl0ICE9IG1fcmliLmVuZCgpKQorICAgIHsKKyAgICAgICsraXQ7CisgICAgICBmb3IgKDsgaXQgIT0gbV9yaWIuZW5kKCk7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocHJlZml4LmlzUHJlZml4T2YoaXQtPmZpcnN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaF9iYWNrKChpdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gY2hpbGRyZW47Cit9CisKK1JpYjo6UmliVGFibGU6Oml0ZXJhdG9yCitSaWI6OmVyYXNlRW50cnkoUmliVGFibGU6Oml0ZXJhdG9yIGl0KQoreworICAvLyBFbnRyeSBkb2VzIG5vdCBleGlzdAorICBpZiAoaXQgPT0gbV9yaWIuZW5kKCkpCisgICAgeworICAgICAgcmV0dXJuIG1fcmliLmVuZCgpOworICAgIH0KKworICBzaGFyZWRfcHRyPFJpYkVudHJ5PiBlbnRyeShpdC0+c2Vjb25kKTsKKworICAvLyBSZW1vdmUgaW5oZXJpdGVkIHJvdXRlcyBmcm9tIG5hbWVzcGFjZQorICBjcmVhdGVGaWJVcGRhdGVzRm9yRXJhc2VkUmliRW50cnkoKmVudHJ5KTsKKworICBzaGFyZWRfcHRyPFJpYkVudHJ5PiBwYXJlbnQgPSBlbnRyeS0+Z2V0UGFyZW50KCk7CisKKyAgLy8gUmVtb3ZlIHNlbGYgZnJvbSBwYXJlbnQncyBjaGlsZHJlbgorICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyZW50KSkKKyAgICB7CisgICAgICBwYXJlbnQtPnJlbW92ZUNoaWxkKGVudHJ5KTsKKyAgICB9CisKKyAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8UmliRW50cnk+ID4gY2hpbGRyZW4gPSBlbnRyeS0+Z2V0Q2hpbGRyZW4oKTsKKworICBmb3IgKFJpYkVudHJ5TGlzdDo6aXRlcmF0b3IgY2hpbGQgPSBjaGlsZHJlbi5iZWdpbigpOyBjaGlsZCAhPSBjaGlsZHJlbi5lbmQoKTsgKytjaGlsZCkKKyAgICB7CisgICAgICAvLyBSZW1vdmUgY2hpbGRyZW4gZnJvbSBzZWxmCisgICAgICBlbnRyeS0+cmVtb3ZlQ2hpbGQoKmNoaWxkKTsKKworICAgICAgLy8gVXBkYXRlIHBhcmVudCdzIGNoaWxkcmVuCisgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyZW50KSkKKyAgICAgICAgeworICAgICAgICAgIHBhcmVudC0+YWRkQ2hpbGQoKmNoaWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAvLyBNdXN0IHNhdmUgYW5kIGFkdmFuY2UgaXRlcmF0b3IgdG8gcmV0dXJuIGEgdmFsaWQgaXRlcmF0b3IKKyAgUmliVGFibGU6Oml0ZXJhdG9yIG5leHRJdCA9IGl0OworICBuZXh0SXQrKzsKKworICBtX3JpYi5lcmFzZShpdCk7CisKKyAgLy8gZG8gc29tZXRoaW5nIGFmdGVyIGVyYXNpbmcgYW4gZW50cnkuCisgIGFmdGVyRXJhc2VFbnRyeShlbnRyeS0+Z2V0TmFtZSgpKTsKKworICByZXR1cm4gbmV4dEl0OworfQorCitib29sCitjb21wYXJlRmliVXBkYXRlcyhjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEZpYlVwZGF0ZT4gbGhzLCBjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEZpYlVwZGF0ZT4gcmhzKQoreworICByZXR1cm4gKChsaHMtPm5hbWUgPT0gcmhzLT5uYW1lKSAmJgorICAgICAgICAgIChsaHMtPmZhY2VJZCA9PSByaHMtPmZhY2VJZCkpOworfQorCit2b2lkCitSaWI6Omluc2VydEZpYlVwZGF0ZShzaGFyZWRfcHRyPEZpYlVwZGF0ZT4gdXBkYXRlKQoreworICAvLyBJZiBhbiB1cGRhdGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBmYWNlIGFscmVhZHkgZXhpc3RzLAorICAvLyByZXBsYWNlIGl0CisgIEZpYlVwZGF0ZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gc3RkOjpmaW5kX2lmKG1fZmliVXBkYXRlTGlzdC5iZWdpbigpLCBtX2ZpYlVwZGF0ZUxpc3QuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmNvbXBhcmVGaWJVcGRhdGVzLCBfMSwgdXBkYXRlKSk7CisKKyAgaWYgKGl0ICE9IG1fZmliVXBkYXRlTGlzdC5lbmQoKSkKKyAgICB7CisgICAgICAvLyBHZXQgcmlkIG9mIHRoZSBjb25zdCB0byBhbHRlciB0aGUgYWN0aW9uLCBwcmV2ZW50cyBjb3B5aW5nIG9yIHJlbW92YWwgYW5kCisgICAgICAvLyBpbnNlcnRpb24KKyAgICAgIEZpYlVwZGF0ZSYgZW50cnkgPSBjb25zdF9jYXN0PEZpYlVwZGF0ZSY+KCooKml0KSk7CisgICAgICBlbnRyeS5hY3Rpb24gPSB1cGRhdGUtPmFjdGlvbjsKKyAgICAgIGVudHJ5LmNvc3QgPSB1cGRhdGUtPmNvc3Q7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbV9maWJVcGRhdGVMaXN0LnB1c2hfYmFjayh1cGRhdGUpOworICAgIH0KK30KKwordm9pZAorUmliOjpjcmVhdGVGaWJVcGRhdGVzRm9yTmV3UmliRW50cnkoUmliRW50cnkmIGVudHJ5LCBjb25zdCBGYWNlRW50cnkmIGZhY2UpCit7CisgIC8vIENyZWF0ZSBGSUIgdXBkYXRlIGZvciBuZXcgZW50cnkKKyAgaW5zZXJ0RmliVXBkYXRlKEZpYlVwZGF0ZTo6Y3JlYXRlQWRkVXBkYXRlKGVudHJ5LmdldE5hbWUoKSwgZmFjZS5mYWNlSWQsIGZhY2UuY29zdCkpOworCisgIC8vIE5vIGZsYWdzIGFyZSBzZXQKKyAgaWYgKCFpc0FueUZsYWdTZXQoZmFjZS5mbGFncykpCisgICAgeworICAgICAgLy8gQWRkIGFuY2VzdG9yIGZhY2VzIHRvIHNlbGYKKyAgICAgIGFkZEluaGVyaXRlZEZhY2VzVG9FbnRyeShlbnRyeSwgZ2V0QW5jZXN0b3JGYWNlcyhlbnRyeSkpOworICAgIH0KKyAgZWxzZSBpZiAoYXJlQm90aEZsYWdzU2V0KGZhY2UuZmxhZ3MpKQorICAgIHsKKyAgICAgIC8vIEFkZCBmYWNlIHRvIGNoaWxkcmVuCisgICAgICBGYWNlU2V0IGZhY2VzVG9BZGQ7CisgICAgICBmYWNlc1RvQWRkLmluc2VydChmYWNlKTsKKworICAgICAgLy8gUmVtb3ZlIGZhY2VzIGJsb2NrZWQgYnkgY2FwdHVyZSBhbmQgYWRkIHNlbGYgdG8gY2hpbGRyZW4KKyAgICAgIG1vZGlmeUNoaWxkcmVuc0luaGVyaXRlZEZhY2VzKGVudHJ5LCBmYWNlc1RvQWRkLCBnZXRBbmNlc3RvckZhY2VzKGVudHJ5KSk7CisgICAgfQorICBlbHNlIGlmIChpc0NoaWxkSW5oZXJpdEZsYWdTZXQoZmFjZS5mbGFncykpCisgICAgeworICAgICAgRmFjZVNldCBhbmNlc3RvckZhY2VzID0gZ2V0QW5jZXN0b3JGYWNlcyhlbnRyeSk7CisKKyAgICAgIC8vIEFkZCBhbmNlc3RvciBmYWNlcyB0byBzZWxmCisgICAgICBhZGRJbmhlcml0ZWRGYWNlc1RvRW50cnkoZW50cnksIGFuY2VzdG9yRmFjZXMpOworCisgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBhbmNlc3RvciBmYWNlIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBuZXcgZmFjZSwgcmVwbGFjZSBpdAorICAgICAgLy8gd2l0aCB0aGUgbmV3IGZhY2UKKyAgICAgIEZhY2VTZXQ6Oml0ZXJhdG9yIGl0ID0gYW5jZXN0b3JGYWNlcy5maW5kKGZhY2UpOworCisgICAgICAvLyBUaGVyZSBpcyBhIGZhY2UgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiwgZXJhc2UgYW5kIHRoZW4gcmVwbGFjZQorICAgICAgaWYgKGl0ICE9IGFuY2VzdG9yRmFjZXMuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICBhbmNlc3RvckZhY2VzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorCisgICAgICAvLyBBZGQgbmV3IGZhY2UgdG8gYW5jZXN0b3IgbGlzdCBzbyBpdCBjYW4gYmUgYWRkZWQgdG8gY2hpbGRyZW4KKyAgICAgIGFuY2VzdG9yRmFjZXMuaW5zZXJ0KGZhY2UpOworCisgICAgICAvLyBBZGQgYW5jZXN0b3IgZmFjZXMgdG8gY2hpbGRyZW4KKyAgICAgIG1vZGlmeUNoaWxkcmVuc0luaGVyaXRlZEZhY2VzKGVudHJ5LCBhbmNlc3RvckZhY2VzLCBGYWNlU2V0KCkpOworICAgIH0KKyAgZWxzZSBpZiAoaXNDYXB0dXJlRmxhZ1NldChmYWNlLmZsYWdzKSkKKyAgICB7CisgICAgICAvLyBSZW1vdmUgZmFjZXMgYmxvY2tlZCBieSBjYXB0dXJlCisgICAgICBtb2RpZnlDaGlsZHJlbnNJbmhlcml0ZWRGYWNlcyhlbnRyeSwgRmFjZVNldCgpLCBnZXRBbmNlc3RvckZhY2VzKGVudHJ5KSk7CisgICAgfQorfQorCit2b2lkCitSaWI6OmNyZWF0ZUZpYlVwZGF0ZXNGb3JOZXdGYWNlRW50cnkoUmliRW50cnkmIGVudHJ5LCBjb25zdCBGYWNlRW50cnkmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXB0dXJlV2FzVHVybmVkT24pCit7CisgIC8vIE9ubHkgdXBkYXRlIGlmIHRoZSBuZXcgZmFjZSBoYXMgYSBsb3dlciBjb3N0IHRoYW4gYSBwcmV2aW91c2x5IGluc3RhbGxlZCBmYWNlCisgIHNoYXJlZF9wdHI8RmFjZUVudHJ5PiBwcmV2RmFjZSA9IGVudHJ5LmdldEZhY2VXaXRoTG93ZXN0Q29zdEFuZENoaWxkSW5oZXJpdEJ5RmFjZUlkKGZhY2UuZmFjZUlkKTsKKworICBGYWNlU2V0IGZhY2VzVG9BZGQ7CisgIGlmIChpc0NoaWxkSW5oZXJpdEZsYWdTZXQoZmFjZS5mbGFncykpCisgICAgeworICAgICAgLy8gQWRkIHRvIGNoaWxkcmVuIGlmIHRoaXMgbmV3IGZhY2UgZG9lc24ndCBvdmVycmlkZSBhIHByZXZpb3VzIGxvd2VyIGNvc3QsIG9yCisgICAgICAvLyBhZGQgdG8gY2hpbGRyZW4gaWYgdGhpcyBuZXcgaXMgbG93ZXIgY29zdCB0aGFuIGEgcHJldmlvdXMgZmFjZS4KKyAgICAgIC8vIExlc3MgdGhhbiBlcXVhbCwgc2luY2UgZW50cnkgbWF5IGZpbmQgdGhpcyBmYWNlCisgICAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHByZXZGYWNlKSB8fCBmYWNlLmNvc3QgPD0gcHJldkZhY2UtPmNvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBBZGQgc2VsZiB0byBjaGlsZHJlbgorICAgICAgICAgIGZhY2VzVG9BZGQuaW5zZXJ0KGZhY2UpOworICAgICAgICB9CisgICAgfQorCisgIEZhY2VTZXQgZmFjZXNUb1JlbW92ZTsKKyAgaWYgKGNhcHR1cmVXYXNUdXJuZWRPbikKKyAgICB7CisgICAgICAvLyBDYXB0dXJlIGZsYWcgb24KKyAgICAgIGZhY2VzVG9SZW1vdmUgPSBnZXRBbmNlc3RvckZhY2VzKGVudHJ5KTsKKworICAgICAgLy8gUmVtb3ZlIGFuY2VzdG9yIGZhY2VzIGZyb20gc2VsZgorICAgICAgcmVtb3ZlSW5oZXJpdGVkRmFjZXNGcm9tRW50cnkoZW50cnksIGZhY2VzVG9SZW1vdmUpOworICAgIH0KKworICBtb2RpZnlDaGlsZHJlbnNJbmhlcml0ZWRGYWNlcyhlbnRyeSwgZmFjZXNUb0FkZCwgZmFjZXNUb1JlbW92ZSk7CisKKyAgLy8gSWYgYW5vdGhlciBmYWNlIHdpdGggc2FtZSBmYWNlSWQgYW5kIGxvd2VyIGNvc3QsIGRvbid0IHVwZGF0ZS4KKyAgLy8gTXVzdCBiZSBkb25lIGxhc3Qgc28gdGhhdCBhZGQgdXBkYXRlcyByZXBsYWNlIHJlbW92YWwgdXBkYXRlcworICAvLyBDcmVhdGUgRklCIHVwZGF0ZSBmb3IgbmV3IGVudHJ5CisgIGlmIChmYWNlLmNvc3QgPD0gZW50cnkuZ2V0RmFjZVdpdGhMb3dlc3RDb3N0QnlGYWNlSWQoZmFjZS5mYWNlSWQpLT5jb3N0KQorICAgIHsKKyAgICAgIGluc2VydEZpYlVwZGF0ZShGaWJVcGRhdGU6OmNyZWF0ZUFkZFVwZGF0ZShlbnRyeS5nZXROYW1lKCksIGZhY2UuZmFjZUlkLCBmYWNlLmNvc3QpKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JpYjo6Y3JlYXRlRmliVXBkYXRlc0ZvclVwZGF0ZWRFbnRyeShSaWJFbnRyeSYgZW50cnksIGNvbnN0IEZhY2VFbnRyeSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBwcmV2aW91c0ZsYWdzLCBjb25zdCB1aW50NjRfdCBwcmV2aW91c0Nvc3QpCit7CisgIGNvbnN0IGJvb2wgY29zdERpZENoYW5nZSA9IChmYWNlLmNvc3QgIT0gcHJldmlvdXNDb3N0KTsKKworICAvLyBMb29rIGZvciBhbiBpbnN0YWxsZWQgZmFjZSB3aXRoIHRoZSBsb3dlc3QgY29zdCBhbmQgY2hpbGQgaW5oZXJpdCBzZXQKKyAgc2hhcmVkX3B0cjxGYWNlRW50cnk+IHByZXZGYWNlID0gZW50cnkuZ2V0RmFjZVdpdGhMb3dlc3RDb3N0QW5kQ2hpbGRJbmhlcml0QnlGYWNlSWQoZmFjZS5mYWNlSWQpOworCisgIC8vIE5vIGZsYWdzIGNoYW5nZWQgYW5kIGNvc3QgZGlkbid0IGNoYW5nZSwgbm8gY2hhbmdlIGluIEZJQgorICBpZiAoZmFjZS5mbGFncyA9PSBwcmV2aW91c0ZsYWdzICYmICFjb3N0RGlkQ2hhbmdlKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLy8gQ29zdCBjaGFuZ2VkIHNvIGNyZWF0ZSB1cGRhdGUgZm9yIHRoZSBlbnRyeSBpdHNlbGYKKyAgaWYgKGNvc3REaWRDaGFuZ2UpCisgICAgeworICAgICAgLy8gQ3JlYXRlIHVwZGF0ZSBpZiB0aGlzIGZhY2UncyBjb3N0IGlzIGxvd2VyIHRoYW4gb3RoZXIgZmFjZXMKKyAgICAgICBpZiAoZmFjZS5jb3N0IDw9IGVudHJ5LmdldEZhY2VXaXRoTG93ZXN0Q29zdEJ5RmFjZUlkKGZhY2UuZmFjZUlkKS0+Y29zdCkKKyAgICAgICAgeworICAgICAgICAgIC8vIENyZWF0ZSBGSUIgdXBkYXRlIGZvciB0aGUgdXBkYXRlZCBlbnRyeQorICAgICAgICAgaW5zZXJ0RmliVXBkYXRlKEZpYlVwZGF0ZTo6Y3JlYXRlQWRkVXBkYXRlKGVudHJ5LmdldE5hbWUoKSwgZmFjZS5mYWNlSWQsIGZhY2UuY29zdCkpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2aW91c0Nvc3QgPCBlbnRyeS5nZXRGYWNlV2l0aExvd2VzdENvc3RCeUZhY2VJZChmYWNlLmZhY2VJZCktPmNvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBDcmVhdGUgdXBkYXRlIGlmIHRoaXMgZmFjZSB1c2VkIHRvIGJlIHRoZSBsb3dlc3QgZmFjZSBidXQgaXMgbm8gbG9uZ2VyCisgICAgICAgICAgLy8gdGhlIGxvd2VzdCBjb3N0IGZhY2UuCisgICAgICAgICAgaW5zZXJ0RmliVXBkYXRlKEZpYlVwZGF0ZTo6Y3JlYXRlQWRkVXBkYXRlKGVudHJ5LmdldE5hbWUoKSwgcHJldkZhY2UtPmZhY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkZhY2UtPmNvc3QpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBJZiBhbm90aGVyIGZhY2Ugd2l0aCBzYW1lIGZhY2VJZCBhbmQgbG93ZXIgY29zdCBhbmQgQ2hpbGRJbmhlcml0IGV4aXN0cywKKyAgICAgIC8vIGRvbid0IHVwZGF0ZSBjaGlsZHJlbi4KKyAgICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4ocHJldkZhY2UpIHx8IGZhY2UuY29zdCA8PSBwcmV2RmFjZS0+Y29zdCkKKyAgICAgICAgeworICAgICAgICAgIC8vIElmIG5vIGZsYWdzIGNoYW5nZWQgYnV0IGNoaWxkIGluaGVyaXRhbmNlIGlzIHNldCwgbmVlZCB0byB1cGRhdGUgY2hpbGRyZW4KKyAgICAgICAgICAvLyB3aXRoIG5ldyBjb3N0CisgICAgICAgICAgaWYgKChmYWNlLmZsYWdzID09IHByZXZpb3VzRmxhZ3MpICYmIGlzQ2hpbGRJbmhlcml0RmxhZ1NldChmYWNlLmZsYWdzKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBBZGQgc2VsZiB0byBjaGlsZHJlbgorICAgICAgICAgICAgRmFjZVNldCBmYWNlc1RvQWRkOworICAgICAgICAgICAgZmFjZXNUb0FkZC5pbnNlcnQoZmFjZSk7CisgICAgICAgICAgICBtb2RpZnlDaGlsZHJlbnNJbmhlcml0ZWRGYWNlcyhlbnRyeSwgZmFjZXNUb0FkZCwgRmFjZVNldCgpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvLyBDaGlsZCBpbmhlcml0IHdhcyB0dXJuZWQgb24KKyAgaWYgKCFpc0NoaWxkSW5oZXJpdEZsYWdTZXQocHJldmlvdXNGbGFncykgJiYgaXNDaGlsZEluaGVyaXRGbGFnU2V0KGZhY2UuZmxhZ3MpKQorICAgIHsKKyAgICAgIC8vIElmIGFub3RoZXIgZmFjZSB3aXRoIHNhbWUgZmFjZUlkIGFuZCBsb3dlciBjb3N0IGFuZCBDaGlsZEluaGVyaXQgZXhpc3RzLAorICAgICAgLy8gZG9uJ3QgdXBkYXRlIGNoaWxkcmVuLgorICAgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihwcmV2RmFjZSkgfHwgZmFjZS5jb3N0IDw9IHByZXZGYWNlLT5jb3N0KQorICAgICAgICB7CisgICAgICAgICAgLy8gQWRkIHNlbGYgdG8gY2hpbGRyZW4KKyAgICAgICAgICBGYWNlU2V0IGZhY2VzVG9BZGQ7CisgICAgICAgICAgZmFjZXNUb0FkZC5pbnNlcnQoZmFjZSk7CisgICAgICAgICAgbW9kaWZ5Q2hpbGRyZW5zSW5oZXJpdGVkRmFjZXMoZW50cnksIGZhY2VzVG9BZGQsIEZhY2VTZXQoKSk7CisgICAgICAgIH0KKworICAgIH0gLy8gQ2hpbGQgaW5oZXJpdCB3YXMgdHVybmVkIG9mZgorICBlbHNlIGlmIChpc0NoaWxkSW5oZXJpdEZsYWdTZXQocHJldmlvdXNGbGFncykgJiYgIWlzQ2hpbGRJbmhlcml0RmxhZ1NldChmYWNlLmZsYWdzKSkKKyAgICB7CisgICAgICAvLyBSZW1vdmUgc2VsZiBmcm9tIGNoaWxkcmVuCisgICAgICBGYWNlU2V0IGZhY2VzVG9SZW1vdmU7CisgICAgICBmYWNlc1RvUmVtb3ZlLmluc2VydChmYWNlKTsKKworICAgICAgRmFjZVNldCBmYWNlc1RvQWRkOworICAgICAgLy8gSWYgYW5vdGhlciBmYWNlIHdpdGggc2FtZSBmYWNlSWQgYW5kIENoaWxkSW5oZXJpdCBleGlzdHMsIHVwZGF0ZSBjaGlsZHJlbiB3aXRoIHRoaXMgZmFjZS4KKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihwcmV2RmFjZSkpCisgICAgICAgIHsKKyAgICAgICAgICBmYWNlc1RvQWRkLmluc2VydCgqcHJldkZhY2UpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBMb29rIGZvciBhbiBhbmNlc3RvciB0aGF0IHdhcyBibG9ja2VkIHByZXZpb3VzbHkKKyAgICAgICAgICBjb25zdCBGYWNlU2V0IGFuY2VzdG9yRmFjZXMgPSBnZXRBbmNlc3RvckZhY2VzKGVudHJ5KTsKKyAgICAgICAgICBGYWNlU2V0OjppdGVyYXRvciBpdCA9IGFuY2VzdG9yRmFjZXMuZmluZChmYWNlKTsKKworICAgICAgICAgIC8vIElmIGFuIGFuY2VzdG9yIGlzIGZvdW5kLCBhZGQgaXQgdG8gY2hpbGRyZW4KKyAgICAgICAgICBpZiAoaXQgIT0gYW5jZXN0b3JGYWNlcy5lbmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmFjZXNUb0FkZC5pbnNlcnQoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBtb2RpZnlDaGlsZHJlbnNJbmhlcml0ZWRGYWNlcyhlbnRyeSwgZmFjZXNUb0FkZCwgZmFjZXNUb1JlbW92ZSk7CisgICAgfQorCisgIC8vIENhcHR1cmUgd2FzIHR1cm5lZCBvbgorICBpZiAoIWlzQ2FwdHVyZUZsYWdTZXQocHJldmlvdXNGbGFncykgJiYgaXNDYXB0dXJlRmxhZ1NldChmYWNlLmZsYWdzKSkKKyAgICB7CisgICAgICBGYWNlU2V0IGFuY2VzdG9yRmFjZXMgPSBnZXRBbmNlc3RvckZhY2VzKGVudHJ5KTsKKworICAgICAgLy8gUmVtb3ZlIGFuY2VzdG9yIGZhY2VzIGZyb20gc2VsZgorICAgICAgcmVtb3ZlSW5oZXJpdGVkRmFjZXNGcm9tRW50cnkoZW50cnksIGFuY2VzdG9yRmFjZXMpOworCisgICAgICAvLyBSZW1vdmUgYW5jZXN0b3IgZmFjZXMgZnJvbSBjaGlsZHJlbgorICAgICAgbW9kaWZ5Q2hpbGRyZW5zSW5oZXJpdGVkRmFjZXMoZW50cnksIEZhY2VTZXQoKSwgYW5jZXN0b3JGYWNlcyk7CisgICAgfSAgLy8gQ2FwdHVyZSB3YXMgdHVybmVkIG9mZgorICBlbHNlIGlmIChpc0NhcHR1cmVGbGFnU2V0KHByZXZpb3VzRmxhZ3MpICYmICFpc0NhcHR1cmVGbGFnU2V0KGZhY2UuZmxhZ3MpKQorICAgIHsKKyAgICAgIEZhY2VTZXQgYW5jZXN0b3JGYWNlcyA9IGdldEFuY2VzdG9yRmFjZXMoZW50cnkpOworCisgICAgICAvLyBBZGQgYW5jZXN0b3IgZmFjZXMgdG8gc2VsZgorICAgICAgYWRkSW5oZXJpdGVkRmFjZXNUb0VudHJ5KGVudHJ5LCBhbmNlc3RvckZhY2VzKTsKKworICAgICAgLy8gQWRkIGFuY2VzdG9yIGZhY2VzIHRvIGNoaWxkcmVuCisgICAgICBtb2RpZnlDaGlsZHJlbnNJbmhlcml0ZWRGYWNlcyhlbnRyeSwgYW5jZXN0b3JGYWNlcywgRmFjZVNldCgpKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JpYjo6Y3JlYXRlRmliVXBkYXRlc0ZvckVyYXNlZEZhY2VFbnRyeShSaWJFbnRyeSYgZW50cnksIGNvbnN0IEZhY2VFbnRyeSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGNhcHR1cmVXYXNUdXJuZWRPZmYpCit7CisgIGluc2VydEZpYlVwZGF0ZShGaWJVcGRhdGU6OmNyZWF0ZVJlbW92ZVVwZGF0ZShlbnRyeS5nZXROYW1lKCksIGZhY2UuZmFjZUlkKSk7CisKKyAgaWYgKGFyZUJvdGhGbGFnc1NldChmYWNlLmZsYWdzKSkKKyAgICB7CisgICAgICAvLyBSZW1vdmUgc2VsZiBmcm9tIGNoaWxkcmVuCisgICAgICBGYWNlU2V0IGZhY2VzVG9SZW1vdmU7CisgICAgICBmYWNlc1RvUmVtb3ZlLmluc2VydChmYWNlKTsKKworICAgICAgLy8gSWYgY2FwdHVyZSBpcyB0dXJuZWQgb2ZmIGZvciB0aGUgcm91dGUsIG5lZWQgdG8gYWRkIGFuY2VzdG9ycworICAgICAgLy8gdG8gc2VsZiBhbmQgY2hpbGRyZW4KKyAgICAgIEZhY2VTZXQgZmFjZXNUb0FkZDsKKyAgICAgIGlmIChjYXB0dXJlV2FzVHVybmVkT2ZmKQorICAgICAgICB7CisgICAgICAgICAgLy8gTG9vayBmb3IgYW4gYW5jZXN0b3JzIHRoYXQgd2VyZSBibG9ja2VkIHByZXZpb3VzbHkKKyAgICAgICAgICBmYWNlc1RvQWRkID0gZ2V0QW5jZXN0b3JGYWNlcyhlbnRyeSk7CisKKyAgICAgICAgICAvLyBBZGQgYW5jZXN0b3IgZmFjZXMgdG8gc2VsZgorICAgICAgICAgIGFkZEluaGVyaXRlZEZhY2VzVG9FbnRyeShlbnRyeSwgZmFjZXNUb0FkZCk7CisgICAgICAgIH0KKworICAgICAgbW9kaWZ5Q2hpbGRyZW5zSW5oZXJpdGVkRmFjZXMoZW50cnksIGZhY2VzVG9BZGQsIGZhY2VzVG9SZW1vdmUpOworICAgIH0KKyAgZWxzZSBpZiAoaXNDaGlsZEluaGVyaXRGbGFnU2V0KGZhY2UuZmxhZ3MpKQorICAgIHsKKyAgICAgIC8vIElmIG5vdCBibG9ja2VkIGJ5IGNhcHR1cmUsIGFkZCBpbmhlcml0ZWQgcm91dGVzIHRvIGNoaWxkcmVuCisgICAgICBGYWNlU2V0IGZhY2VzVG9BZGQ7CisgICAgICBpZiAoIWVudHJ5Lmhhc0NhcHR1cmUoKSkKKyAgICAgICAgeworICAgICAgICAgIGZhY2VzVG9BZGQgPSBnZXRBbmNlc3RvckZhY2VzKGVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICBGYWNlU2V0IGZhY2VzVG9SZW1vdmU7CisgICAgICBmYWNlc1RvUmVtb3ZlLmluc2VydChmYWNlKTsKKworICAgICAgLy8gQWRkIGFuY2VzdG9yIGZhY2VzIHRvIGNoaWxkcmVuCisgICAgICBtb2RpZnlDaGlsZHJlbnNJbmhlcml0ZWRGYWNlcyhlbnRyeSwgZmFjZXNUb0FkZCwgZmFjZXNUb1JlbW92ZSk7CisgICAgfQorICBlbHNlIGlmIChpc0NhcHR1cmVGbGFnU2V0KGZhY2UuZmxhZ3MpKQorICAgIHsKKyAgICAgIC8vIElmIGNhcHR1cmUgaXMgdHVybmVkIG9mZiBmb3IgdGhlIHJvdXRlLCBuZWVkIHRvIGFkZCBhbmNlc3RvcnMKKyAgICAgIC8vIHRvIHNlbGYgYW5kIGNoaWxkcmVuCisgICAgICBGYWNlU2V0IGZhY2VzVG9BZGQ7CisgICAgICBpZiAoY2FwdHVyZVdhc1R1cm5lZE9mZikKKyAgICAgICAgeworICAgICAgICAgIC8vIExvb2sgZm9yIGFuIGFuY2VzdG9ycyB0aGF0IHdlcmUgYmxvY2tlZCBwcmV2aW91c2x5CisgICAgICAgICAgZmFjZXNUb0FkZCA9IGdldEFuY2VzdG9yRmFjZXMoZW50cnkpOworCisgICAgICAgICAgLy8gQWRkIGFuY2VzdG9yIGZhY2VzIHRvIHNlbGYKKyAgICAgICAgICBhZGRJbmhlcml0ZWRGYWNlc1RvRW50cnkoZW50cnksIGZhY2VzVG9BZGQpOworICAgICAgICB9CisKKyAgICAgIG1vZGlmeUNoaWxkcmVuc0luaGVyaXRlZEZhY2VzKGVudHJ5LCBmYWNlc1RvQWRkLCBGYWNlU2V0KCkpOworICAgIH0KKworICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSByZW1vdmVkIGZhY2Ugd2FzIGJsb2NraW5nIGFuIGluaGVyaXRlZCByb3V0ZQorICBGYWNlU2V0IGFuY2VzdG9yRmFjZXMgPSBnZXRBbmNlc3RvckZhY2VzKGVudHJ5KTsKKworICBpZiAoIWVudHJ5Lmhhc0NhcHR1cmUoKSkKKyAgeworICAgIC8vIElmIHRoZXJlIGlzIGFuIGFuY2VzdG9yIGZhY2Ugd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIGVyYXNlZCBmYWNlLCBhZGQgdGhhdCBmYWNlCisgICAgLy8gdG8gdGhlIGN1cnJlbnQgZW50cnkKKyAgICBGYWNlU2V0OjppdGVyYXRvciBpdCA9IGFuY2VzdG9yRmFjZXMuZmluZChmYWNlKTsKKworICAgIGlmIChpdCAhPSBhbmNlc3RvckZhY2VzLmVuZCgpKQorICAgICAgeworICAgICAgICBlbnRyeS5hZGRJbmhlcml0ZWRGYWNlKCppdCk7CisgICAgICAgIGluc2VydEZpYlVwZGF0ZShGaWJVcGRhdGU6OmNyZWF0ZUFkZFVwZGF0ZShlbnRyeS5nZXROYW1lKCksIGl0LT5mYWNlSWQsIGl0LT5jb3N0KSk7CisgICAgICB9CisgIH0KK30KKwordm9pZAorUmliOjpjcmVhdGVGaWJVcGRhdGVzRm9yRXJhc2VkUmliRW50cnkoUmliRW50cnkmIGVudHJ5KQoreworICBmb3IgKFJpYkVudHJ5OjpGYWNlTGlzdDo6aXRlcmF0b3IgaXQgPSBlbnRyeS5nZXRJbmhlcml0ZWRGYWNlcygpLmJlZ2luKCk7CisgICAgICAgaXQgIT0gZW50cnkuZ2V0SW5oZXJpdGVkRmFjZXMoKS5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICBpbnNlcnRGaWJVcGRhdGUoRmliVXBkYXRlOjpjcmVhdGVSZW1vdmVVcGRhdGUoZW50cnkuZ2V0TmFtZSgpLCBpdC0+ZmFjZUlkKSk7CisgICAgfQorfQorCitSaWI6OkZhY2VTZXQKK1JpYjo6Z2V0QW5jZXN0b3JGYWNlcyhjb25zdCBSaWJFbnRyeSYgZW50cnkpIGNvbnN0Cit7CisgIEZhY2VTZXQgYW5jZXN0b3JGYWNlcygmc29ydEZhY2UpOworCisgIHNoYXJlZF9wdHI8UmliRW50cnk+IHBhcmVudCA9IGVudHJ5LmdldFBhcmVudCgpOworCisgIHdoaWxlIChzdGF0aWNfY2FzdDxib29sPihwYXJlbnQpKQorICAgIHsKKyAgICAgIGZvciAoUmliRW50cnk6Oml0ZXJhdG9yIGl0ID0gcGFyZW50LT5nZXRGYWNlcygpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IHBhcmVudC0+Z2V0RmFjZXMoKS5lbmQoKTsgKytpdCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpc0NoaWxkSW5oZXJpdEZsYWdTZXQoaXQtPmZsYWdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYW5jZXN0b3JGYWNlcy5pbnNlcnQoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocGFyZW50LT5oYXNDYXB0dXJlKCkpCisgICAgICAgIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBwYXJlbnQgPSBwYXJlbnQtPmdldFBhcmVudCgpOworICAgIH0KKworICAgIHJldHVybiBhbmNlc3RvckZhY2VzOworfQorCit2b2lkCitSaWI6OmFkZEluaGVyaXRlZEZhY2VzVG9FbnRyeShSaWJFbnRyeSYgZW50cnksIGNvbnN0IFJpYjo6RmFjZVNldCYgZmFjZXNUb0FkZCkKK3sKKyAgZm9yIChGYWNlU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZhY2VzVG9BZGQuYmVnaW4oKTsgaXQgIT0gZmFjZXNUb0FkZC5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICAvLyBEb24ndCBhZGQgYW4gYW5jZXN0b3IgZmFjZUlkIGlmIHRoZSBuYW1lc3BhY2UgaGFzIGFuIGVudHJ5IGZvciB0aGF0IGZhY2VJZAorICAgICAgaWYgKCFlbnRyeS5oYXNGYWNlSWQoaXQtPmZhY2VJZCkpCisgICAgICAgIHsKKyAgICAgICAgICBlbnRyeS5hZGRJbmhlcml0ZWRGYWNlKCppdCk7CisgICAgICAgICAgaW5zZXJ0RmliVXBkYXRlKEZpYlVwZGF0ZTo6Y3JlYXRlQWRkVXBkYXRlKGVudHJ5LmdldE5hbWUoKSwgaXQtPmZhY2VJZCwgaXQtPmNvc3QpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorUmliOjpyZW1vdmVJbmhlcml0ZWRGYWNlc0Zyb21FbnRyeShSaWJFbnRyeSYgZW50cnksIGNvbnN0IFJpYjo6RmFjZVNldCYgZmFjZXNUb1JlbW92ZSkKK3sKKyAgZm9yIChGYWNlU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZhY2VzVG9SZW1vdmUuYmVnaW4oKTsgaXQgIT0gZmFjZXNUb1JlbW92ZS5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICAvLyBPbmx5IHJlbW92ZSBpZiB0aGUgZmFjZSBoYXMgYmVlbiBpbmhlcml0ZWQKKyAgICAgIGlmIChlbnRyeS5oYXNJbmhlcml0ZWRGYWNlKCppdCkpCisgICAgICAgIHsKKyAgICAgICAgICBlbnRyeS5yZW1vdmVJbmhlcml0ZWRGYWNlKCppdCk7CisgICAgICAgICAgaW5zZXJ0RmliVXBkYXRlKEZpYlVwZGF0ZTo6Y3JlYXRlUmVtb3ZlVXBkYXRlKGVudHJ5LmdldE5hbWUoKSwgaXQtPmZhY2VJZCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkCitSaWI6Om1vZGlmeUNoaWxkcmVuc0luaGVyaXRlZEZhY2VzKFJpYkVudHJ5JiBlbnRyeSwgY29uc3QgUmliOjpGYWNlU2V0JiBmYWNlc1RvQWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJpYjo6RmFjZVNldCYgZmFjZXNUb1JlbW92ZSkKK3sKKyAgUmliRW50cnlMaXN0IGNoaWxkcmVuID0gZW50cnkuZ2V0Q2hpbGRyZW4oKTsKKworICBmb3IgKFJpYkVudHJ5TGlzdDo6aXRlcmF0b3IgY2hpbGQgPSBjaGlsZHJlbi5iZWdpbigpOyBjaGlsZCAhPSBjaGlsZHJlbi5lbmQoKTsgKytjaGlsZCkKKyAgICB7CisgICAgICB0cmF2ZXJzZVN1YlRyZWUoKigqY2hpbGQpLCBmYWNlc1RvQWRkLCBmYWNlc1RvUmVtb3ZlKTsKKyAgICB9Cit9CisKK3ZvaWQKK1JpYjo6dHJhdmVyc2VTdWJUcmVlKFJpYkVudHJ5JiBlbnRyeSwgUmliOjpGYWNlU2V0IGZhY2VzVG9BZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpYjo6RmFjZVNldCBmYWNlc1RvUmVtb3ZlKQoreworICAvLyBJZiBhIHJvdXRlIG9uIHRoZSBuYW1lc3BhY2UgaGFzIHRoZSBjYXB0dXJlIGZsYWcgc2V0LCBpZ25vcmUgc2VsZiBhbmQgY2hpbGRyZW4KKyAgaWYgKGVudHJ5Lmhhc0NhcHR1cmUoKSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8vIFJlbW92ZSBpbmhlcml0ZWQgZmFjZXMgZnJvbSBjdXJyZW50IG5hbWVzcGFjZQorICBmb3IgKFJpYjo6RmFjZVNldDo6Y29uc3RfaXRlcmF0b3IgcmVtb3ZlSXQgPSBmYWNlc1RvUmVtb3ZlLmJlZ2luKCk7CisgICAgICAgcmVtb3ZlSXQgIT0gZmFjZXNUb1JlbW92ZS5lbmQoKTsgKQorICAgIHsKKyAgICAgIC8vIElmIGEgcm91dGUgb24gdGhlIG5hbWVzcGFjZSBoYXMgdGhlIHNhbWUgZmFjZSBhbmQgY2hpbGQgaW5oZXJpdGFuY2Ugc2V0LCBpZ25vcmUgdGhpcyBmYWNlCisgICAgICBpZiAoZW50cnkuaGFzQ2hpbGRJbmhlcml0T25GYWNlSWQocmVtb3ZlSXQtPmZhY2VJZCkpCisgICAgICAgIHsKKyAgICAgICAgICBmYWNlc1RvUmVtb3ZlLmVyYXNlKHJlbW92ZUl0KyspOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8vIE9ubHkgcmVtb3ZlIGZhY2UgaWYgaXQgcmVtb3ZlcyBhbiBleGlzdGluZyBpbmhlcml0ZWQgcm91dGUKKyAgICAgIGlmIChlbnRyeS5oYXNJbmhlcml0ZWRGYWNlKCpyZW1vdmVJdCkpCisgICAgICAgIHsKKyAgICAgICAgICBlbnRyeS5yZW1vdmVJbmhlcml0ZWRGYWNlKCpyZW1vdmVJdCk7CisgICAgICAgICAgaW5zZXJ0RmliVXBkYXRlKEZpYlVwZGF0ZTo6Y3JlYXRlUmVtb3ZlVXBkYXRlKGVudHJ5LmdldE5hbWUoKSwgcmVtb3ZlSXQtPmZhY2VJZCkpOworICAgICAgICB9CisKKyAgICAgICsrcmVtb3ZlSXQ7CisgICAgfQorCisgIC8vIEFkZCBpbmhlcml0ZWQgZmFjZXMgdG8gY3VycmVudCBuYW1lc3BhY2UKKyAgZm9yIChSaWI6OkZhY2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGFkZEl0ID0gZmFjZXNUb0FkZC5iZWdpbigpOworICAgICAgIGFkZEl0ICE9IGZhY2VzVG9BZGQuZW5kKCk7ICkKKyAgICB7CisgICAgICAvLyBJZiBhIHJvdXRlIG9uIHRoZSBuYW1lc3BhY2UgaGFzIHRoZSBzYW1lIGZhY2UgYW5kIGNoaWxkIGluaGVyaXQgc2V0LCBpZ25vcmUgdGhpcyBmYWNlCisgICAgICBpZiAoZW50cnkuaGFzQ2hpbGRJbmhlcml0T25GYWNlSWQoYWRkSXQtPmZhY2VJZCkpCisgICAgICB7CisgICAgICAgIGZhY2VzVG9BZGQuZXJhc2UoYWRkSXQrKyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBPbmx5IGFkZCBmYWNlIGlmIGl0IGRvZXMgbm90IG92ZXJyaWRlIGFuIGV4aXN0aW5nIHJvdXRlCisgICAgICBpZiAoIWVudHJ5Lmhhc0ZhY2VJZChhZGRJdC0+ZmFjZUlkKSkKKyAgICAgICAgeworICAgICAgICAgIFJpYkVudHJ5OjpGYWNlTGlzdDo6aXRlcmF0b3IgZmFjZUl0ID0gZW50cnkuZmluZEluaGVyaXRlZEZhY2UoKmFkZEl0KTsKKworICAgICAgICAgIC8vIElmIHRoZSBlbnRyeSBhbHJlYWR5IGhhcyB0aGUgaW5oZXJpdGVkIGZhY2UsIGp1c3QgdXBkYXRlIHRoZSBmYWNlCisgICAgICAgICAgaWYgKGZhY2VJdCAhPSBlbnRyeS5nZXRJbmhlcml0ZWRGYWNlcygpLmVuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYWNlSXQtPmNvc3QgPSBhZGRJdC0+Y29zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIC8vIE90aGVyd2lzZSwgdGhpcyBpcyBhIG5ld2x5IGluaGVyaXRlZCBmYWNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGVudHJ5LmFkZEluaGVyaXRlZEZhY2UoKmFkZEl0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGluc2VydEZpYlVwZGF0ZShGaWJVcGRhdGU6OmNyZWF0ZUFkZFVwZGF0ZShlbnRyeS5nZXROYW1lKCksIGFkZEl0LT5mYWNlSWQsIGFkZEl0LT5jb3N0KSk7CisgICAgICAgIH0KKworICAgICAgKythZGRJdDsKKyAgICB9CisKKyAgUmliOjpSaWJFbnRyeUxpc3QgY2hpbGRyZW4gPSBlbnRyeS5nZXRDaGlsZHJlbigpOworCisgIC8vIEFwcGx5IGZhY2Ugb3BlcmF0aW9ucyB0byBjdXJyZW50IG5hbWVzcGFjZSdzIGNoaWxkcmVuCisgIGZvciAoUmliOjpSaWJFbnRyeUxpc3Q6Oml0ZXJhdG9yIGNoaWxkID0gY2hpbGRyZW4uYmVnaW4oKTsgY2hpbGQgIT0gY2hpbGRyZW4uZW5kKCk7ICsrY2hpbGQpCisgICAgeworICAgICAgdHJhdmVyc2VTdWJUcmVlKCooKmNoaWxkKSwgZmFjZXNUb0FkZCwgZmFjZXNUb1JlbW92ZSk7CisgICAgfQorfQorCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFJpYiYgcmliKQoreworICBmb3IgKFJpYjo6UmliVGFibGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmliLmJlZ2luKCk7IGl0ICE9IHJpYi5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICBvcyA8PCAqKGl0LT5zZWNvbmQpIDw8ICJcbiI7CisgICAgfQorCisgIHJldHVybiBvczsKK30KKworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC9yaWIvcmliLmhwcCBiL05GRC9yaWIvcmliLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTY4YjFhCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3JpYi9yaWIuaHBwCkBAIC0wLDAgKzEsMTk0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9SSUJfUklCX0hQUAorI2RlZmluZSBORkRfUklCX1JJQl9IUFAKKworI2luY2x1ZGUgInJpYi1lbnRyeS5ocHAiCisjaW5jbHVkZSAiZmliLXVwZGF0ZS5ocHAiCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWNvbnRyb2wtY29tbWFuZC5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3NpZ25hbC5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CisKKy8qKiBcYnJpZWYgcmVwcmVzZW50cyB0aGUgUklCCisgKi8KK2NsYXNzIFJpYiA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpsaXN0PHNoYXJlZF9wdHI8UmliRW50cnk+ID4gUmliRW50cnlMaXN0OworICB0eXBlZGVmIHN0ZDo6bWFwPE5hbWUsIHNoYXJlZF9wdHI8UmliRW50cnk+ID4gUmliVGFibGU7CisgIHR5cGVkZWYgUmliVGFibGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxSaWJFbnRyeT4gPiA+IEZhY2VMb29rdXBUYWJsZTsKKyAgdHlwZWRlZiBib29sICgqRmFjZUNvbXBhcmVQcmVkaWNhdGUpKGNvbnN0IEZhY2VFbnRyeSYsIGNvbnN0IEZhY2VFbnRyeSYpOworICB0eXBlZGVmIHN0ZDo6c2V0PEZhY2VFbnRyeSwgRmFjZUNvbXBhcmVQcmVkaWNhdGU+IEZhY2VTZXQ7CisgIHR5cGVkZWYgc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgRmliVXBkYXRlPiA+IEZpYlVwZGF0ZUxpc3Q7CisKKyAgUmliKCk7CisKKyAgY29uc3RfaXRlcmF0b3IKKyAgZmluZChjb25zdCBOYW1lJiBwcmVmaXgpIGNvbnN0OworCisgIEZhY2VFbnRyeSoKKyAgZmluZChjb25zdCBOYW1lJiBwcmVmaXgsIGNvbnN0IEZhY2VFbnRyeSYgZmFjZSkgY29uc3Q7CisKKyAgdm9pZAorICBpbnNlcnQoY29uc3QgTmFtZSYgcHJlZml4LCBjb25zdCBGYWNlRW50cnkmIGZhY2UpOworCisgIHZvaWQKKyAgZXJhc2UoY29uc3QgTmFtZSYgcHJlZml4LCBjb25zdCBGYWNlRW50cnkmIGZhY2UpOworCisgIHZvaWQKKyAgZXJhc2UoY29uc3QgdWludDY0X3QgZmFjZUlkKTsKKworICBjb25zdF9pdGVyYXRvcgorICBiZWdpbigpIGNvbnN0OworCisgIGNvbnN0X2l0ZXJhdG9yCisgIGVuZCgpIGNvbnN0OworCisgIHNpemVfdAorICBzaXplKCkgY29uc3Q7CisKKyAgYm9vbAorICBlbXB0eSgpIGNvbnN0OworCisgIHNoYXJlZF9wdHI8UmliRW50cnk+CisgIGZpbmRQYXJlbnQoY29uc3QgTmFtZSYgcHJlZml4KSBjb25zdDsKKworICAvKiogXGJyaWVmIGZpbmRzIG5hbWVzcGFjZXMgdW5kZXIgdGhlIHBhc3NlZCBwcmVmaXgKKyAgICogIFxyZXR1cm57IGEgbGlzdCBvZiBlbnRyaWVzIHdoaWNoIGFyZSB1bmRlciB0aGUgcGFzc2VkIHByZWZpeCB9CisgICAqLworICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxSaWJFbnRyeT4gPgorICBmaW5kRGVzY2VuZGFudHMoY29uc3QgTmFtZSYgcHJlZml4KSBjb25zdDsKKworICBjb25zdCBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBGaWJVcGRhdGU+ID4mCisgIGdldEZpYlVwZGF0ZXMoKSBjb25zdDsKKworICB2b2lkCisgIGNsZWFyRmliVXBkYXRlcygpOworCitwcml2YXRlOgorICBSaWJUYWJsZTo6aXRlcmF0b3IKKyAgZXJhc2VFbnRyeShSaWJUYWJsZTo6aXRlcmF0b3IgaXQpOworCisgIHZvaWQKKyAgaW5zZXJ0RmliVXBkYXRlKHNoYXJlZF9wdHI8RmliVXBkYXRlPiB1cGRhdGUpOworCisgIHZvaWQKKyAgY3JlYXRlRmliVXBkYXRlc0Zvck5ld1JpYkVudHJ5KFJpYkVudHJ5JiBlbnRyeSwgY29uc3QgRmFjZUVudHJ5JiBmYWNlKTsKKworICB2b2lkCisgIGNyZWF0ZUZpYlVwZGF0ZXNGb3JOZXdGYWNlRW50cnkoUmliRW50cnkmIGVudHJ5LCBjb25zdCBGYWNlRW50cnkmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBjYXB0dXJlV2FzVHVybmVkT24pOworCisgIHZvaWQKKyAgY3JlYXRlRmliVXBkYXRlc0ZvclVwZGF0ZWRFbnRyeShSaWJFbnRyeSYgZW50cnksIGNvbnN0IEZhY2VFbnRyeSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBwcmV2aW91c0ZsYWdzLCBjb25zdCB1aW50NjRfdCBwcmV2aW91c0Nvc3QpOworICB2b2lkCisgIGNyZWF0ZUZpYlVwZGF0ZXNGb3JFcmFzZWRGYWNlRW50cnkoUmliRW50cnkmIGVudHJ5LCBjb25zdCBGYWNlRW50cnkmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBjYXB0dXJlV2FzVHVybmVkT2ZmKTsKKworICB2b2lkCisgIGNyZWF0ZUZpYlVwZGF0ZXNGb3JFcmFzZWRSaWJFbnRyeShSaWJFbnRyeSYgZW50cnkpOworCisgIEZhY2VTZXQKKyAgZ2V0QW5jZXN0b3JGYWNlcyhjb25zdCBSaWJFbnRyeSYgZW50cnkpIGNvbnN0OworCisgIHZvaWQKKyAgbW9kaWZ5Q2hpbGRyZW5zSW5oZXJpdGVkRmFjZXMoUmliRW50cnkmIGVudHJ5LCBjb25zdCBSaWI6OkZhY2VTZXQmIGZhY2VzVG9BZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmliOjpGYWNlU2V0JiBmYWNlc1RvUmVtb3ZlKTsKKworICB2b2lkCisgIHRyYXZlcnNlU3ViVHJlZShSaWJFbnRyeSYgZW50cnksIFJpYjo6RmFjZVNldCBmYWNlc1RvQWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWI6OkZhY2VTZXQgZmFjZXNUb1JlbW92ZSk7CisKKyAgLyoqIFxicmllZiBBZGRzIHBhc3NlZCBmYWNlcyB0byB0aGUgZW50cnkncyBpbmhlcml0ZWQgZmFjZXMgbGlzdAorICAgKi8KKyAgdm9pZAorICBhZGRJbmhlcml0ZWRGYWNlc1RvRW50cnkoUmliRW50cnkmIGVudHJ5LCBjb25zdCBSaWI6OkZhY2VTZXQmIGZhY2VzVG9BZGQpOworCisgIC8qKiBcYnJpZWYgUmVtb3ZlcyBwYXNzZWQgZmFjZXMgZnJvbSB0aGUgZW50cnkncyBpbmhlcml0ZWQgZmFjZXMgbGlzdAorICAgKi8KKyAgdm9pZAorICByZW1vdmVJbmhlcml0ZWRGYWNlc0Zyb21FbnRyeShSaWJFbnRyeSYgZW50cnksIGNvbnN0IFJpYjo6RmFjZVNldCYgZmFjZXNUb1JlbW92ZSk7CisKK3B1YmxpYzoKKyAgbmRuOjp1dGlsOjpzaWduYWw6OlNpZ25hbDxSaWIsIE5hbWU+IGFmdGVySW5zZXJ0RW50cnk7CisgIG5kbjo6dXRpbDo6c2lnbmFsOjpTaWduYWw8UmliLCBOYW1lPiBhZnRlckVyYXNlRW50cnk7CisKK3ByaXZhdGU6CisgIFJpYlRhYmxlIG1fcmliOworICBGYWNlTG9va3VwVGFibGUgbV9mYWNlTWFwOworICBGaWJVcGRhdGVMaXN0IG1fZmliVXBkYXRlTGlzdDsKKworICBzaXplX3QgbV9uSXRlbXM7Cit9OworCitpbmxpbmUgUmliOjpjb25zdF9pdGVyYXRvcgorUmliOjpiZWdpbigpIGNvbnN0Cit7CisgIHJldHVybiBtX3JpYi5iZWdpbigpOworfQorCitpbmxpbmUgUmliOjpjb25zdF9pdGVyYXRvcgorUmliOjplbmQoKSBjb25zdAoreworICByZXR1cm4gbV9yaWIuZW5kKCk7Cit9CisKK2lubGluZSBzaXplX3QKK1JpYjo6c2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiBtX25JdGVtczsKK30KKworaW5saW5lIGJvb2wKK1JpYjo6ZW1wdHkoKSBjb25zdAoreworICByZXR1cm4gbV9yaWIuZW1wdHkoKTsKK30KKworaW5saW5lIGNvbnN0IFJpYjo6RmliVXBkYXRlTGlzdCYKK1JpYjo6Z2V0RmliVXBkYXRlcygpIGNvbnN0Cit7CisgIHJldHVybiBtX2ZpYlVwZGF0ZUxpc3Q7Cit9CisKK2lubGluZSB2b2lkCitSaWI6OmNsZWFyRmliVXBkYXRlcygpCit7CisgIG1fZmliVXBkYXRlTGlzdC5jbGVhcigpOworfQorCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFJpYiYgcmliKTsKKworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9SSUJfUklCX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2Jvb3N0LXRlc3QuaHBwIGIvTkZEL3Rlc3RzL2Jvb3N0LXRlc3QuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjg1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvYm9vc3QtdGVzdC5ocHAKQEAgLTAsMCArMSwzNyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfVEVTVFNfQk9PU1RfVEVTVF9IUFAKKyNkZWZpbmUgTkZEX1RFU1RTX0JPT1NUX1RFU1RfSFBQCisKKy8vIHN1cHByZXNzIHdhcm5pbmdzIGZyb20gQm9vc3QuVGVzdAorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI3ByYWdtYSBjbGFuZyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY29uY2VwdF9jaGVjay5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9vdXRwdXRfdGVzdF9zdHJlYW0uaHBwPgorCisjZW5kaWYgLy8gTkZEX1RFU1RTX0JPT1NUX1RFU1RfSFBQCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvY29yZS9jb25maWctZmlsZS5jcHAgYi9ORkQvdGVzdHMvY29yZS9jb25maWctZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2ODlkZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9jb3JlL2NvbmZpZy1maWxlLmNwcApAQCAtMCwwICsxLDM5OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImNvcmUvY29uZmlnLWZpbGUuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitORkRfTE9HX0lOSVQoIkNvbmZpZ0ZpbGVUZXN0Iik7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShNZ210Q29uZmlnRmlsZSwgQmFzZUZpeHR1cmUpCisKKy8vIGEKKy8vIHsKKy8vICAgIGFrZXkgImF2YWx1ZSIKKy8vIH0KKy8vIGIKKy8vIHsKKy8vICAgYmtleSAiYnZhbHVlIgorLy8gfQorCitjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorImFcbiIKKyJ7XG4iCisiICAgICAgICBha2V5IFwiYXZhbHVlXCJcbiIKKyJ9XG4iCisiYlxuIgorIntcbiIKKyIgICAgICAgIGJrZXkgXCJidmFsdWVcIlxuIgorIn1cbiI7CisKKworLy8gYQorLy8geworLy8gICAgYWtleSAiYXZhbHVlIgorLy8gfQorLy8gYgorLy8KKy8vICAgYmtleSAiYnZhbHVlIgorLy8gfQorCitjb25zdCBzdGQ6OnN0cmluZyBNQUxGT1JNRURfQ09ORklHID0KKyJhXG4iCisie1xuIgorIiAgICAgICAgYWtleSBcImF2YWx1ZVwiXG4iCisifVxuIgorImJcbiIKKyJcbiIKKyIgICAgICAgIGJrZXkgXCJidmFsdWVcIlxuIgorIn1cbiI7CisKKy8vIGNvdW50cyBvZiB0aGUgcmVzcGVjdGl2ZSBzZWN0aW9uIGNvdW50cyBpbiBjb25maWdfZXhhbXBsZS5pbmZvCisKK2NvbnN0IGludCBDT05GSUdfTl9BX1NFQ1RJT05TID0gMTsKK2NvbnN0IGludCBDT05GSUdfTl9CX1NFQ1RJT05TID0gMTsKKworY2xhc3MgRHVtbXlTdWJzY3JpYmVyCit7CitwdWJsaWM6CisKKyAgRHVtbXlTdWJzY3JpYmVyKENvbmZpZ0ZpbGUmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgIGludCBuQVNlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgaW50IG5CU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICBib29sIGV4cGVjdERyeVJ1bikKKyAgICA6IG1fbkFTZWN0aW9ucyhuQVNlY3Rpb25zKSwKKyAgICAgIG1fbkJTZWN0aW9ucyhuQlNlY3Rpb25zKSwKKyAgICAgIG1fblJlbWFpbmluZ0FDYWxsYmFja3MobkFTZWN0aW9ucyksCisgICAgICBtX25SZW1haW5pbmdCQ2FsbGJhY2tzKG5CU2VjdGlvbnMpLAorICAgICAgbV9leHBlY3REcnlSdW4oZXhwZWN0RHJ5UnVuKQorICB7CisKKyAgfQorCisgIHZvaWQKKyAgb25BKGNvbnN0IENvbmZpZ1NlY3Rpb24mIHNlY3Rpb24sIGJvb2wgaXNEcnlSdW4pCisgIHsKKyAgICAvLyBORkRfTE9HX0RFQlVHKCJhIik7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXNEcnlSdW4sIG1fZXhwZWN0RHJ5UnVuKTsKKyAgICAtLW1fblJlbWFpbmluZ0FDYWxsYmFja3M7CisgIH0KKworCisgIHZvaWQKKyAgb25CKGNvbnN0IENvbmZpZ1NlY3Rpb24mIHNlY3Rpb24sIGJvb2wgaXNEcnlSdW4pCisgIHsKKyAgICAvLyBORkRfTE9HX0RFQlVHKCJiIik7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXNEcnlSdW4sIG1fZXhwZWN0RHJ5UnVuKTsKKyAgICAtLW1fblJlbWFpbmluZ0JDYWxsYmFja3M7CisgIH0KKworICBib29sCisgIGFsbENhbGxiYWNrc0ZpcmVkKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX25SZW1haW5pbmdBQ2FsbGJhY2tzID09IDAgJiYKKyAgICAgIG1fblJlbWFpbmluZ0JDYWxsYmFja3MgPT0gMDsKKyAgfQorCisgIGJvb2wKKyAgbm9DYWxsYmFja3NGaXJlZCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9uUmVtYWluaW5nQUNhbGxiYWNrcyA9PSBtX25BU2VjdGlvbnMgJiYKKyAgICAgIG1fblJlbWFpbmluZ0JDYWxsYmFja3MgPT0gbV9uQlNlY3Rpb25zOworICB9CisKKyAgdmlydHVhbAorICB+RHVtbXlTdWJzY3JpYmVyKCkKKyAgeworCisgIH0KKworcHJpdmF0ZToKKyAgaW50IG1fbkFTZWN0aW9uczsKKyAgaW50IG1fbkJTZWN0aW9uczsKKyAgaW50IG1fblJlbWFpbmluZ0FDYWxsYmFja3M7CisgIGludCBtX25SZW1haW5pbmdCQ2FsbGJhY2tzOworICBib29sIG1fZXhwZWN0RHJ5UnVuOworfTsKKworY2xhc3MgRHVtbXlBbGxTdWJzY3JpYmVyIDogcHVibGljIER1bW15U3Vic2NyaWJlcgoreworcHVibGljOgorICBEdW1teUFsbFN1YnNjcmliZXIoQ29uZmlnRmlsZSYgY29uZmlnLCBib29sIGV4cGVjdERyeVJ1bj1mYWxzZSkKKyAgICA6IER1bW15U3Vic2NyaWJlcihjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX05fQV9TRUNUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfTl9CX1NFQ1RJT05TLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdERyeVJ1bikKKyAgeworICAgIGNvbmZpZy5hZGRTZWN0aW9uSGFuZGxlcigiYSIsIGJpbmQoJkR1bW15U3Vic2NyaWJlcjo6b25BLCB0aGlzLCBfMSwgXzIpKTsKKyAgICBjb25maWcuYWRkU2VjdGlvbkhhbmRsZXIoImIiLCBiaW5kKCZEdW1teVN1YnNjcmliZXI6Om9uQiwgdGhpcywgXzEsIF8yKSk7CisgIH0KKworICB2aXJ0dWFsCisgIH5EdW1teUFsbFN1YnNjcmliZXIoKQorICB7CisKKyAgfQorfTsKKworY2xhc3MgRHVtbXlPbmVTdWJzY3JpYmVyIDogcHVibGljIER1bW15U3Vic2NyaWJlcgoreworcHVibGljOgorICBEdW1teU9uZVN1YnNjcmliZXIoQ29uZmlnRmlsZSYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHBlY3REcnlSdW49ZmFsc2UpCisgICAgOiBEdW1teVN1YnNjcmliZXIoY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgIChzZWN0aW9uTmFtZSA9PSAiYSIpLAorICAgICAgICAgICAgICAgICAgICAgIChzZWN0aW9uTmFtZSA9PSAiYiIpLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdERyeVJ1bikKKyAgeworICAgIGlmIChzZWN0aW9uTmFtZSA9PSAiYSIpCisgICAgICB7CisgICAgICAgIGNvbmZpZy5hZGRTZWN0aW9uSGFuZGxlcihzZWN0aW9uTmFtZSwgYmluZCgmRHVtbXlTdWJzY3JpYmVyOjpvbkEsIHRoaXMsIF8xLCBfMikpOworICAgICAgfQorICAgIGVsc2UgaWYgKHNlY3Rpb25OYW1lID09ICJiIikKKyAgICAgIHsKKyAgICAgICAgY29uZmlnLmFkZFNlY3Rpb25IYW5kbGVyKHNlY3Rpb25OYW1lLCBiaW5kKCZEdW1teVN1YnNjcmliZXI6Om9uQiwgdGhpcywgXzEsIF8yKSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBCT09TVF9GQUlMKCJUZXN0IHNldHVwIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgc2VjdGlvbiBuYW1lICIKKyAgICAgICAgICAgICAgICAgICA8PCJcIiIgPDwgc2VjdGlvbk5hbWUgPDwgIlwiIik7CisgICAgICB9CisKKyAgfQorCisgIHZpcnR1YWwKKyAgfkR1bW15T25lU3Vic2NyaWJlcigpCisgIHsKKworICB9Cit9OworCitjbGFzcyBEdW1teU5vU3Vic2NyaWJlciA6IHB1YmxpYyBEdW1teVN1YnNjcmliZXIKK3sKK3B1YmxpYzoKKyAgRHVtbXlOb1N1YnNjcmliZXIoQ29uZmlnRmlsZSYgY29uZmlnLCBib29sIGV4cGVjdERyeVJ1bikKKyAgICA6IER1bW15U3Vic2NyaWJlcihjb25maWcsIDAsIDAsIGV4cGVjdERyeVJ1bikKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5EdW1teU5vU3Vic2NyaWJlcigpCisgIHsKKworICB9Cit9OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShPbkNvbmZpZ1N0cmVhbSkKK3sKKyAgQ29uZmlnRmlsZSBmaWxlOworICBEdW1teUFsbFN1YnNjcmliZXIgc3ViKGZpbGUpOworICBzdGQ6Omlmc3RyZWFtIGlucHV0OworCisgIGlucHV0Lm9wZW4oInRlc3RzL2NvcmUvY29uZmlnX2V4YW1wbGUuaW5mbyIpOworICBCT09TVF9SRVFVSVJFKGlucHV0LmlzX29wZW4oKSk7CisKKyAgZmlsZS5wYXJzZShpbnB1dCwgZmFsc2UsICJjb25maWdfZXhhbXBsZS5pbmZvIik7CisgIEJPT1NUX0NIRUNLKHN1Yi5hbGxDYWxsYmFja3NGaXJlZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoT25Db25maWdTdHJlYW1FbXB0eVN0cmVhbSkKK3sKKyAgQ29uZmlnRmlsZSBmaWxlOworICBEdW1teUFsbFN1YnNjcmliZXIgc3ViKGZpbGUpOworCisgIHN0ZDo6aWZzdHJlYW0gaW5wdXQ7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1coZmlsZS5wYXJzZShpbnB1dCwgZmFsc2UsICJ1bmtub3duIiksIENvbmZpZ0ZpbGU6OkVycm9yKTsKKyAgQk9PU1RfQ0hFQ0soc3ViLm5vQ2FsbGJhY2tzRmlyZWQoKSk7Cit9CisKKworQk9PU1RfQVVUT19URVNUX0NBU0UoT25Db25maWdTdHJpbmcpCit7CisgIENvbmZpZ0ZpbGUgZmlsZTsKKyAgRHVtbXlBbGxTdWJzY3JpYmVyIHN1YihmaWxlKTsKKworICBmaWxlLnBhcnNlKENPTkZJRywgZmFsc2UsICJkdW1teS1jb25maWciKTsKKworICBCT09TVF9DSEVDSyhzdWIuYWxsQ2FsbGJhY2tzRmlyZWQoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE9uQ29uZmlnU3RyaW5nRW1wdHkpCit7CisgIENvbmZpZ0ZpbGUgZmlsZTsKKyAgRHVtbXlBbGxTdWJzY3JpYmVyIHN1YihmaWxlKTsKKworICBCT09TVF9DSEVDS19USFJPVyhmaWxlLnBhcnNlKHN0ZDo6c3RyaW5nKCksIGZhbHNlLCAiZHVtbXktY29uZmlnIiksIENvbmZpZ0ZpbGU6OkVycm9yKTsKKyAgQk9PU1RfQ0hFQ0soc3ViLm5vQ2FsbGJhY2tzRmlyZWQoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE9uQ29uZmlnU3RyaW5nTWFsZm9ybWVkKQoreworICBDb25maWdGaWxlIGZpbGU7CisgIER1bW15QWxsU3Vic2NyaWJlciBzdWIoZmlsZSk7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1coZmlsZS5wYXJzZShNQUxGT1JNRURfQ09ORklHLCBmYWxzZSwgImR1bW15LWNvbmZpZyIpLCBDb25maWdGaWxlOjpFcnJvcik7CisgIEJPT1NUX0NIRUNLKHN1Yi5ub0NhbGxiYWNrc0ZpcmVkKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShPbkNvbmZpZ1N0cmluZ0RyeVJ1bikKK3sKKyAgQ29uZmlnRmlsZSBmaWxlOworICBEdW1teUFsbFN1YnNjcmliZXIgc3ViKGZpbGUsIHRydWUpOworCisgIGZpbGUucGFyc2UoQ09ORklHLCB0cnVlLCAiZHVtbXktY29uZmlnIik7CisKKyAgQk9PU1RfQ0hFQ0soc3ViLmFsbENhbGxiYWNrc0ZpcmVkKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShPbkNvbmZpZ0ZpbGVuYW1lKQoreworICBDb25maWdGaWxlIGZpbGU7CisgIER1bW15QWxsU3Vic2NyaWJlciBzdWIoZmlsZSk7CisKKyAgZmlsZS5wYXJzZSgidGVzdHMvY29yZS9jb25maWdfZXhhbXBsZS5pbmZvIiwgZmFsc2UpOworCisgIEJPT1NUX0NIRUNLKHN1Yi5hbGxDYWxsYmFja3NGaXJlZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoT25Db25maWdGaWxlbmFtZU5vRmlsZSkKK3sKKyAgQ29uZmlnRmlsZSBmaWxlOworICBEdW1teUFsbFN1YnNjcmliZXIgc3ViKGZpbGUpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKGZpbGUucGFyc2UoImlfbWFkZV90aGlzX3VwLmluZm8iLCBmYWxzZSksIENvbmZpZ0ZpbGU6OkVycm9yKTsKKworICBCT09TVF9DSEVDSyhzdWIubm9DYWxsYmFja3NGaXJlZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoT25Db25maWdGaWxlbmFtZU1hbGZvcm1lZCkKK3sKKyAgQ29uZmlnRmlsZSBmaWxlOworICBEdW1teUFsbFN1YnNjcmliZXIgc3ViKGZpbGUpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKGZpbGUucGFyc2UoInRlc3RzL2NvcmUvY29uZmlnX21hbGZvcm1lZC5pbmZvIiwgZmFsc2UpLCBDb25maWdGaWxlOjpFcnJvcik7CisKKyAgQk9PU1RfQ0hFQ0soc3ViLm5vQ2FsbGJhY2tzRmlyZWQoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE9uQ29uZmlnU3RyZWFtRHJ5UnVuKQoreworICBDb25maWdGaWxlIGZpbGU7CisgIER1bW15QWxsU3Vic2NyaWJlciBzdWIoZmlsZSwgdHJ1ZSk7CisgIHN0ZDo6aWZzdHJlYW0gaW5wdXQ7CisKKyAgaW5wdXQub3BlbigidGVzdHMvY29yZS9jb25maWdfZXhhbXBsZS5pbmZvIik7CisgIEJPT1NUX1JFUVVJUkUoaW5wdXQuaXNfb3BlbigpKTsKKworICBmaWxlLnBhcnNlKGlucHV0LCB0cnVlLCAidGVzdHMvY29yZS9jb25maWdfZXhhbXBsZS5pbmZvIik7CisKKyAgQk9PU1RfQ0hFQ0soc3ViLmFsbENhbGxiYWNrc0ZpcmVkKCkpOworCisgIGlucHV0LmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE9uQ29uZmlnRmlsZW5hbWVEcnlSdW4pCit7CisgIENvbmZpZ0ZpbGUgZmlsZTsKKyAgRHVtbXlBbGxTdWJzY3JpYmVyIHN1YihmaWxlLCB0cnVlKTsKKworICBmaWxlLnBhcnNlKCJ0ZXN0cy9jb3JlL2NvbmZpZ19leGFtcGxlLmluZm8iLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0soc3ViLmFsbENhbGxiYWNrc0ZpcmVkKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShPbkNvbmZpZ1JlcGxhY2VTdWJzY3JpYmVyKQoreworICBDb25maWdGaWxlIGZpbGU7CisgIER1bW15QWxsU3Vic2NyaWJlciBzdWIxKGZpbGUpOworICBEdW1teUFsbFN1YnNjcmliZXIgc3ViMihmaWxlKTsKKworICBmaWxlLnBhcnNlKENPTkZJRywgZmFsc2UsICJkdW1teS1jb25maWciKTsKKworICBCT09TVF9DSEVDSyhzdWIxLm5vQ2FsbGJhY2tzRmlyZWQoKSk7CisgIEJPT1NUX0NIRUNLKHN1YjIuYWxsQ2FsbGJhY2tzRmlyZWQoKSk7Cit9CisKK2NsYXNzIE1pc3NpbmdDYWxsYmFja0ZpeHR1cmUgOiBwdWJsaWMgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgTWlzc2luZ0NhbGxiYWNrRml4dHVyZSgpCisgICAgOiBtX21pc3NpbmdGaXJlZChmYWxzZSkKKyAgeworICB9CisKKyAgdm9pZAorICBjaGVja01pc3NpbmdIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnU2VjdGlvbiYgc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRHJ5UnVuKQorICB7CisgICAgbV9taXNzaW5nRmlyZWQgPSB0cnVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBtX21pc3NpbmdGaXJlZDsKK307CisKKworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShPbkNvbmZpZ1VuY292ZXJlZFNlY3Rpb25zLCBNaXNzaW5nQ2FsbGJhY2tGaXh0dXJlKQoreworICBDb25maWdGaWxlIGZpbGU7CisKKyAgQk9PU1RfUkVRVUlSRV9USFJPVyhmaWxlLnBhcnNlKENPTkZJRywgZmFsc2UsICJkdW1teS1jb25maWciKSwgQ29uZmlnRmlsZTo6RXJyb3IpOworCisgIENvbmZpZ0ZpbGUgcGVybWlzc2l2ZUZpbGUoYmluZCgmTWlzc2luZ0NhbGxiYWNrRml4dHVyZTo6Y2hlY2tNaXNzaW5nSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMiwgXzMsIF80KSk7CisKKyAgRHVtbXlPbmVTdWJzY3JpYmVyIHN1YkEocGVybWlzc2l2ZUZpbGUsICJhIik7CisKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhwZXJtaXNzaXZlRmlsZS5wYXJzZShDT05GSUcsIGZhbHNlLCAiZHVtbXktY29uZmlnIikpOworICBCT09TVF9DSEVDSyhzdWJBLmFsbENhbGxiYWNrc0ZpcmVkKCkpOworICBCT09TVF9DSEVDSyhtX21pc3NpbmdGaXJlZCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE9uQ29uZmlnQ292ZXJlZEJ5UGFydGlhbFN1YnNjcmliZXJzKQoreworICBDb25maWdGaWxlIGZpbGU7CisgIER1bW15T25lU3Vic2NyaWJlciBzdWJBKGZpbGUsICJhIik7CisgIER1bW15T25lU3Vic2NyaWJlciBzdWJCKGZpbGUsICJiIik7CisKKyAgZmlsZS5wYXJzZShDT05GSUcsIGZhbHNlLCAiZHVtbXktY29uZmlnIik7CisKKyAgQk9PU1RfQ0hFQ0soc3ViQS5hbGxDYWxsYmFja3NGaXJlZCgpKTsKKyAgQk9PU1RfQ0hFQ0soc3ViQi5hbGxDYWxsYmFja3NGaXJlZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9jb3JlL2NvbmZpZ19leGFtcGxlLmluZm8gYi9ORkQvdGVzdHMvY29yZS9jb25maWdfZXhhbXBsZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MTY5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvY29yZS9jb25maWdfZXhhbXBsZS5pbmZvCkBAIC0wLDAgKzEsOSBAQAorYQoreworICAgICAgICBha2V5ICJhdmFsdWUiCit9CisKK2IKK3sKKyAgICAgICAgYmtleSAiYnZhbHVlIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9jb3JlL2NvbmZpZ19tYWxmb3JtZWQuaW5mbyBiL05GRC90ZXN0cy9jb3JlL2NvbmZpZ19tYWxmb3JtZWQuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2ExZjllCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2NvcmUvY29uZmlnX21hbGZvcm1lZC5pbmZvCkBAIC0wLDAgKzEsOSBAQAorYQoreworICAgICAgICBha2V5ICJhdmFsdWUiCit9CisKK2IKKworICAgICAgICBia2V5ICJidmFsdWUiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2NvcmUvbG9nZ2VyLmNwcCBiL05GRC90ZXN0cy9jb3JlL2xvZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlN2ZhNAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9jb3JlL2xvZ2dlci5jcHAKQEAgLTAsMCArMSw4NzAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nL2NsYXNzaWZpY2F0aW9uLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoQ29yZUxvZ2dlciwgQmFzZUZpeHR1cmUpCisKK2NsYXNzIExvZ2dlckZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgTG9nZ2VyRml4dHVyZSgpCisgICAgOiBtX3NhdmVkQnVmKHN0ZDo6Y2xvZy5yZGJ1ZigpKQorICAgICwgbV9zYXZlZExldmVsKExvZ2dlckZhY3Rvcnk6OmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdExldmVsKCkpCisgIHsKKyAgICBzdGQ6OmNsb2cucmRidWYobV9idWZmZXIucmRidWYoKSk7CisgIH0KKworICB+TG9nZ2VyRml4dHVyZSgpCisgIHsKKyAgICBzdGQ6OmNsb2cucmRidWYobV9zYXZlZEJ1Zik7CisgICAgTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5zZXREZWZhdWx0TGV2ZWwobV9zYXZlZExldmVsKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nc3RyZWFtIG1fYnVmZmVyOworICBzdGQ6OnN0cmVhbWJ1ZiogbV9zYXZlZEJ1ZjsKKyAgTG9nTGV2ZWwgbV9zYXZlZExldmVsOworCit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShCYXNpYywgTG9nZ2VyRml4dHVyZSkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIG5kbjo6dGltZTsKKyAgdXNpbmcgc3RkOjpzdHJpbmc7CisKKyAgY29uc3QgbmRuOjp0aW1lOjptaWNyb3NlY29uZHM6OnJlcCBPTkVfU0VDT05EID0gMTAwMDAwMDsKKworICBORkRfTE9HX0lOSVQoIkJhc2ljVGVzdHMiKTsKKyAgZ19sb2dnZXIuc2V0TG9nTGV2ZWwoTE9HX0FMTCk7CisKKyAgY29uc3Qgc3RyaW5nIEVYUEVDVEVEW10gPQorICAgIHsKKyAgICAgICJUUkFDRToiLCAgICJbQmFzaWNUZXN0c10iLCAidHJhY2UtbWVzc2FnZS1KSEdGRFNSXjFcbiIsCisgICAgICAiREVCVUc6IiwgICAiW0Jhc2ljVGVzdHNdIiwgImRlYnVnLW1lc3NhZ2UtSUdnMjQ3NGZka3NkLWZvLTE1MTYxN1xuIiwKKyAgICAgICJXQVJOSU5HOiIsICJbQmFzaWNUZXN0c10iLCAid2FybmluZy1tZXNzYWdlLVhYWGhkaGQxMTF4XG4iLAorICAgICAgIklORk86IiwgICAgIltCYXNpY1Rlc3RzXSIsICJpbmZvLW1lc3NhZ2UtSmp4anNoajEzXG4iLAorICAgICAgIkVSUk9SOiIsICAgIltCYXNpY1Rlc3RzXSIsICJlcnJvci1tZXNzYWdlLSEjJCZeJSQjQFxuIiwKKyAgICAgICJGQVRBTDoiLCAgICJbQmFzaWNUZXN0c10iLCAiZmF0YWwtbWVzc2FnZS1KSlNqYWFtY25nXG4iLAorICAgIH07CisKKyAgY29uc3Qgc2l6ZV90IE5fRVhQRUNURUQgPSBzaXplb2YoRVhQRUNURUQpIC8gc2l6ZW9mKHN0cmluZyk7CisKKyAgbWljcm9zZWNvbmRzOjpyZXAgYmVmb3JlID0KKyAgICBkdXJhdGlvbl9jYXN0PG1pY3Jvc2Vjb25kcz4oc3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisKKyAgTkZEX0xPR19UUkFDRSgidHJhY2UtbWVzc2FnZS1KSEdGRFNSXjEiKTsKKyAgTkZEX0xPR19ERUJVRygiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tIiA8PCAxNSA8PCAxNiA8PCAxNyk7CisgIE5GRF9MT0dfV0FSTigid2FybmluZy1tZXNzYWdlLVhYWGhkaGQxMSIgPDwgMSA8PCJ4Iik7CisgIE5GRF9MT0dfSU5GTygiaW5mby1tZXNzYWdlLUpqeGpzaGoxMyIpOworICBORkRfTE9HX0VSUk9SKCJlcnJvci1tZXNzYWdlLSEjJCZeJSQjQCIpOworICBORkRfTE9HX0ZBVEFMKCJmYXRhbC1tZXNzYWdlLUpKU2phYW1jbmciKTsKKworICBtaWNyb3NlY29uZHM6OnJlcCBhZnRlciA9CisgICAgZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgIGNvbnN0IHN0cmluZyBidWZmZXIgPSBtX2J1ZmZlci5zdHIoKTsKKworICBzdGQ6OnZlY3RvcjxzdHJpbmc+IGNvbXBvbmVudHM7CisgIGJvb3N0OjpzcGxpdChjb21wb25lbnRzLCBidWZmZXIsIGJvb3N0Ojppc19hbnlfb2YoIiAsXG4iKSk7CisKKyAgLy8gc3RkOjpjb3V0IDw8IGNvbXBvbmVudHMuc2l6ZSgpIDw8ICIgZm9yICIgPDwgbW9kdWxlTmFtZSAgPDwgc3RkOjplbmRsOworICAvLyBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBvbmVudHMuc2l6ZSgpOyArK2kpCisgIC8vICAgeworICAvLyAgICAgc3RkOjpjb3V0IDw8ICItPiAiIDw8IGNvbXBvbmVudHNbaV0gPDwgc3RkOjplbmRsOworICAvLyAgIH0KKworICAvLyBleHBlY3RlZCArIG51bWJlciBvZiB0aW1lc3RhbXBzIChvbmUgcGVyIGxvZyBzdGF0ZW1lbnQpICsgdHJhaWxpbmcgbmV3bGluZSBvZiBsYXN0IHN0YXRlbWVudAorICBCT09TVF9SRVFVSVJFX0VRVUFMKGNvbXBvbmVudHMuc2l6ZSgpLCBOX0VYUEVDVEVEICsgNiArIDEpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29tcG9uZW50SXRlciA9IGNvbXBvbmVudHMuYmVnaW4oKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOX0VYUEVDVEVEOyArK2kpCisgICAgeworICAgICAgLy8gdGltZXN0YW1wIExPR19MRVZFTDogW01vZHVsZU5hbWVdIG1lc3NhZ2VcbgorCisgICAgICBjb25zdCBzdHJpbmcmIHRpbWVzdGFtcCA9ICpjb21wb25lbnRJdGVyOworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJ0aW1lc3RhbXAgPSAiIDw8IHRpbWVzdGFtcCA8PCBzdGQ6OmVuZGw7CisgICAgICArK2NvbXBvbmVudEl0ZXI7CisKKyAgICAgIHNpemVfdCB0aW1lRGVsaW1pdGVyUG9zaXRpb24gPSB0aW1lc3RhbXAuZmluZCgiLiIpOworCisgICAgICBCT09TVF9SRVFVSVJFX05FKHN0cmluZzo6bnBvcywgdGltZURlbGltaXRlclBvc2l0aW9uKTsKKworICAgICAgc3RyaW5nIHNlY29uZHNTdHJpbmcgPSB0aW1lc3RhbXAuc3Vic3RyKDAsIHRpbWVEZWxpbWl0ZXJQb3NpdGlvbik7CisgICAgICBzdHJpbmcgdXNlY29uZHNTdHJpbmcgPSB0aW1lc3RhbXAuc3Vic3RyKHRpbWVEZWxpbWl0ZXJQb3NpdGlvbiArIDEpOworCisgICAgICBtaWNyb3NlY29uZHM6OnJlcCBleHRyYWN0ZWRUaW1lID0KKyAgICAgICAgT05FX1NFQ09ORCAqIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bWljcm9zZWNvbmRzOjpyZXA+KHNlY29uZHNTdHJpbmcpICsKKyAgICAgICAgYm9vc3Q6OmxleGljYWxfY2FzdDxtaWNyb3NlY29uZHM6OnJlcD4odXNlY29uZHNTdHJpbmcpOworCisgICAgICAvLyBzdGQ6OmNvdXQgPDwgImJlZm9yZT0iIDw8IGJlZm9yZQorICAgICAgLy8gICAgICAgICAgIDw8ICIgZXh0cmFjdGVkPSIgPDwgZXh0cmFjdGVkVGltZQorICAgICAgLy8gICAgICAgICAgIDw8ICIgYWZ0ZXI9IiA8PCBhZnRlciA8PCBzdGQ6OmVuZGw7CisKKworICAgICAgQk9PU1RfQ0hFQ0tfTEUoYmVmb3JlLCBleHRyYWN0ZWRUaW1lKTsKKyAgICAgIEJPT1NUX0NIRUNLX0xFKGV4dHJhY3RlZFRpbWUsIGFmdGVyKTsKKworICAgICAgLy8gTE9HX0xFVkVMOgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKmNvbXBvbmVudEl0ZXIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICAgICsraTsKKworICAgICAgLy8gW01vZHVsZU5hbWVdCisgICAgICBCT09TVF9DSEVDS19FUVVBTCgqY29tcG9uZW50SXRlciwgRVhQRUNURURbaV0pOworICAgICAgKytjb21wb25lbnRJdGVyOworICAgICAgKytpOworCisgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UgPSAqY29tcG9uZW50SXRlcjsKKworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJtZXNzYWdlID0gIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgLy8gYWRkIGJhY2sgdGhlIG5ld2xpbmUgdGhhdCB3ZSBzcGxpdCBvbgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSArICJcbiIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICB9CisKK30KKworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShDb25maWd1cmVGYWN0b3J5LCBMb2dnZXJGaXh0dXJlKQoreworICB1c2luZyBuYW1lc3BhY2UgbmRuOjp0aW1lOworICB1c2luZyBzdGQ6OnN0cmluZzsKKworICBjb25zdCBuZG46OnRpbWU6Om1pY3Jvc2Vjb25kczo6cmVwIE9ORV9TRUNPTkQgPSAxMDAwMDAwOworCisgIE5GRF9MT0dfSU5JVCgiQ29uZmlndXJlRmFjdG9yeVRlc3RzIik7CisKKyAgY29uc3Qgc3RyaW5nIExPR19DT05GSUcgPQorICAgICJsb2dcbiIKKyAgICAie1xuIgorICAgICIgIGRlZmF1bHRfbGV2ZWwgSU5GT1xuIgorICAgICJ9XG4iOworCisgIExvZ2dlckZhY3Rvcnk6OmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdExldmVsKExPR19BTEwpOworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBMb2dnZXJGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICBjb25maWcucGFyc2UoTE9HX0NPTkZJRywgZmFsc2UsICJMT0dfQ09ORklHIik7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChMb2dnZXJGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLmdldERlZmF1bHRMZXZlbCgpLCBMT0dfSU5GTyk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgRVhQRUNURURbXSA9CisgICAgeworICAgICAgIldBUk5JTkc6IiwgIltDb25maWd1cmVGYWN0b3J5VGVzdHNdIiwgIndhcm5pbmctbWVzc2FnZS1YWFhoZGhkMTExeFxuIiwKKyAgICAgICJJTkZPOiIsICAgICJbQ29uZmlndXJlRmFjdG9yeVRlc3RzXSIsICJpbmZvLW1lc3NhZ2UtSmp4anNoajEzXG4iLAorICAgICAgIkVSUk9SOiIsICAgIltDb25maWd1cmVGYWN0b3J5VGVzdHNdIiwgImVycm9yLW1lc3NhZ2UtISMkJl4lJCNAXG4iLAorICAgICAgIkZBVEFMOiIsICAgIltDb25maWd1cmVGYWN0b3J5VGVzdHNdIiwgImZhdGFsLW1lc3NhZ2UtSkpTamFhbWNuZ1xuIiwKKyAgICB9OworCisgIGNvbnN0IHNpemVfdCBOX0VYUEVDVEVEID0gc2l6ZW9mKEVYUEVDVEVEKSAvIHNpemVvZihzdGQ6OnN0cmluZyk7CisKKyAgbWljcm9zZWNvbmRzOjpyZXAgYmVmb3JlID0KKyAgICBkdXJhdGlvbl9jYXN0PG1pY3Jvc2Vjb25kcz4oc3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisKKyAgTkZEX0xPR19UUkFDRSgidHJhY2UtbWVzc2FnZS1KSEdGRFNSXjEiKTsKKyAgTkZEX0xPR19ERUJVRygiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tIiA8PCAxNSA8PCAxNiA8PCAxNyk7CisgIE5GRF9MT0dfV0FSTigid2FybmluZy1tZXNzYWdlLVhYWGhkaGQxMSIgPDwgMSA8PCJ4Iik7CisgIE5GRF9MT0dfSU5GTygiaW5mby1tZXNzYWdlLUpqeGpzaGoxMyIpOworICBORkRfTE9HX0VSUk9SKCJlcnJvci1tZXNzYWdlLSEjJCZeJSQjQCIpOworICBORkRfTE9HX0ZBVEFMKCJmYXRhbC1tZXNzYWdlLUpKU2phYW1jbmciKTsKKworICBtaWNyb3NlY29uZHM6OnJlcCBhZnRlciA9CisgICAgZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgIGNvbnN0IHN0cmluZyBidWZmZXIgPSBtX2J1ZmZlci5zdHIoKTsKKworICBzdGQ6OnZlY3RvcjxzdHJpbmc+IGNvbXBvbmVudHM7CisgIGJvb3N0OjpzcGxpdChjb21wb25lbnRzLCBidWZmZXIsIGJvb3N0Ojppc19hbnlfb2YoIiAsXG4iKSk7CisKKyAgLy8gc3RkOjpjb3V0IDw8IGNvbXBvbmVudHMuc2l6ZSgpIDw8ICIgZm9yICIgPDwgbW9kdWxlTmFtZSAgPDwgc3RkOjplbmRsOworICAvLyBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBvbmVudHMuc2l6ZSgpOyArK2kpCisgIC8vICAgeworICAvLyAgICAgc3RkOjpjb3V0IDw8ICItPiAiIDw8IGNvbXBvbmVudHNbaV0gPDwgc3RkOjplbmRsOworICAvLyAgIH0KKworICAvLyBleHBlY3RlZCArIG51bWJlciBvZiB0aW1lc3RhbXBzIChvbmUgcGVyIGxvZyBzdGF0ZW1lbnQpICsgdHJhaWxpbmcgbmV3bGluZSBvZiBsYXN0IHN0YXRlbWVudAorICBCT09TVF9SRVFVSVJFX0VRVUFMKGNvbXBvbmVudHMuc2l6ZSgpLCBOX0VYUEVDVEVEICsgNCArIDEpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29tcG9uZW50SXRlciA9IGNvbXBvbmVudHMuYmVnaW4oKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOX0VYUEVDVEVEOyArK2kpCisgICAgeworICAgICAgLy8gdGltZXN0YW1wIExPR19MRVZFTDogW01vZHVsZU5hbWVdIG1lc3NhZ2VcbgorCisgICAgICBjb25zdCBzdHJpbmcmIHRpbWVzdGFtcCA9ICpjb21wb25lbnRJdGVyOworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJ0aW1lc3RhbXAgPSAiIDw8IHRpbWVzdGFtcCA8PCBzdGQ6OmVuZGw7CisgICAgICArK2NvbXBvbmVudEl0ZXI7CisKKyAgICAgIHNpemVfdCB0aW1lRGVsaW1pdGVyUG9zaXRpb24gPSB0aW1lc3RhbXAuZmluZCgiLiIpOworCisgICAgICBCT09TVF9SRVFVSVJFX05FKHN0cmluZzo6bnBvcywgdGltZURlbGltaXRlclBvc2l0aW9uKTsKKworICAgICAgc3RyaW5nIHNlY29uZHNTdHJpbmcgPSB0aW1lc3RhbXAuc3Vic3RyKDAsIHRpbWVEZWxpbWl0ZXJQb3NpdGlvbik7CisgICAgICBzdHJpbmcgdXNlY29uZHNTdHJpbmcgPSB0aW1lc3RhbXAuc3Vic3RyKHRpbWVEZWxpbWl0ZXJQb3NpdGlvbiArIDEpOworCisgICAgICBtaWNyb3NlY29uZHM6OnJlcCBleHRyYWN0ZWRUaW1lID0KKyAgICAgICAgT05FX1NFQ09ORCAqIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bWljcm9zZWNvbmRzOjpyZXA+KHNlY29uZHNTdHJpbmcpICsKKyAgICAgICAgYm9vc3Q6OmxleGljYWxfY2FzdDxtaWNyb3NlY29uZHM6OnJlcD4odXNlY29uZHNTdHJpbmcpOworCisgICAgICAvLyBzdGQ6OmNvdXQgPDwgImJlZm9yZT0iIDw8IGJlZm9yZQorICAgICAgLy8gICAgICAgICAgIDw8ICIgZXh0cmFjdGVkPSIgPDwgZXh0cmFjdGVkVGltZQorICAgICAgLy8gICAgICAgICAgIDw8ICIgYWZ0ZXI9IiA8PCBhZnRlciA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIEJPT1NUX0NIRUNLX0xFKGJlZm9yZSwgZXh0cmFjdGVkVGltZSk7CisgICAgICBCT09TVF9DSEVDS19MRShleHRyYWN0ZWRUaW1lLCBhZnRlcik7CisKKyAgICAgIC8vIExPR19MRVZFTDoKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCpjb21wb25lbnRJdGVyLCBFWFBFQ1RFRFtpXSk7CisgICAgICArK2NvbXBvbmVudEl0ZXI7CisgICAgICArK2k7CisKKyAgICAgIC8vIFtNb2R1bGVOYW1lXQorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKmNvbXBvbmVudEl0ZXIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICAgICsraTsKKworICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlID0gKmNvbXBvbmVudEl0ZXI7CisKKyAgICAgIC8vIHN0ZDo6Y291dCA8PCAibWVzc2FnZSA9ICIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIC8vIGFkZCBiYWNrIHRoZSBuZXdsaW5lIHRoYXQgd2Ugc3BsaXQgb24KKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKG1lc3NhZ2UgKyAiXG4iLCBFWFBFQ1RFRFtpXSk7CisgICAgICArK2NvbXBvbmVudEl0ZXI7CisgICAgfQorfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShUZXN0TnVtYmVyTGV2ZWwsIExvZ2dlckZpeHR1cmUpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIExPR19DT05GSUcgPQorICAgICJsb2dcbiIKKyAgICAie1xuIgorICAgICIgIGRlZmF1bHRfbGV2ZWwgMlxuIiAvLyBlcXVpdmFsZW50IG9mIFdBUk4KKyAgICAifVxuIjsKKworICBMb2dnZXJGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLnNldERlZmF1bHRMZXZlbChMT0dfQUxMKTsKKworICBDb25maWdGaWxlIGNvbmZpZzsKKyAgTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgY29uZmlnLnBhcnNlKExPR19DT05GSUcsIGZhbHNlLCAiTE9HX0NPTkZJRyIpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0TGV2ZWwoKSwgTE9HX1dBUk4pOworfQorCitzdGF0aWMgdm9pZAordGVzdE1vZHVsZUJQcmludCgpCit7CisgIE5GRF9MT0dfSU5JVCgiVGVzdE1vZHVsZUIiKTsKKyAgTkZEX0xPR19ERUJVRygiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tIiA8PCAxNSA8PCAxNiA8PCAxNyk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKExpbWl0TW9kdWxlcywgTG9nZ2VyRml4dHVyZSkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIG5kbjo6dGltZTsKKyAgdXNpbmcgc3RkOjpzdHJpbmc7CisKKyAgTkZEX0xPR19JTklUKCJUZXN0TW9kdWxlQSIpOworCisgIGNvbnN0IG5kbjo6dGltZTo6bWljcm9zZWNvbmRzOjpyZXAgT05FX1NFQ09ORCA9IDEwMDAwMDA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgRVhQRUNURURbXSA9CisgICAgeworICAgICAgIldBUk5JTkc6IiwgIltUZXN0TW9kdWxlQV0iLCAid2FybmluZy1tZXNzYWdlLVhYWGhkaGQxMTF4XG4iLAorICAgIH07CisKKyAgY29uc3Qgc2l6ZV90IE5fRVhQRUNURUQgPSBzaXplb2YoRVhQRUNURUQpIC8gc2l6ZW9mKHN0ZDo6c3RyaW5nKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBMT0dfQ09ORklHID0KKyAgICAibG9nXG4iCisgICAgIntcbiIKKyAgICAiICBkZWZhdWx0X2xldmVsIFdBUk5cbiIKKyAgICAifVxuIjsKKworICBDb25maWdGaWxlIGNvbmZpZzsKKyAgTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgY29uZmlnLnBhcnNlKExPR19DT05GSUcsIGZhbHNlLCAiTE9HX0NPTkZJRyIpOworCisgIG1pY3Jvc2Vjb25kczo6cmVwIGJlZm9yZSA9CisgICAgZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgIC8vIHRoaXMgc2hvdWxkIHByaW50CisgIE5GRF9MT0dfV0FSTigid2FybmluZy1tZXNzYWdlLVhYWGhkaGQxMSIgPDwgMSA8PCAieCIpOworCisgIC8vIHRoaXMgc2hvdWxkIG5vdCBiZWNhdXNlIGl0J3MgbGV2ZWwgaXMgPCBXQVJOCisgIHRlc3RNb2R1bGVCUHJpbnQoKTsKKworICBtaWNyb3NlY29uZHM6OnJlcCBhZnRlciA9CisgICAgZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgIGNvbnN0IHN0cmluZyBidWZmZXIgPSBtX2J1ZmZlci5zdHIoKTsKKworICBzdGQ6OnZlY3RvcjxzdHJpbmc+IGNvbXBvbmVudHM7CisgIGJvb3N0OjpzcGxpdChjb21wb25lbnRzLCBidWZmZXIsIGJvb3N0Ojppc19hbnlfb2YoIiAsXG4iKSk7CisKKyAgLy8gZXhwZWN0ZWQgKyBudW1iZXIgb2YgdGltZXN0YW1wcyAob25lIHBlciBsb2cgc3RhdGVtZW50KSArIHRyYWlsaW5nIG5ld2xpbmUgb2YgbGFzdCBzdGF0ZW1lbnQKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChjb21wb25lbnRzLnNpemUoKSwgTl9FWFBFQ1RFRCArIDEgKyAxKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbXBvbmVudEl0ZXIgPSBjb21wb25lbnRzLmJlZ2luKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTl9FWFBFQ1RFRDsgKytpKQorICAgIHsKKyAgICAgIC8vIHRpbWVzdGFtcCBMT0dfTEVWRUw6IFtNb2R1bGVOYW1lXSBtZXNzYWdlXG4KKworICAgICAgY29uc3Qgc3RyaW5nJiB0aW1lc3RhbXAgPSAqY29tcG9uZW50SXRlcjsKKyAgICAgIC8vIHN0ZDo6Y291dCA8PCAidGltZXN0YW1wID0gIiA8PCB0aW1lc3RhbXAgPDwgc3RkOjplbmRsOworICAgICAgKytjb21wb25lbnRJdGVyOworCisgICAgICBzaXplX3QgdGltZURlbGltaXRlclBvc2l0aW9uID0gdGltZXN0YW1wLmZpbmQoIi4iKTsKKworICAgICAgQk9PU1RfUkVRVUlSRV9ORShzdHJpbmc6Om5wb3MsIHRpbWVEZWxpbWl0ZXJQb3NpdGlvbik7CisKKyAgICAgIHN0cmluZyBzZWNvbmRzU3RyaW5nID0gdGltZXN0YW1wLnN1YnN0cigwLCB0aW1lRGVsaW1pdGVyUG9zaXRpb24pOworICAgICAgc3RyaW5nIHVzZWNvbmRzU3RyaW5nID0gdGltZXN0YW1wLnN1YnN0cih0aW1lRGVsaW1pdGVyUG9zaXRpb24gKyAxKTsKKworICAgICAgbWljcm9zZWNvbmRzOjpyZXAgZXh0cmFjdGVkVGltZSA9CisgICAgICAgIE9ORV9TRUNPTkQgKiBib29zdDo6bGV4aWNhbF9jYXN0PG1pY3Jvc2Vjb25kczo6cmVwPihzZWNvbmRzU3RyaW5nKSArCisgICAgICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bWljcm9zZWNvbmRzOjpyZXA+KHVzZWNvbmRzU3RyaW5nKTsKKworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJiZWZvcmU9IiA8PCBiZWZvcmUKKyAgICAgIC8vICAgICAgICAgICA8PCAiIGV4dHJhY3RlZD0iIDw8IGV4dHJhY3RlZFRpbWUKKyAgICAgIC8vICAgICAgICAgICA8PCAiIGFmdGVyPSIgPDwgYWZ0ZXIgPDwgc3RkOjplbmRsOworCisgICAgICBCT09TVF9DSEVDS19MRShiZWZvcmUsIGV4dHJhY3RlZFRpbWUpOworICAgICAgQk9PU1RfQ0hFQ0tfTEUoZXh0cmFjdGVkVGltZSwgYWZ0ZXIpOworCisgICAgICAvLyBMT0dfTEVWRUw6CisgICAgICBCT09TVF9DSEVDS19FUVVBTCgqY29tcG9uZW50SXRlciwgRVhQRUNURURbaV0pOworICAgICAgKytjb21wb25lbnRJdGVyOworICAgICAgKytpOworCisgICAgICAvLyBbTW9kdWxlTmFtZV0KKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCpjb21wb25lbnRJdGVyLCBFWFBFQ1RFRFtpXSk7CisgICAgICArK2NvbXBvbmVudEl0ZXI7CisgICAgICArK2k7CisKKyAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSA9ICpjb21wb25lbnRJdGVyOworCisgICAgICAvLyBzdGQ6OmNvdXQgPDwgIm1lc3NhZ2UgPSAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworCisgICAgICAvLyBhZGQgYmFjayB0aGUgbmV3bGluZSB0aGF0IHdlIHNwbGl0IG9uCisgICAgICBCT09TVF9DSEVDS19FUVVBTChtZXNzYWdlICsgIlxuIiwgRVhQRUNURURbaV0pOworICAgICAgKytjb21wb25lbnRJdGVyOworICAgIH0KK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoRXhwbGljaXRseVNldE1vZHVsZSwgTG9nZ2VyRml4dHVyZSkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIG5kbjo6dGltZTsKKyAgdXNpbmcgc3RkOjpzdHJpbmc7CisKKyAgTkZEX0xPR19JTklUKCJUZXN0TW9kdWxlQSIpOworCisgIGNvbnN0IG5kbjo6dGltZTo6bWljcm9zZWNvbmRzOjpyZXAgT05FX1NFQ09ORCA9IDEwMDAwMDA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgTE9HX0NPTkZJRyA9CisgICAgImxvZ1xuIgorICAgICJ7XG4iCisgICAgIiAgZGVmYXVsdF9sZXZlbCBXQVJOXG4iCisgICAgIiAgVGVzdE1vZHVsZUIgREVCVUdcbiIKKyAgICAifVxuIjsKKworICBDb25maWdGaWxlIGNvbmZpZzsKKyAgTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgY29uZmlnLnBhcnNlKExPR19DT05GSUcsIGZhbHNlLCAiTE9HX0NPTkZJRyIpOworCisgIG1pY3Jvc2Vjb25kczo6cmVwIGJlZm9yZSA9CisgICAgZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgLy8gdGhpcyBzaG91bGQgcHJpbnQKKyAgTkZEX0xPR19XQVJOKCJ3YXJuaW5nLW1lc3NhZ2UtWFhYaGRoZDExIiA8PCAxIDw8ICJ4Iik7CisKKyAgLy8gdGhpcyB0b28gYmVjYXVzZSBpdHMgbGV2ZWwgaXMgZXhwbGljaXRseSBzZXQgdG8gREVCVUcKKyAgdGVzdE1vZHVsZUJQcmludCgpOworCisgIG1pY3Jvc2Vjb25kczo6cmVwIGFmdGVyID0KKyAgICBkdXJhdGlvbl9jYXN0PG1pY3Jvc2Vjb25kcz4oc3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgRVhQRUNURURbXSA9CisgICAgeworICAgICAgIldBUk5JTkc6IiwgIltUZXN0TW9kdWxlQV0iLCAid2FybmluZy1tZXNzYWdlLVhYWGhkaGQxMTF4XG4iLAorICAgICAgIkRFQlVHOiIsICAgIltUZXN0TW9kdWxlQl0iLCAiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tMTUxNjE3XG4iLAorICAgIH07CisKKyAgY29uc3Qgc2l6ZV90IE5fRVhQRUNURUQgPSBzaXplb2YoRVhQRUNURUQpIC8gc2l6ZW9mKHN0ZDo6c3RyaW5nKTsKKworICBjb25zdCBzdHJpbmcgYnVmZmVyID0gbV9idWZmZXIuc3RyKCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RyaW5nPiBjb21wb25lbnRzOworICBib29zdDo6c3BsaXQoY29tcG9uZW50cywgYnVmZmVyLCBib29zdDo6aXNfYW55X29mKCIgLFxuIikpOworCisgIC8vIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7ICsraSkKKyAgLy8gICB7CisgIC8vICAgICBzdGQ6OmNvdXQgPDwgIi0+ICIgPDwgY29tcG9uZW50c1tpXSA8PCBzdGQ6OmVuZGw7CisgIC8vICAgfQorCisgIC8vIGV4cGVjdGVkICsgbnVtYmVyIG9mIHRpbWVzdGFtcHMgKG9uZSBwZXIgbG9nIHN0YXRlbWVudCkgKyB0cmFpbGluZyBuZXdsaW5lIG9mIGxhc3Qgc3RhdGVtZW50CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoY29tcG9uZW50cy5zaXplKCksIE5fRVhQRUNURUQgKyAyICsgMSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb21wb25lbnRJdGVyID0gY29tcG9uZW50cy5iZWdpbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5fRVhQRUNURUQ7ICsraSkKKyAgICB7CisgICAgICAvLyB0aW1lc3RhbXAgTE9HX0xFVkVMOiBbTW9kdWxlTmFtZV0gbWVzc2FnZVxuCisKKyAgICAgIGNvbnN0IHN0cmluZyYgdGltZXN0YW1wID0gKmNvbXBvbmVudEl0ZXI7CisgICAgICAvLyBzdGQ6OmNvdXQgPDwgInRpbWVzdGFtcCA9ICIgPDwgdGltZXN0YW1wIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKworICAgICAgc2l6ZV90IHRpbWVEZWxpbWl0ZXJQb3NpdGlvbiA9IHRpbWVzdGFtcC5maW5kKCIuIik7CisKKyAgICAgIEJPT1NUX1JFUVVJUkVfTkUoc3RyaW5nOjpucG9zLCB0aW1lRGVsaW1pdGVyUG9zaXRpb24pOworCisgICAgICBzdHJpbmcgc2Vjb25kc1N0cmluZyA9IHRpbWVzdGFtcC5zdWJzdHIoMCwgdGltZURlbGltaXRlclBvc2l0aW9uKTsKKyAgICAgIHN0cmluZyB1c2Vjb25kc1N0cmluZyA9IHRpbWVzdGFtcC5zdWJzdHIodGltZURlbGltaXRlclBvc2l0aW9uICsgMSk7CisKKyAgICAgIG1pY3Jvc2Vjb25kczo6cmVwIGV4dHJhY3RlZFRpbWUgPQorICAgICAgICBPTkVfU0VDT05EICogYm9vc3Q6OmxleGljYWxfY2FzdDxtaWNyb3NlY29uZHM6OnJlcD4oc2Vjb25kc1N0cmluZykgKworICAgICAgICBib29zdDo6bGV4aWNhbF9jYXN0PG1pY3Jvc2Vjb25kczo6cmVwPih1c2Vjb25kc1N0cmluZyk7CisKKyAgICAgIC8vIHN0ZDo6Y291dCA8PCAiYmVmb3JlPSIgPDwgYmVmb3JlCisgICAgICAvLyAgICAgICAgICAgPDwgIiBleHRyYWN0ZWQ9IiA8PCBleHRyYWN0ZWRUaW1lCisgICAgICAvLyAgICAgICAgICAgPDwgIiBhZnRlcj0iIDw8IGFmdGVyIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgQk9PU1RfQ0hFQ0tfTEUoYmVmb3JlLCBleHRyYWN0ZWRUaW1lKTsKKyAgICAgIEJPT1NUX0NIRUNLX0xFKGV4dHJhY3RlZFRpbWUsIGFmdGVyKTsKKworICAgICAgLy8gTE9HX0xFVkVMOgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKmNvbXBvbmVudEl0ZXIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICAgICsraTsKKworICAgICAgLy8gW01vZHVsZU5hbWVdCisgICAgICBCT09TVF9DSEVDS19FUVVBTCgqY29tcG9uZW50SXRlciwgRVhQRUNURURbaV0pOworICAgICAgKytjb21wb25lbnRJdGVyOworICAgICAgKytpOworCisgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UgPSAqY29tcG9uZW50SXRlcjsKKworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJtZXNzYWdlID0gIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgLy8gYWRkIGJhY2sgdGhlIG5ld2xpbmUgdGhhdCB3ZSBzcGxpdCBvbgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSArICJcbiIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICB9Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVua25vd25Nb2R1bGUsIExvZ2dlckZpeHR1cmUpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBuZG46OnRpbWU7CisgIHVzaW5nIHN0ZDo6c3RyaW5nOworCisgIGNvbnN0IG5kbjo6dGltZTo6bWljcm9zZWNvbmRzOjpyZXAgT05FX1NFQ09ORCA9IDEwMDAwMDA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgTE9HX0NPTkZJRyA9CisgICAgImxvZ1xuIgorICAgICJ7XG4iCisgICAgIiAgZGVmYXVsdF9sZXZlbCBERUJVR1xuIgorICAgICIgIFRlc3RNYWRlVXBNb2R1bGUgSU5GT1xuIgorICAgICJ9XG4iOworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBMb2dnZXJGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLnNldERlZmF1bHRMZXZlbChMT0dfQUxMKTsKKyAgTG9nZ2VyRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgRVhQRUNURUQgPSAiREVCVUc6IFtMb2dnZXJGYWN0b3J5XSAiCisgICAgIkZhaWxlZCB0byBjb25maWd1cmUgbG9nZ2luZyBsZXZlbCBmb3IgbW9kdWxlIFwiVGVzdE1hZGVVcE1vZHVsZVwiIChtb2R1bGUgbm90IGZvdW5kKVxuIjsKKworICBtaWNyb3NlY29uZHM6OnJlcCBiZWZvcmUgPQorICAgIGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPihzeXN0ZW1fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKKworICBjb25maWcucGFyc2UoTE9HX0NPTkZJRywgZmFsc2UsICJMT0dfQ09ORklHIik7CisKKyAgbWljcm9zZWNvbmRzOjpyZXAgYWZ0ZXIgPQorICAgIGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPihzeXN0ZW1fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKKworICBjb25zdCBzdHJpbmcgYnVmZmVyID0gbV9idWZmZXIuc3RyKCk7CisKKyAgY29uc3Qgc2l6ZV90IGZpcnN0U3BhY2UgPSBidWZmZXIuZmluZCgiICIpOworICBCT09TVF9SRVFVSVJFKGZpcnN0U3BhY2UgIT0gc3RyaW5nOjpucG9zKTsKKworICBjb25zdCBzdHJpbmcgdGltZXN0YW1wID0gYnVmZmVyLnN1YnN0cigwLCBmaXJzdFNwYWNlKTsKKyAgY29uc3Qgc3RyaW5nIG1lc3NhZ2UgPSBidWZmZXIuc3Vic3RyKGZpcnN0U3BhY2UgKyAxKTsKKworICBzaXplX3QgdGltZURlbGltaXRlclBvc2l0aW9uID0gdGltZXN0YW1wLmZpbmQoIi4iKTsKKworICBCT09TVF9SRVFVSVJFX05FKHN0cmluZzo6bnBvcywgdGltZURlbGltaXRlclBvc2l0aW9uKTsKKworICBzdHJpbmcgc2Vjb25kc1N0cmluZyA9IHRpbWVzdGFtcC5zdWJzdHIoMCwgdGltZURlbGltaXRlclBvc2l0aW9uKTsKKyAgc3RyaW5nIHVzZWNvbmRzU3RyaW5nID0gdGltZXN0YW1wLnN1YnN0cih0aW1lRGVsaW1pdGVyUG9zaXRpb24gKyAxKTsKKworICBtaWNyb3NlY29uZHM6OnJlcCBleHRyYWN0ZWRUaW1lID0KKyAgICBPTkVfU0VDT05EICogYm9vc3Q6OmxleGljYWxfY2FzdDxtaWNyb3NlY29uZHM6OnJlcD4oc2Vjb25kc1N0cmluZykgKworICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bWljcm9zZWNvbmRzOjpyZXA+KHVzZWNvbmRzU3RyaW5nKTsKKworICAvLyBzdGQ6OmNvdXQgPDwgImJlZm9yZT0iIDw8IGJlZm9yZQorICAvLyAgICAgICAgICAgPDwgIiBleHRyYWN0ZWQ9IiA8PCBleHRyYWN0ZWRUaW1lCisgIC8vICAgICAgICAgICA8PCAiIGFmdGVyPSIgPDwgYWZ0ZXIgPDwgc3RkOjplbmRsOworCisgIEJPT1NUX0NIRUNLX0xFKGJlZm9yZSwgZXh0cmFjdGVkVGltZSk7CisgIEJPT1NUX0NIRUNLX0xFKGV4dHJhY3RlZFRpbWUsIGFmdGVyKTsKKworICBCT09TVF9DSEVDS19FUVVBTChtZXNzYWdlLCBFWFBFQ1RFRCk7Cit9CisKK3N0YXRpYyBib29sCitjaGVja0Vycm9yKGNvbnN0IExvZ2dlckZhY3Rvcnk6OkVycm9yJiBlcnJvciwgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkKQoreworICByZXR1cm4gZXJyb3Iud2hhdCgpID09IGV4cGVjdGVkOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShVbmtub3duTGV2ZWxTdHJpbmcsIExvZ2dlckZpeHR1cmUpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIExPR19DT05GSUcgPQorICAgICJsb2dcbiIKKyAgICAie1xuIgorICAgICIgIGRlZmF1bHRfbGV2ZWwgVGVzdE1hZGVVcExldmVsXG4iCisgICAgIn1cbiI7CisKKyAgQ29uZmlnRmlsZSBjb25maWc7CisgIExvZ2dlckZhY3Rvcnk6OmdldEluc3RhbmNlKCkuc2V0Q29uZmlnRmlsZShjb25maWcpOworCisgIEJPT1NUX1JFUVVJUkVfRVhDRVBUSU9OKGNvbmZpZy5wYXJzZShMT0dfQ09ORklHLCBmYWxzZSwgIkxPR19DT05GSUciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyRmFjdG9yeTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmNoZWNrRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGxvZ2dpbmcgbGV2ZWwgXCJUZXN0TWFkZVVwTGV2ZWxcIiIpKTsKK30KKworY2xhc3MgSW5DbGFzc0xvZ2dlciA6IHB1YmxpYyBMb2dnZXJGaXh0dXJlCit7CitwdWJsaWM6CisKKyAgSW5DbGFzc0xvZ2dlcigpCisgIHsKKyAgICBnX2xvZ2dlci5zZXRMb2dMZXZlbChMT0dfQUxMKTsKKyAgfQorCisgIHZvaWQKKyAgd3JpdGVMb2dzKCkKKyAgeworICAgIE5GRF9MT0dfVFJBQ0UoInRyYWNlLW1lc3NhZ2UtSkhHRkRTUl4xIik7CisgICAgTkZEX0xPR19ERUJVRygiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tIiA8PCAxNSA8PCAxNiA8PCAxNyk7CisgICAgTkZEX0xPR19XQVJOKCJ3YXJuaW5nLW1lc3NhZ2UtWFhYaGRoZDExIiA8PCAxIDw8IngiKTsKKyAgICBORkRfTE9HX0lORk8oImluZm8tbWVzc2FnZS1Kanhqc2hqMTMiKTsKKyAgICBORkRfTE9HX0VSUk9SKCJlcnJvci1tZXNzYWdlLSEjJCZeJSQjQCIpOworICAgIE5GRF9MT0dfRkFUQUwoImZhdGFsLW1lc3NhZ2UtSkpTamFhbWNuZyIpOworICB9CisKK3ByaXZhdGU6CisgIE5GRF9MT0dfSU5DTEFTU19ERUNMQVJFKCk7Cit9OworCitORkRfTE9HX0lOQ0xBU1NfREVGSU5FKEluQ2xhc3NMb2dnZXIsICJJbkNsYXNzTG9nZ2VyIik7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEluQ2xhc3MsIEluQ2xhc3NMb2dnZXIpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBuZG46OnRpbWU7CisgIHVzaW5nIHN0ZDo6c3RyaW5nOworCisgIGNvbnN0IG5kbjo6dGltZTo6bWljcm9zZWNvbmRzOjpyZXAgT05FX1NFQ09ORCA9IDEwMDAwMDA7CisKKyAgbWljcm9zZWNvbmRzOjpyZXAgYmVmb3JlID0KKyAgICBkdXJhdGlvbl9jYXN0PG1pY3Jvc2Vjb25kcz4oc3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisKKyAgd3JpdGVMb2dzKCk7CisKKyAgbWljcm9zZWNvbmRzOjpyZXAgYWZ0ZXIgPQorICAgIGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPihzeXN0ZW1fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKKworICBjb25zdCBzdHJpbmcgRVhQRUNURURbXSA9CisgICAgeworICAgICAgIlRSQUNFOiIsICAgIltJbkNsYXNzTG9nZ2VyXSIsICJ0cmFjZS1tZXNzYWdlLUpIR0ZEU1JeMVxuIiwKKyAgICAgICJERUJVRzoiLCAgICJbSW5DbGFzc0xvZ2dlcl0iLCAiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tMTUxNjE3XG4iLAorICAgICAgIldBUk5JTkc6IiwgIltJbkNsYXNzTG9nZ2VyXSIsICJ3YXJuaW5nLW1lc3NhZ2UtWFhYaGRoZDExMXhcbiIsCisgICAgICAiSU5GTzoiLCAgICAiW0luQ2xhc3NMb2dnZXJdIiwgImluZm8tbWVzc2FnZS1Kanhqc2hqMTNcbiIsCisgICAgICAiRVJST1I6IiwgICAiW0luQ2xhc3NMb2dnZXJdIiwgImVycm9yLW1lc3NhZ2UtISMkJl4lJCNAXG4iLAorICAgICAgIkZBVEFMOiIsICAgIltJbkNsYXNzTG9nZ2VyXSIsICJmYXRhbC1tZXNzYWdlLUpKU2phYW1jbmdcbiIsCisgICAgfTsKKworICBjb25zdCBzaXplX3QgTl9FWFBFQ1RFRCA9IHNpemVvZihFWFBFQ1RFRCkgLyBzaXplb2Yoc3RyaW5nKTsKKworICBjb25zdCBzdHJpbmcgYnVmZmVyID0gbV9idWZmZXIuc3RyKCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RyaW5nPiBjb21wb25lbnRzOworICBib29zdDo6c3BsaXQoY29tcG9uZW50cywgYnVmZmVyLCBib29zdDo6aXNfYW55X29mKCIgLFxuIikpOworCisgIC8vIGV4cGVjdGVkICsgbnVtYmVyIG9mIHRpbWVzdGFtcHMgKG9uZSBwZXIgbG9nIHN0YXRlbWVudCkgKyB0cmFpbGluZyBuZXdsaW5lIG9mIGxhc3Qgc3RhdGVtZW50CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoY29tcG9uZW50cy5zaXplKCksIE5fRVhQRUNURUQgKyA2ICsgMSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb21wb25lbnRJdGVyID0gY29tcG9uZW50cy5iZWdpbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5fRVhQRUNURUQ7ICsraSkKKyAgICB7CisgICAgICAvLyB0aW1lc3RhbXAgTE9HX0xFVkVMOiBbTW9kdWxlTmFtZV0gbWVzc2FnZVxuCisKKyAgICAgIGNvbnN0IHN0cmluZyYgdGltZXN0YW1wID0gKmNvbXBvbmVudEl0ZXI7CisgICAgICAvLyBzdGQ6OmNvdXQgPDwgInRpbWVzdGFtcCA9ICIgPDwgdGltZXN0YW1wIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKworICAgICAgc2l6ZV90IHRpbWVEZWxpbWl0ZXJQb3NpdGlvbiA9IHRpbWVzdGFtcC5maW5kKCIuIik7CisKKyAgICAgIEJPT1NUX1JFUVVJUkVfTkUoc3RyaW5nOjpucG9zLCB0aW1lRGVsaW1pdGVyUG9zaXRpb24pOworCisgICAgICBzdHJpbmcgc2Vjb25kc1N0cmluZyA9IHRpbWVzdGFtcC5zdWJzdHIoMCwgdGltZURlbGltaXRlclBvc2l0aW9uKTsKKyAgICAgIHN0cmluZyB1c2Vjb25kc1N0cmluZyA9IHRpbWVzdGFtcC5zdWJzdHIodGltZURlbGltaXRlclBvc2l0aW9uICsgMSk7CisKKyAgICAgIG1pY3Jvc2Vjb25kczo6cmVwIGV4dHJhY3RlZFRpbWUgPQorICAgICAgICBPTkVfU0VDT05EICogYm9vc3Q6OmxleGljYWxfY2FzdDxtaWNyb3NlY29uZHM6OnJlcD4oc2Vjb25kc1N0cmluZykgKworICAgICAgICBib29zdDo6bGV4aWNhbF9jYXN0PG1pY3Jvc2Vjb25kczo6cmVwPih1c2Vjb25kc1N0cmluZyk7CisKKyAgICAgIC8vIHN0ZDo6Y291dCA8PCAiYmVmb3JlPSIgPDwgYmVmb3JlCisgICAgICAvLyAgICAgICAgICAgPDwgIiBleHRyYWN0ZWQ9IiA8PCBleHRyYWN0ZWRUaW1lCisgICAgICAvLyAgICAgICAgICAgPDwgIiBhZnRlcj0iIDw8IGFmdGVyIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgQk9PU1RfQ0hFQ0tfTEUoYmVmb3JlLCBleHRyYWN0ZWRUaW1lKTsKKyAgICAgIEJPT1NUX0NIRUNLX0xFKGV4dHJhY3RlZFRpbWUsIGFmdGVyKTsKKworICAgICAgLy8gTE9HX0xFVkVMOgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKmNvbXBvbmVudEl0ZXIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICAgICsraTsKKworICAgICAgLy8gW01vZHVsZU5hbWVdCisgICAgICBCT09TVF9DSEVDS19FUVVBTCgqY29tcG9uZW50SXRlciwgRVhQRUNURURbaV0pOworICAgICAgKytjb21wb25lbnRJdGVyOworICAgICAgKytpOworCisgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UgPSAqY29tcG9uZW50SXRlcjsKKworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJtZXNzYWdlID0gIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgLy8gYWRkIGJhY2sgdGhlIG5ld2xpbmUgdGhhdCB3ZSBzcGxpdCBvbgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSArICJcbiIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICB9Cit9CisKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIEluQ2xhc3NUZW1wbGF0ZUxvZ2dlciA6IHB1YmxpYyBMb2dnZXJGaXh0dXJlCit7CitwdWJsaWM6CisgIEluQ2xhc3NUZW1wbGF0ZUxvZ2dlcigpCisgIHsKKyAgICBnX2xvZ2dlci5zZXRMb2dMZXZlbChMT0dfQUxMKTsKKyAgfQorCisgIHZvaWQKKyAgd3JpdGVMb2dzKCkKKyAgeworICAgIE5GRF9MT0dfVFJBQ0UoInRyYWNlLW1lc3NhZ2UtSkhHRkRTUl4xIik7CisgICAgTkZEX0xPR19ERUJVRygiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tIiA8PCAxNSA8PCAxNiA8PCAxNyk7CisgICAgTkZEX0xPR19XQVJOKCJ3YXJuaW5nLW1lc3NhZ2UtWFhYaGRoZDExIiA8PCAxIDw8IngiKTsKKyAgICBORkRfTE9HX0lORk8oImluZm8tbWVzc2FnZS1Kanhqc2hqMTMiKTsKKyAgICBORkRfTE9HX0VSUk9SKCJlcnJvci1tZXNzYWdlLSEjJCZeJSQjQCIpOworICAgIE5GRF9MT0dfRkFUQUwoImZhdGFsLW1lc3NhZ2UtSkpTamFhbWNuZyIpOworICB9CisKK3ByaXZhdGU6CisgIE5GRF9MT0dfSU5DTEFTU19ERUNMQVJFKCk7Cit9OworCitORkRfTE9HX0lOQ0xBU1NfVEVNUExBVEVfREVGSU5FKEluQ2xhc3NUZW1wbGF0ZUxvZ2dlciwgIkdlbmVyaWNJbkNsYXNzVGVtcGxhdGVMb2dnZXIiKTsKK05GRF9MT0dfSU5DTEFTU19URU1QTEFURV9TUEVDSUFMSVpBVElPTl9ERUZJTkUoSW5DbGFzc1RlbXBsYXRlTG9nZ2VyLCBpbnQsICJJbnRJbkNsYXNzTG9nZ2VyIik7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEdlbmVyaWNJblRlbXBsYXRlZENsYXNzLCBJbkNsYXNzVGVtcGxhdGVMb2dnZXI8Ym9vbD4pCit7CisgIHVzaW5nIG5hbWVzcGFjZSBuZG46OnRpbWU7CisgIHVzaW5nIHN0ZDo6c3RyaW5nOworCisgIGNvbnN0IG5kbjo6dGltZTo6bWljcm9zZWNvbmRzOjpyZXAgT05FX1NFQ09ORCA9IDEwMDAwMDA7CisKKyAgbWljcm9zZWNvbmRzOjpyZXAgYmVmb3JlID0KKyAgICBkdXJhdGlvbl9jYXN0PG1pY3Jvc2Vjb25kcz4oc3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisKKyAgd3JpdGVMb2dzKCk7CisKKyAgbWljcm9zZWNvbmRzOjpyZXAgYWZ0ZXIgPQorICAgIGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPihzeXN0ZW1fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKKworICBjb25zdCBzdHJpbmcgRVhQRUNURURbXSA9CisgICAgeworICAgICAgIlRSQUNFOiIsICAgIltHZW5lcmljSW5DbGFzc1RlbXBsYXRlTG9nZ2VyXSIsICJ0cmFjZS1tZXNzYWdlLUpIR0ZEU1JeMVxuIiwKKyAgICAgICJERUJVRzoiLCAgICJbR2VuZXJpY0luQ2xhc3NUZW1wbGF0ZUxvZ2dlcl0iLCAiZGVidWctbWVzc2FnZS1JR2cyNDc0ZmRrc2QtZm8tMTUxNjE3XG4iLAorICAgICAgIldBUk5JTkc6IiwgIltHZW5lcmljSW5DbGFzc1RlbXBsYXRlTG9nZ2VyXSIsICJ3YXJuaW5nLW1lc3NhZ2UtWFhYaGRoZDExMXhcbiIsCisgICAgICAiSU5GTzoiLCAgICAiW0dlbmVyaWNJbkNsYXNzVGVtcGxhdGVMb2dnZXJdIiwgImluZm8tbWVzc2FnZS1Kanhqc2hqMTNcbiIsCisgICAgICAiRVJST1I6IiwgICAiW0dlbmVyaWNJbkNsYXNzVGVtcGxhdGVMb2dnZXJdIiwgImVycm9yLW1lc3NhZ2UtISMkJl4lJCNAXG4iLAorICAgICAgIkZBVEFMOiIsICAgIltHZW5lcmljSW5DbGFzc1RlbXBsYXRlTG9nZ2VyXSIsICJmYXRhbC1tZXNzYWdlLUpKU2phYW1jbmdcbiIsCisgICAgfTsKKworICBjb25zdCBzaXplX3QgTl9FWFBFQ1RFRCA9IHNpemVvZihFWFBFQ1RFRCkgLyBzaXplb2Yoc3RyaW5nKTsKKworICBjb25zdCBzdHJpbmcgYnVmZmVyID0gbV9idWZmZXIuc3RyKCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RyaW5nPiBjb21wb25lbnRzOworICBib29zdDo6c3BsaXQoY29tcG9uZW50cywgYnVmZmVyLCBib29zdDo6aXNfYW55X29mKCIgLFxuIikpOworCisgIC8vIGV4cGVjdGVkICsgbnVtYmVyIG9mIHRpbWVzdGFtcHMgKG9uZSBwZXIgbG9nIHN0YXRlbWVudCkgKyB0cmFpbGluZyBuZXdsaW5lIG9mIGxhc3Qgc3RhdGVtZW50CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoY29tcG9uZW50cy5zaXplKCksIE5fRVhQRUNURUQgKyA2ICsgMSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb21wb25lbnRJdGVyID0gY29tcG9uZW50cy5iZWdpbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5fRVhQRUNURUQ7ICsraSkKKyAgICB7CisgICAgICAvLyB0aW1lc3RhbXAgTE9HX0xFVkVMOiBbTW9kdWxlTmFtZV0gbWVzc2FnZVxuCisKKyAgICAgIGNvbnN0IHN0cmluZyYgdGltZXN0YW1wID0gKmNvbXBvbmVudEl0ZXI7CisgICAgICAvLyBzdGQ6OmNvdXQgPDwgInRpbWVzdGFtcCA9ICIgPDwgdGltZXN0YW1wIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKworICAgICAgc2l6ZV90IHRpbWVEZWxpbWl0ZXJQb3NpdGlvbiA9IHRpbWVzdGFtcC5maW5kKCIuIik7CisKKyAgICAgIEJPT1NUX1JFUVVJUkVfTkUoc3RyaW5nOjpucG9zLCB0aW1lRGVsaW1pdGVyUG9zaXRpb24pOworCisgICAgICBzdHJpbmcgc2Vjb25kc1N0cmluZyA9IHRpbWVzdGFtcC5zdWJzdHIoMCwgdGltZURlbGltaXRlclBvc2l0aW9uKTsKKyAgICAgIHN0cmluZyB1c2Vjb25kc1N0cmluZyA9IHRpbWVzdGFtcC5zdWJzdHIodGltZURlbGltaXRlclBvc2l0aW9uICsgMSk7CisKKyAgICAgIG1pY3Jvc2Vjb25kczo6cmVwIGV4dHJhY3RlZFRpbWUgPQorICAgICAgICBPTkVfU0VDT05EICogYm9vc3Q6OmxleGljYWxfY2FzdDxtaWNyb3NlY29uZHM6OnJlcD4oc2Vjb25kc1N0cmluZykgKworICAgICAgICBib29zdDo6bGV4aWNhbF9jYXN0PG1pY3Jvc2Vjb25kczo6cmVwPih1c2Vjb25kc1N0cmluZyk7CisKKyAgICAgIC8vIHN0ZDo6Y291dCA8PCAiYmVmb3JlPSIgPDwgYmVmb3JlCisgICAgICAvLyAgICAgICAgICAgPDwgIiBleHRyYWN0ZWQ9IiA8PCBleHRyYWN0ZWRUaW1lCisgICAgICAvLyAgICAgICAgICAgPDwgIiBhZnRlcj0iIDw8IGFmdGVyIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgQk9PU1RfQ0hFQ0tfTEUoYmVmb3JlLCBleHRyYWN0ZWRUaW1lKTsKKyAgICAgIEJPT1NUX0NIRUNLX0xFKGV4dHJhY3RlZFRpbWUsIGFmdGVyKTsKKworICAgICAgLy8gTE9HX0xFVkVMOgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKmNvbXBvbmVudEl0ZXIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICAgICsraTsKKworICAgICAgLy8gW01vZHVsZU5hbWVdCisgICAgICBCT09TVF9DSEVDS19FUVVBTCgqY29tcG9uZW50SXRlciwgRVhQRUNURURbaV0pOworICAgICAgKytjb21wb25lbnRJdGVyOworICAgICAgKytpOworCisgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UgPSAqY29tcG9uZW50SXRlcjsKKworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJtZXNzYWdlID0gIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgLy8gYWRkIGJhY2sgdGhlIG5ld2xpbmUgdGhhdCB3ZSBzcGxpdCBvbgorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSArICJcbiIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICB9Cit9CisKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoU3BlY2lhbGl6ZWRJblRlbXBsYXRlZENsYXNzLCBJbkNsYXNzVGVtcGxhdGVMb2dnZXI8aW50PikKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIG5kbjo6dGltZTsKKyAgdXNpbmcgc3RkOjpzdHJpbmc7CisKKyAgY29uc3QgbmRuOjp0aW1lOjptaWNyb3NlY29uZHM6OnJlcCBPTkVfU0VDT05EID0gMTAwMDAwMDsKKworICBtaWNyb3NlY29uZHM6OnJlcCBiZWZvcmUgPQorICAgIGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPihzeXN0ZW1fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKKworICB3cml0ZUxvZ3MoKTsKKworICBtaWNyb3NlY29uZHM6OnJlcCBhZnRlciA9CisgICAgZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgIGNvbnN0IHN0cmluZyBFWFBFQ1RFRFtdID0KKyAgICB7CisgICAgICAiVFJBQ0U6IiwgICAiW0ludEluQ2xhc3NMb2dnZXJdIiwgInRyYWNlLW1lc3NhZ2UtSkhHRkRTUl4xXG4iLAorICAgICAgIkRFQlVHOiIsICAgIltJbnRJbkNsYXNzTG9nZ2VyXSIsICJkZWJ1Zy1tZXNzYWdlLUlHZzI0NzRmZGtzZC1mby0xNTE2MTdcbiIsCisgICAgICAiV0FSTklORzoiLCAiW0ludEluQ2xhc3NMb2dnZXJdIiwgIndhcm5pbmctbWVzc2FnZS1YWFhoZGhkMTExeFxuIiwKKyAgICAgICJJTkZPOiIsICAgICJbSW50SW5DbGFzc0xvZ2dlcl0iLCAiaW5mby1tZXNzYWdlLUpqeGpzaGoxM1xuIiwKKyAgICAgICJFUlJPUjoiLCAgICJbSW50SW5DbGFzc0xvZ2dlcl0iLCAiZXJyb3ItbWVzc2FnZS0hIyQmXiUkI0BcbiIsCisgICAgICAiRkFUQUw6IiwgICAiW0ludEluQ2xhc3NMb2dnZXJdIiwgImZhdGFsLW1lc3NhZ2UtSkpTamFhbWNuZ1xuIiwKKyAgICB9OworCisgIGNvbnN0IHNpemVfdCBOX0VYUEVDVEVEID0gc2l6ZW9mKEVYUEVDVEVEKSAvIHNpemVvZihzdHJpbmcpOworCisgIGNvbnN0IHN0cmluZyBidWZmZXIgPSBtX2J1ZmZlci5zdHIoKTsKKworICBzdGQ6OnZlY3RvcjxzdHJpbmc+IGNvbXBvbmVudHM7CisgIGJvb3N0OjpzcGxpdChjb21wb25lbnRzLCBidWZmZXIsIGJvb3N0Ojppc19hbnlfb2YoIiAsXG4iKSk7CisKKyAgLy8gZXhwZWN0ZWQgKyBudW1iZXIgb2YgdGltZXN0YW1wcyAob25lIHBlciBsb2cgc3RhdGVtZW50KSArIHRyYWlsaW5nIG5ld2xpbmUgb2YgbGFzdCBzdGF0ZW1lbnQKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChjb21wb25lbnRzLnNpemUoKSwgTl9FWFBFQ1RFRCArIDYgKyAxKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbXBvbmVudEl0ZXIgPSBjb21wb25lbnRzLmJlZ2luKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTl9FWFBFQ1RFRDsgKytpKQorICAgIHsKKyAgICAgIC8vIHRpbWVzdGFtcCBMT0dfTEVWRUw6IFtNb2R1bGVOYW1lXSBtZXNzYWdlXG4KKworICAgICAgY29uc3Qgc3RyaW5nJiB0aW1lc3RhbXAgPSAqY29tcG9uZW50SXRlcjsKKyAgICAgIC8vIHN0ZDo6Y291dCA8PCAidGltZXN0YW1wID0gIiA8PCB0aW1lc3RhbXAgPDwgc3RkOjplbmRsOworICAgICAgKytjb21wb25lbnRJdGVyOworCisgICAgICBzaXplX3QgdGltZURlbGltaXRlclBvc2l0aW9uID0gdGltZXN0YW1wLmZpbmQoIi4iKTsKKworICAgICAgQk9PU1RfUkVRVUlSRV9ORShzdHJpbmc6Om5wb3MsIHRpbWVEZWxpbWl0ZXJQb3NpdGlvbik7CisKKyAgICAgIHN0cmluZyBzZWNvbmRzU3RyaW5nID0gdGltZXN0YW1wLnN1YnN0cigwLCB0aW1lRGVsaW1pdGVyUG9zaXRpb24pOworICAgICAgc3RyaW5nIHVzZWNvbmRzU3RyaW5nID0gdGltZXN0YW1wLnN1YnN0cih0aW1lRGVsaW1pdGVyUG9zaXRpb24gKyAxKTsKKworICAgICAgbWljcm9zZWNvbmRzOjpyZXAgZXh0cmFjdGVkVGltZSA9CisgICAgICAgIE9ORV9TRUNPTkQgKiBib29zdDo6bGV4aWNhbF9jYXN0PG1pY3Jvc2Vjb25kczo6cmVwPihzZWNvbmRzU3RyaW5nKSArCisgICAgICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bWljcm9zZWNvbmRzOjpyZXA+KHVzZWNvbmRzU3RyaW5nKTsKKworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJiZWZvcmU9IiA8PCBiZWZvcmUgPDwgIiBleHRyYWN0ZWQ9IiA8PCBleHRyYWN0ZWRUaW1lIDw8ICIgYWZ0ZXI9IiA8PCBhZnRlciA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIEJPT1NUX0NIRUNLX0xFKGJlZm9yZSwgZXh0cmFjdGVkVGltZSk7CisgICAgICBCT09TVF9DSEVDS19MRShleHRyYWN0ZWRUaW1lLCBhZnRlcik7CisKKyAgICAgIC8vIExPR19MRVZFTDoKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCpjb21wb25lbnRJdGVyLCBFWFBFQ1RFRFtpXSk7CisgICAgICArK2NvbXBvbmVudEl0ZXI7CisgICAgICArK2k7CisKKyAgICAgIC8vIFtNb2R1bGVOYW1lXQorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKmNvbXBvbmVudEl0ZXIsIEVYUEVDVEVEW2ldKTsKKyAgICAgICsrY29tcG9uZW50SXRlcjsKKyAgICAgICsraTsKKworICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlID0gKmNvbXBvbmVudEl0ZXI7CisKKyAgICAgIC8vIHN0ZDo6Y291dCA8PCAibWVzc2FnZSA9ICIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIC8vIGFkZCBiYWNrIHRoZSBuZXdsaW5lIHRoYXQgd2Ugc3BsaXQgb24KKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKG1lc3NhZ2UgKyAiXG4iLCBFWFBFQ1RFRFtpXSk7CisgICAgICArK2NvbXBvbmVudEl0ZXI7CisgICAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2NvcmUvbmRlYnVnLmNwcCBiL05GRC90ZXN0cy9jb3JlL25kZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNjljOQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9jb3JlL25kZWJ1Zy5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZG4geworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKENvcmVOZGVidWcpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFzc2VydEZhbHNlKQoreworI2lmbmRlZiBfREVCVUcKKyAgLy8gaW4gcmVsZWFzZSBidWlsZHMsIGFzc2VydGlvbiBzaG91bGRuJ3QgZXhlY3V0ZQorICBCT09TVF9BU1NFUlQoZmFsc2UpOworI2VuZGlmCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNpZGVFZmZlY3QpCit7CisgIGludCBhID0gMTsKKyAgQk9PU1RfQVNTRVJUKChhID0gMikgPiAwKTsKKyNpZmRlZiBfREVCVUcKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYSwgMik7CisjZWxzZQorICBCT09TVF9DSEVDS19FUVVBTChhLCAxKTsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5kbgpkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2NvcmUvbmV0d29yay1pbnRlcmZhY2UuY3BwIGIvTkZEL3Rlc3RzL2NvcmUvbmV0d29yay1pbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNmQ0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvY29yZS9uZXR3b3JrLWludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJjb3JlL25ldHdvcmstaW50ZXJmYWNlLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKENvcmVOZXR3b3JrSW50ZXJmYWNlLCBCYXNlRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoTGlzdFJlYWxOZXR3b3JrSW50ZXJmYWNlcykKK3sKKyAgc3RkOjp2ZWN0b3I8TmV0d29ya0ludGVyZmFjZUluZm8+IG5ldGlmczsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1cobmV0aWZzID0gbGlzdE5ldHdvcmtJbnRlcmZhY2VzKCkpOworCisgIGZvciAoY29uc3QgYXV0byYgbmV0aWYgOiBuZXRpZnMpIHsKKyAgICBCT09TVF9URVNUX01FU1NBR0UobmV0aWYuaW5kZXggPDwgIjogIiA8PCBuZXRpZi5uYW1lKTsKKyAgICBCT09TVF9URVNUX01FU1NBR0UoIlx0ZXRoZXIgIiA8PCBuZXRpZi5ldGhlckFkZHJlc3MpOworICAgIGZvciAoY29uc3QgYXV0byYgYWRkcmVzcyA6IG5ldGlmLmlwdjRBZGRyZXNzZXMpCisgICAgICBCT09TVF9URVNUX01FU1NBR0UoIlx0aW5ldCAgIiA8PCBhZGRyZXNzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFkZHJlc3MgOiBuZXRpZi5pcHY2QWRkcmVzc2VzKQorICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCJcdGluZXQ2ICIgPDwgYWRkcmVzcyk7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCJcdGxvb3BiYWNrICA6ICIgPDwgbmV0aWYuaXNMb29wYmFjaygpKTsKKyAgICBCT09TVF9URVNUX01FU1NBR0UoIlx0bXVsdGljYXN0IDogIiA8PCBuZXRpZi5pc011bHRpY2FzdENhcGFibGUoKSk7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCJcdHVwICAgICAgICA6ICIgPDwgbmV0aWYuaXNVcCgpKTsKKyAgfQorfQorCitjbGFzcyBGYWtlTmV0d29ya0ludGVyZmFjZUZpeHR1cmUgOiBwdWJsaWMgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgRmFrZU5ldHdvcmtJbnRlcmZhY2VGaXh0dXJlKCkKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6YXNpbzo6aXA7CisKKyAgICBhdXRvIGZha2VJbnRlcmZhY2VzID0gbWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8TmV0d29ya0ludGVyZmFjZUluZm8+PigpOworCisgICAgZmFrZUludGVyZmFjZXMtPnB1c2hfYmFjaygKKyAgICAgIE5ldHdvcmtJbnRlcmZhY2VJbmZvIHswLCAibG8wIiwKKyAgICAgICAgZXRoZXJuZXQ6OkFkZHJlc3MoKSwKKyAgICAgICAge2FkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxMjcuMC4wLjEiKX0sCisgICAgICAgIHthZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZygiZmU4MDo6MSIpfSwKKyAgICAgICAgYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjEyNy4yNTUuMjU1LjI1NSIpLAorICAgICAgICBJRkZfTE9PUEJBQ0sgfCBJRkZfVVB9KTsKKyAgICBmYWtlSW50ZXJmYWNlcy0+cHVzaF9iYWNrKAorICAgICAgTmV0d29ya0ludGVyZmFjZUluZm8gezEsICJldGgwIiwKKyAgICAgICAgZXRoZXJuZXQ6OkFkZHJlc3M6OmZyb21TdHJpbmcoIjNlOjE1OmMyOjhiOjY1OjAwIiksCisgICAgICAgIHthZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTkyLjE2OC4yLjEiKX0sCisgICAgICAgIHt9LAorICAgICAgICBhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTkyLjE2OC4yLjI1NSIpLAorICAgICAgICAwfSk7CisgICAgZmFrZUludGVyZmFjZXMtPnB1c2hfYmFjaygKKyAgICAgIE5ldHdvcmtJbnRlcmZhY2VJbmZvIHsyLCAiZXRoMSIsCisgICAgICAgIGV0aGVybmV0OjpBZGRyZXNzOjpmcm9tU3RyaW5nKCIzZToxNTpjMjo4Yjo2NTowMCIpLAorICAgICAgICB7YWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5OC41MS4xMDAuMSIpfSwKKyAgICAgICAge2FkZHJlc3NfdjY6OmZyb21fc3RyaW5nKCIyMDAxOmRiODo6MSIpfSwKKyAgICAgICAgYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5OC41MS4xMDAuMjU1IiksCisgICAgICAgIElGRl9NVUxUSUNBU1QgfCBJRkZfQlJPQURDQVNUIHwgSUZGX1VQfSk7CisKKyAgICBzZXREZWJ1Z05ldHdvcmtJbnRlcmZhY2VzKGZha2VJbnRlcmZhY2VzKTsKKyAgfQorCisgIH5GYWtlTmV0d29ya0ludGVyZmFjZUZpeHR1cmUoKQorICB7CisgICAgc2V0RGVidWdOZXR3b3JrSW50ZXJmYWNlcyhudWxscHRyKTsKKyAgfQorfTsKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoTGlzdEZha2VOZXR3b3JrSW50ZXJmYWNlcywgRmFrZU5ldHdvcmtJbnRlcmZhY2VGaXh0dXJlKQoreworICBzdGQ6OnZlY3RvcjxOZXR3b3JrSW50ZXJmYWNlSW5mbz4gbmV0aWZzOworICBCT09TVF9DSEVDS19OT19USFJPVyhuZXRpZnMgPSBsaXN0TmV0d29ya0ludGVyZmFjZXMoKSk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChuZXRpZnMuc2l6ZSgpLCAzKTsKKworICBCT09TVF9DSEVDS19FUVVBTChuZXRpZnNbMF0uaW5kZXgsIDApOworICBCT09TVF9DSEVDS19FUVVBTChuZXRpZnNbMV0uaW5kZXgsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChuZXRpZnNbMl0uaW5kZXgsIDIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG5ldGlmc1swXS5uYW1lLCAibG8wIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5ldGlmc1sxXS5uYW1lLCAiZXRoMCIpOworICBCT09TVF9DSEVDS19FUVVBTChuZXRpZnNbMl0ubmFtZSwgImV0aDEiKTsKKworICAvLyBubyByZWFsIHZhbHVlIG9mIHRlc3Rpbmcgb3RoZXIgcGFyYW1ldGVycworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2NvcmUvbmV0d29yay5jcHAgYi9ORkQvdGVzdHMvY29yZS9uZXR3b3JrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZkMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2NvcmUvbmV0d29yay5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJjb3JlL25ldHdvcmsuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShDb3JlTmV0d29yaywgQmFzZUZpeHR1cmUpCisKK3VzaW5nIGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzczsKKworQk9PU1RfQVVUT19URVNUX0NBU0UoRW1wdHkpCit7CisgIE5ldHdvcmsgbjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMTkyLjAuMi4xIikpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjNmOTowOjMwMjU6Y2NjNTplZWViOjg2ZDMiKSksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCIwLjAuMC4xIikpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjI1NS4yNTUuMjU1LjI1NSIpKSwgZmFsc2UpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjo6IikpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoImZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZiIpKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNYXhSYW5nZVY0KQoreworICBOZXR3b3JrIG4gPSBOZXR3b3JrOjpnZXRNYXhSYW5nZVY0KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjE5Mi4wLjIuMSIpKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjNmOToxOjMwMjU6Y2NjNTplZWViOjg2ZDMiKSksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCIwLjAuMC4xIikpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMjU1LjI1NS4yNTUuMjU1IikpLCB0cnVlKTsKKworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCI6OiIpKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCJmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmYiKSksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmFuZ2VWNCkKK3sKKyAgTmV0d29yayBuID0gYm9vc3Q6OmxleGljYWxfY2FzdDxOZXR3b3JrPigiMTkyLjAuMi4wLzI0Iik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG4pLCAiMTkyLjAuMi4wIDwtPiAxOTIuMC4yLjI1NSIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjE5Mi4wLjIuMSIpKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjE5Mi4wLjIuMjU0IikpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMTkyLjAuMS4yNTUiKSksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMTkyLjAuMy4wIikpLCBmYWxzZSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMjAwMTpkYjg6M2Y5OjE6MzAyNTpjY2M1OmVlZWI6ODZkMyIpKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjAuMC4wLjEiKSksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMjU1LjI1NS4yNTUuMjU1IikpLCBmYWxzZSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiOjoiKSksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmIikpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1heFJhbmdlVjYpCit7CisgIE5ldHdvcmsgbiA9IE5ldHdvcms6OmdldE1heFJhbmdlVjYoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMTkyLjAuMi4xIikpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjNmOToxOjMwMjU6Y2NjNTplZWViOjg2ZDMiKSksCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjAuMC4wLjEiKSksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMjU1LjI1NS4yNTUuMjU1IikpLCBmYWxzZSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiOjoiKSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCJmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmYiKSksCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShSYW5nZVY2KQoreworICBOZXR3b3JrIG4gPSBib29zdDo6bGV4aWNhbF9jYXN0PE5ldHdvcms+KCIyMDAxOmRiODozZjk6MTo6LzY0Iik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG4pLAorICAgICAgICAgICAgICAgICAgICAiMjAwMTpkYjg6M2Y5OjE6OiA8LT4gMjAwMTpkYjg6M2Y5OjE6ZmZmZjpmZmZmOmZmZmY6ZmZmZiIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjE5Mi4wLjIuMSIpKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCIyMDAxOmRiODozZjk6MTozMDI1OmNjYzU6ZWVlYjo4NmQzIikpLAorICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobi5kb2VzQ29udGFpbihhZGRyZXNzOjpmcm9tX3N0cmluZygiMjAwMTpkYjg6M2Y5OjE6OiIpKSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjNmOToxOmZmZmY6ZmZmZjpmZmZmOmZmZmYiKSksCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCIyMDAxOmRiODozZjk6MDpmZmZmOmZmZmY6ZmZmZjpmZmZmIikpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjNmOToyOjoiKSksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICBCT09TVF9DSEVDS19FUVVBTChuLmRvZXNDb250YWluKGFkZHJlc3M6OmZyb21fc3RyaW5nKCIwLjAuMC4xIikpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjI1NS4yNTUuMjU1LjI1NSIpKSwgZmFsc2UpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoIjo6IikpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG4uZG9lc0NvbnRhaW4oYWRkcmVzczo6ZnJvbV9zdHJpbmcoImZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZiIpKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDb21wYXJpc29ucykKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYm9vc3Q6OmxleGljYWxfY2FzdDxOZXR3b3JrPigiMTkyLjAuMi4wLzI0IiksCisgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8TmV0d29yaz4oIjE5Mi4wLjIuMTI3LzI0IikpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8TmV0d29yaz4oIjIwMDE6ZGI4OjNmOTowOjovNjQiKSwKKyAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmxleGljYWxfY2FzdDxOZXR3b3JrPigiMjAwMTpkYjg6M2Y5OjA6ZmZmZjo6LzY0IikpOworCisgIEJPT1NUX0NIRUNLX05FKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8TmV0d29yaz4oIjE5Mi4wLjIuMC8yNCIpLAorICAgICAgICAgICAgICAgICBib29zdDo6bGV4aWNhbF9jYXN0PE5ldHdvcms+KCIxOTIuMC4zLjEyNy8yNCIpKTsKKworICBCT09TVF9DSEVDS19ORShib29zdDo6bGV4aWNhbF9jYXN0PE5ldHdvcms+KCIyMDAxOmRiODozZjk6MDo6LzY0IiksCisgICAgICAgICAgICAgICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8TmV0d29yaz4oIjIwMDE6ZGI4OjNmOToxOjovNjQiKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTkUoYm9vc3Q6OmxleGljYWxfY2FzdDxOZXR3b3JrPigiMTkyLjAuMi4wLzI0IiksCisgICAgICAgICAgICAgICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8TmV0d29yaz4oIjIwMDE6ZGI4OjNmOTowOjovNjQiKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKSAvLyBDb3JlTmV0d29yaworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvY29yZS9ub3RpZmljYXRpb24tc3RyZWFtLmNwcCBiL05GRC90ZXN0cy9jb3JlL25vdGlmaWNhdGlvbi1zdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzE0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvY29yZS9ub3RpZmljYXRpb24tc3RyZWFtLmNwcApAQCAtMCwwICsxLDY4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiY29yZS9ub3RpZmljYXRpb24tc3RyZWFtLmhwcCIKKyNpbmNsdWRlICJzaW1wbGUtbm90aWZpY2F0aW9uLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvZHVtbXktY2xpZW50LWZhY2UuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShDb3JlTm90aWZpY2F0aW9uU3RyZWFtLCBCYXNlRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoUG9zdCkKK3sKKyAgc2hhcmVkX3B0cjxuZG46OnV0aWw6OkR1bW15Q2xpZW50RmFjZT4gZmFjZSA9IG5kbjo6dXRpbDo6bWFrZUR1bW15Q2xpZW50RmFjZSgpOworICBuZG46OktleUNoYWluIGtleUNoYWluOworICBOb3RpZmljYXRpb25TdHJlYW08bmRuOjp1dGlsOjpEdW1teUNsaWVudEZhY2U+IG5vdGlmaWNhdGlvblN0cmVhbSgqZmFjZSwKKyAgICAiL2xvY2FsaG9zdC9uZmQvTm90aWZpY2F0aW9uU3RyZWFtVGVzdCIsIGtleUNoYWluKTsKKworICBTaW1wbGVOb3RpZmljYXRpb24gZXZlbnQxKCJtc2cxIik7CisgIG5vdGlmaWNhdGlvblN0cmVhbS5wb3N0Tm90aWZpY2F0aW9uKGV2ZW50MSk7CisgIGZhY2UtPnByb2Nlc3NFdmVudHMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50RGF0YXMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS0+c2VudERhdGFzWzBdLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL05vdGlmaWNhdGlvblN0cmVhbVRlc3QvJUZFJTAwIik7CisgIFNpbXBsZU5vdGlmaWNhdGlvbiBkZWNvZGVkMTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coZGVjb2RlZDEud2lyZURlY29kZShmYWNlLT5zZW50RGF0YXNbMF0uZ2V0Q29udGVudCgpLmJsb2NrRnJvbVZhbHVlKCkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGVjb2RlZDEuZ2V0TWVzc2FnZSgpLCAibXNnMSIpOworCisgIFNpbXBsZU5vdGlmaWNhdGlvbiBldmVudDIoIm1zZzIiKTsKKyAgbm90aWZpY2F0aW9uU3RyZWFtLnBvc3ROb3RpZmljYXRpb24oZXZlbnQyKTsKKyAgZmFjZS0+cHJvY2Vzc0V2ZW50cygpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnREYXRhcy5zaXplKCksIDIpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLT5zZW50RGF0YXNbMV0uZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvTm90aWZpY2F0aW9uU3RyZWFtVGVzdC8lRkUlMDEiKTsKKyAgU2ltcGxlTm90aWZpY2F0aW9uIGRlY29kZWQyOworICBCT09TVF9DSEVDS19OT19USFJPVyhkZWNvZGVkMi53aXJlRGVjb2RlKGZhY2UtPnNlbnREYXRhc1sxXS5nZXRDb250ZW50KCkuYmxvY2tGcm9tVmFsdWUoKSkpOworICBCT09TVF9DSEVDS19FUVVBTChkZWNvZGVkMi5nZXRNZXNzYWdlKCksICJtc2cyIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvY29yZS9yZXNvbHZlci5jcHAgYi9ORkQvdGVzdHMvY29yZS9yZXNvbHZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMzViNwotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9jb3JlL3Jlc29sdmVyLmNwcApAQCAtMCwwICsxLDI0NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImNvcmUvcmVzb2x2ZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitORkRfTE9HX0lOSVQoInRlc3RzLkNvcmVSZXNvbHZlciIpOworCit1c2luZyBib29zdDo6YXNpbzo6aXA6OmFkZHJlc3NfdjQ7Cit1c2luZyBib29zdDo6YXNpbzo6aXA6OmFkZHJlc3NfdjY7Cit1c2luZyBib29zdDo6YXNpbzo6aXA6OnRjcDsKK3VzaW5nIGJvb3N0Ojphc2lvOjppcDo6dWRwOworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoQ29yZVJlc29sdmVyLCBCYXNlRml4dHVyZSkKKwordGVtcGxhdGU8Y2xhc3MgUHJvdG9jb2w+CitjbGFzcyBSZXNvbHZlckZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgUmVzb2x2ZXJGaXh0dXJlKCkKKyAgICA6IG1fbkZhaWx1cmVzKDApCisgICAgLCBtX25TdWNjZXNzZXMoMCkKKyAgeworICB9CisKKyAgdm9pZAorICBvblN1Y2Nlc3MoY29uc3QgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50JiByZXNvbHZlZEVuZHBvaW50LAorICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50JiBleHBlY3RlZEVuZHBvaW50LAorICAgICAgICAgICAgYm9vbCBpc1ZhbGlkLCBib29sIHdhbnRDaGVja0FkZHJlc3MgPSBmYWxzZSkKKyAgeworICAgIE5GRF9MT0dfREVCVUcoIlJlc29sdmVkIHRvOiAiIDw8IHJlc29sdmVkRW5kcG9pbnQpOworICAgICsrbV9uU3VjY2Vzc2VzOworCisgICAgaWYgKCFpc1ZhbGlkKQorICAgICAgeworICAgICAgICBCT09TVF9GQUlMKCJSZXNvbHZlZCB0byAiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4ocmVzb2x2ZWRFbmRwb2ludCkKKyAgICAgICAgICAgICAgICAgICArICIsIGJ1dCBpdCBzaG91bGQgaGF2ZSBmYWlsZWQiKTsKKyAgICAgIH0KKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc29sdmVkRW5kcG9pbnQucG9ydCgpLCBleHBlY3RlZEVuZHBvaW50LnBvcnQoKSk7CisKKyAgICBCT09TVF9DSEVDS19FUVVBTChyZXNvbHZlZEVuZHBvaW50LmFkZHJlc3MoKS5pc192NCgpLCBleHBlY3RlZEVuZHBvaW50LmFkZHJlc3MoKS5pc192NCgpKTsKKworICAgIC8vIGNoZWNraW5nIGFkZHJlc3MgaXMgbm90IGRldGVybWluaXN0aWMgYW5kIHNob3VsZCBiZSBlbmFibGVkIG9ubHkKKyAgICAvLyBpZiBvbmx5IG9uZSBJUCBhZGRyZXNzIHdpbGwgYmUgcmV0dXJuZWQgYnkgcmVzb2x1dGlvbgorICAgIGlmICh3YW50Q2hlY2tBZGRyZXNzKQorICAgICAgeworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChyZXNvbHZlZEVuZHBvaW50LmFkZHJlc3MoKSwgZXhwZWN0ZWRFbmRwb2ludC5hZGRyZXNzKCkpOworICAgICAgfQorICB9CisKKyAgdm9pZAorICBvbkZhaWx1cmUoYm9vbCBpc1ZhbGlkKQorICB7CisgICAgKyttX25GYWlsdXJlczsKKworICAgIGlmICghaXNWYWxpZCkKKyAgICAgIEJPT1NUX0ZBSUwoIlJlc29sdXRpb24gc2hvdWxkIG5vdCBoYXZlIGZhaWxlZCIpOworCisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSh0cnVlLCAiUmVzb2x1dGlvbiBmYWlsZWQgYXMgZXhwZWN0ZWQiKTsKKyAgfQorCisKKyAgdWludDMyX3QgbV9uRmFpbHVyZXM7CisgIHVpbnQzMl90IG1fblN1Y2Nlc3NlczsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFRjcCwgUmVzb2x2ZXJGaXh0dXJlPHRjcD4pCit7CisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoInd3dy5uYW1lZC1kYXRhLm5ldCIsICI2MzYzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcDo6ZW5kcG9pbnQoYWRkcmVzc192NCgpLCA2MzYzKSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx0Y3A+OjpvbkZhaWx1cmUsIHRoaXMsIGZhbHNlKSk7CisKKyAgVGNwUmVzb2x2ZXI6OmFzeW5jUmVzb2x2ZSgid3d3Lm5hbWVkLWRhdGEubmV0IiwgIm5vdHBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx0Y3A+OjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwOjplbmRwb2ludChhZGRyZXNzX3Y0KCksIDApLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx0Y3A+OjpvbkZhaWx1cmUsIHRoaXMsIHRydWUpKTsgLy8gc2hvdWxkIGZhaWwKKworCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoIm5vdGhvc3Qubm90aG9zdC5ub3Rob3N0LmFycGEiLCAiNjM2MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHRjcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3A6OmVuZHBvaW50KGFkZHJlc3NfdjQoKSwgNjM2MyksIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHRjcD46Om9uRmFpbHVyZSwgdGhpcywgdHJ1ZSkpOyAvLyBzaG91bGQgZmFpbAorCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoInd3dy5nb29nbGUuY29tIiwgIjgwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcDo6ZW5kcG9pbnQoYWRkcmVzc192NCgpLCA4MCksIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25GYWlsdXJlLCB0aGlzLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXI6OklwdjRBZGRyZXNzKCkpOyAvLyByZXF1ZXN0IElQdjQgYWRkcmVzcworCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoInd3dy5nb29nbGUuY29tIiwgIjgwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcDo6ZW5kcG9pbnQoYWRkcmVzc192NigpLCA4MCksIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25GYWlsdXJlLCB0aGlzLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXI6OklwdjZBZGRyZXNzKCkpOyAvLyByZXF1ZXN0IElQdjYgYWRkcmVzcworCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoImlwdjYuZ29vZ2xlLmNvbSIsICI4MCIsIC8vIG9ubHkgSVB2NiBhZGRyZXNzIHNob3VsZCBiZSBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcDo6ZW5kcG9pbnQoYWRkcmVzc192NigpLCA4MCksIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25GYWlsdXJlLCB0aGlzLCBmYWxzZSkpOworCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoImlwdjYuZ29vZ2xlLmNvbSIsICI4MCIsIC8vIG9ubHkgSVB2NiBhZGRyZXNzIHNob3VsZCBiZSBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcDo6ZW5kcG9pbnQoYWRkcmVzc192NigpLCA4MCksIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25GYWlsdXJlLCB0aGlzLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXI6OklwdjZBZGRyZXNzKCkpOworCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoImlwdjYuZ29vZ2xlLmNvbSIsICI4MCIsIC8vIG9ubHkgSVB2NiBhZGRyZXNzIHNob3VsZCBiZSBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcDo6ZW5kcG9pbnQoYWRkcmVzc192NigpLCA4MCksIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHRjcD46Om9uRmFpbHVyZSwgdGhpcywgdHJ1ZSksIC8vIHNob3VsZCBmYWlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXI6OklwdjRBZGRyZXNzKCkpOworCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoIjE5Mi4wLjIuMSIsICI4MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHRjcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3A6OmVuZHBvaW50KGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTIuMC4yLjEiKSwgODApLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25GYWlsdXJlLCB0aGlzLCBmYWxzZSkpOworCisgIFRjcFJlc29sdmVyOjphc3luY1Jlc29sdmUoIjIwMDE6ZGI4OjNmOTowOjMwMjU6Y2NjNTplZWViOjg2ZDMiLCAiODAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx0Y3A+OjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwOjplbmRwb2ludChhZGRyZXNzX3Y2OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjNmOTowOjMwMjU6Y2NjNTplZWViOjg2ZDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODApLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dGNwPjo6b25GYWlsdXJlLCB0aGlzLCBmYWxzZSkpOworCisgIGdfaW8ucnVuKCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9uRmFpbHVyZXMsIDMpOworICBCT09TVF9DSEVDS19FUVVBTChtX25TdWNjZXNzZXMsIDcpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTeW5jVGNwKQoreworICB0Y3A6OmVuZHBvaW50IGVuZHBvaW50OworICBCT09TVF9DSEVDS19OT19USFJPVyhlbmRwb2ludCA9IFRjcFJlc29sdmVyOjpzeW5jUmVzb2x2ZSgid3d3Lm5hbWVkLWRhdGEubmV0IiwgIjYzNjMiKSk7CisgIE5GRF9MT0dfREVCVUcoIlJlc29sdmVkIHRvOiAiIDw8IGVuZHBvaW50KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW5kcG9pbnQuYWRkcmVzcygpLmlzX3Y0KCksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChlbmRwb2ludC5wb3J0KCksIDYzNjMpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShVZHAsIFJlc29sdmVyRml4dHVyZTx1ZHA+KQoreworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCJ3d3cubmFtZWQtZGF0YS5uZXQiLCAiNjM2MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZHA6OmVuZHBvaW50KGFkZHJlc3NfdjQoKSwgNjM2MyksIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dWRwPjo6b25GYWlsdXJlLCB0aGlzLCBmYWxzZSkpOworCisgIFVkcFJlc29sdmVyOjphc3luY1Jlc29sdmUoInd3dy5uYW1lZC1kYXRhLm5ldCIsICJub3Rwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dWRwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkcDo6ZW5kcG9pbnQoYWRkcmVzc192NCgpLCAwKSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dWRwPjo6b25GYWlsdXJlLCB0aGlzLCB0cnVlKSk7IC8vIHNob3VsZCBmYWlsCisKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCJub3Rob3N0Lm5vdGhvc3Qubm90aG9zdC5hcnBhIiwgIjYzNjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx1ZHA+OjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRwOjplbmRwb2ludChhZGRyZXNzX3Y0KCksIDYzNjMpLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx1ZHA+OjpvbkZhaWx1cmUsIHRoaXMsIHRydWUpKTsgLy8gc2hvdWxkIGZhaWwKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCJ3d3cuZ29vZ2xlLmNvbSIsICI4MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZHA6OmVuZHBvaW50KGFkZHJlc3NfdjQoKSwgODApLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uRmFpbHVyZSwgdGhpcywgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyOjpJcHY0QWRkcmVzcygpKTsgLy8gcmVxdWVzdCBJUHY0IGFkZHJlc3MKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCJ3d3cuZ29vZ2xlLmNvbSIsICI4MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZHA6OmVuZHBvaW50KGFkZHJlc3NfdjYoKSwgODApLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uRmFpbHVyZSwgdGhpcywgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyOjpJcHY2QWRkcmVzcygpKTsgLy8gcmVxdWVzdCBJUHY2IGFkZHJlc3MKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCJpcHY2Lmdvb2dsZS5jb20iLCAiODAiLCAvLyBvbmx5IElQdjYgYWRkcmVzcyBzaG91bGQgYmUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZHA6OmVuZHBvaW50KGFkZHJlc3NfdjYoKSwgODApLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uRmFpbHVyZSwgdGhpcywgZmFsc2UpKTsKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCJpcHY2Lmdvb2dsZS5jb20iLCAiODAiLCAvLyBvbmx5IElQdjYgYWRkcmVzcyBzaG91bGQgYmUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZHA6OmVuZHBvaW50KGFkZHJlc3NfdjYoKSwgODApLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uRmFpbHVyZSwgdGhpcywgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyOjpJcHY2QWRkcmVzcygpKTsKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCJpcHY2Lmdvb2dsZS5jb20iLCAiODAiLCAvLyBvbmx5IElQdjYgYWRkcmVzcyBzaG91bGQgYmUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZHA6OmVuZHBvaW50KGFkZHJlc3NfdjYoKSwgODApLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx1ZHA+OjpvbkZhaWx1cmUsIHRoaXMsIHRydWUpLCAvLyBzaG91bGQgZmFpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyOjpJcHY0QWRkcmVzcygpKTsKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCIxOTIuMC4yLjEiLCAiODAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlJlc29sdmVyRml4dHVyZTx1ZHA+OjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRwOjplbmRwb2ludChhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTkyLjAuMi4xIiksIDgwKSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uRmFpbHVyZSwgdGhpcywgZmFsc2UpKTsKKworICBVZHBSZXNvbHZlcjo6YXN5bmNSZXNvbHZlKCIyMDAxOmRiODozZjk6MDozMDI1OmNjYzU6ZWVlYjo4NmQzIiwgIjgwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZXNvbHZlckZpeHR1cmU8dWRwPjo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkcDo6ZW5kcG9pbnQoYWRkcmVzc192Njo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fc3RyaW5nKCIyMDAxOmRiODozZjk6MDozMDI1OmNjYzU6ZWVlYjo4NmQzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwKSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmUmVzb2x2ZXJGaXh0dXJlPHVkcD46Om9uRmFpbHVyZSwgdGhpcywgZmFsc2UpKTsKKworICBnX2lvLnJ1bigpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG1fbkZhaWx1cmVzLCAzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9uU3VjY2Vzc2VzLCA3KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU3luY1VkcCkKK3sKKyAgdWRwOjplbmRwb2ludCBlbmRwb2ludDsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coZW5kcG9pbnQgPSBVZHBSZXNvbHZlcjo6c3luY1Jlc29sdmUoInd3dy5uYW1lZC1kYXRhLm5ldCIsICI2MzYzIikpOworICBORkRfTE9HX0RFQlVHKCJSZXNvbHZlZCB0bzogIiA8PCBlbmRwb2ludCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVuZHBvaW50LmFkZHJlc3MoKS5pc192NCgpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW5kcG9pbnQucG9ydCgpLCA2MzYzKTsKK30KKworCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2NvcmUvc2NoZWR1bGVyLmNwcCBiL05GRC90ZXN0cy9jb3JlL3NjaGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0YzMxZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9jb3JlL3NjaGVkdWxlci5jcHAKQEAgLTAsMCArMSwxNjAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJjb3JlL3NjaGVkdWxlci5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKENvcmVTY2hlZHVsZXIsIEJhc2VGaXh0dXJlKQorCitjbGFzcyBTY2hlZHVsZXJGaXh0dXJlIDogcHJvdGVjdGVkIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisgIFNjaGVkdWxlckZpeHR1cmUoKQorICAgIDogY291bnQxKDApCisgICAgLCBjb3VudDIoMCkKKyAgICAsIGNvdW50MygwKQorICB7CisgIH0KKworICB2b2lkCisgIGV2ZW50MSgpCisgIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjb3VudDMsIDEpOworICAgICsrY291bnQxOworICB9CisKKyAgdm9pZAorICBldmVudDIoKQorICB7CisgICAgKytjb3VudDI7CisgIH0KKworICB2b2lkCisgIGV2ZW50MygpCisgIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjb3VudDEsIDApOworICAgICsrY291bnQzOworICB9CisKKyAgaW50IGNvdW50MTsKKyAgaW50IGNvdW50MjsKKyAgaW50IGNvdW50MzsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEV2ZW50cywgU2NoZWR1bGVyRml4dHVyZSkKK3sKKyAgc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjptaWxsaXNlY29uZHMoNTAwKSwgYmluZCgmU2NoZWR1bGVyRml4dHVyZTo6ZXZlbnQxLCB0aGlzKSk7CisKKyAgRXZlbnRJZCBpID0gc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjpzZWNvbmRzKDEpLCBiaW5kKCZTY2hlZHVsZXJGaXh0dXJlOjpldmVudDIsIHRoaXMpKTsKKyAgc2NoZWR1bGVyOjpjYW5jZWwoaSk7CisKKyAgc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjptaWxsaXNlY29uZHMoMjUwKSwgYmluZCgmU2NoZWR1bGVyRml4dHVyZTo6ZXZlbnQzLCB0aGlzKSk7CisKKyAgaSA9IHNjaGVkdWxlcjo6c2NoZWR1bGUodGltZTo6bWlsbGlzZWNvbmRzKDUwKSwgYmluZCgmU2NoZWR1bGVyRml4dHVyZTo6ZXZlbnQyLCB0aGlzKSk7CisgIHNjaGVkdWxlcjo6Y2FuY2VsKGkpOworCisgIGdfaW8ucnVuKCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnQxLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnQyLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnQzLCAxKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2FuY2VsRW1wdHlFdmVudCkKK3sKKyAgRXZlbnRJZCBpOworICBzY2hlZHVsZXI6OmNhbmNlbChpKTsKK30KKworY2xhc3MgU2VsZkNhbmNlbEZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgdm9pZAorICBjYW5jZWxTZWxmKCkKKyAgeworICAgIHNjaGVkdWxlcjo6Y2FuY2VsKG1fc2VsZkV2ZW50SWQpOworICB9CisKKyAgRXZlbnRJZCBtX3NlbGZFdmVudElkOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoU2VsZkNhbmNlbCwgU2VsZkNhbmNlbEZpeHR1cmUpCit7CisgIG1fc2VsZkV2ZW50SWQgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKHRpbWU6Om1pbGxpc2Vjb25kcygxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZTZWxmQ2FuY2VsRml4dHVyZTo6Y2FuY2VsU2VsZiwgdGhpcykpOworCisgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1coZ19pby5ydW4oKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFNjb3BlZEV2ZW50SWREZXN0cnVjdCwgVW5pdFRlc3RUaW1lRml4dHVyZSkKK3sKKyAgaW50IGhpdCA9IDA7CisgIHsKKyAgICBzY2hlZHVsZXI6OlNjb3BlZEV2ZW50SWQgc2UgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKHRpbWU6Om1pbGxpc2Vjb25kcygxMCksIFsmXSB7ICsraGl0OyB9KTsKKyAgfSAvLyBzZSBnb2VzIG91dCBvZiBzY29wZQorICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxKSwgMTUpOworICBCT09TVF9DSEVDS19FUVVBTChoaXQsIDApOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShTY29wZWRFdmVudElkQXNzaWduLCBVbml0VGVzdFRpbWVGaXh0dXJlKQoreworICBpbnQgaGl0MSA9IDAsIGhpdDIgPSAwOworICBzY2hlZHVsZXI6OlNjb3BlZEV2ZW50SWQgc2UxID0gc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjptaWxsaXNlY29uZHMoMTApLCBbJl0geyArK2hpdDE7IH0pOworICBzZTEgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKHRpbWU6Om1pbGxpc2Vjb25kcygxMCksIFsmXSB7ICsraGl0MjsgfSk7CisgIHRoaXMtPmFkdmFuY2VDbG9ja3ModGltZTo6bWlsbGlzZWNvbmRzKDEpLCAxNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGhpdDEsIDApOworICBCT09TVF9DSEVDS19FUVVBTChoaXQyLCAxKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoU2NvcGVkRXZlbnRJZFJlbGVhc2UsIFVuaXRUZXN0VGltZUZpeHR1cmUpCit7CisgIGludCBoaXQgPSAwOworICB7CisgICAgc2NoZWR1bGVyOjpTY29wZWRFdmVudElkIHNlID0gc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjptaWxsaXNlY29uZHMoMTApLCBbJl0geyArK2hpdDsgfSk7CisgICAgc2UucmVsZWFzZSgpOworICB9IC8vIHNlIGdvZXMgb3V0IG9mIHNjb3BlCisgIHRoaXMtPmFkdmFuY2VDbG9ja3ModGltZTo6bWlsbGlzZWNvbmRzKDEpLCAxNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGhpdCwgMSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFNjb3BlZEV2ZW50SWRNb3ZlLCBVbml0VGVzdFRpbWVGaXh0dXJlKQoreworICBpbnQgaGl0ID0gMDsKKyAgdW5pcXVlX3B0cjxzY2hlZHVsZXI6OlNjb3BlZEV2ZW50SWQ+IHNlMjsKKyAgeworICAgIHNjaGVkdWxlcjo6U2NvcGVkRXZlbnRJZCBzZSA9IHNjaGVkdWxlcjo6c2NoZWR1bGUodGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgWyZdIHsgKytoaXQ7IH0pOworICAgIHNlMi5yZXNldChuZXcgc2NoZWR1bGVyOjpTY29wZWRFdmVudElkKHN0ZDo6bW92ZShzZSkpKTsKKyAgfSAvLyBzZSBnb2VzIG91dCBvZiBzY29wZQorICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxKSwgMTUpOworICBCT09TVF9DSEVDS19FUVVBTChoaXQsIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2NvcmUvc2VnbWVudC1wdWJsaXNoZXIuY3BwIGIvTkZEL3Rlc3RzL2NvcmUvc2VnbWVudC1wdWJsaXNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NWMzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvY29yZS9zZWdtZW50LXB1Ymxpc2hlci5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJjb3JlL3NlZ21lbnQtcHVibGlzaGVyLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L2VuY29kaW5nL3Rsdi5ocHA+CisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2R1bW15LWNsaWVudC1mYWNlLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitORkRfTE9HX0lOSVQoIlNlZ21lbnRQdWJsaXNoZXJUZXN0Iik7CisKK3RlbXBsYXRlPGludDY0X3QgTj0xMDAwMD4KK2NsYXNzIFRlc3RTZWdtZW50UHVibGlzaGVyIDogcHVibGljIFNlZ21lbnRQdWJsaXNoZXI8bmRuOjp1dGlsOjpEdW1teUNsaWVudEZhY2U+Cit7CitwdWJsaWM6CisgIFRlc3RTZWdtZW50UHVibGlzaGVyKG5kbjo6dXRpbDo6RHVtbXlDbGllbnRGYWNlJiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6S2V5Q2hhaW4mIGtleUNoYWluKQorICAgIDogU2VnbWVudFB1Ymxpc2hlcihmYWNlLCBwcmVmaXgsIGtleUNoYWluKQorICAgICwgbV90b3RhbFBheWxvYWRMZW5ndGgoMCkKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5UZXN0U2VnbWVudFB1Ymxpc2hlcigpCisgIHsKKyAgfQorCisgIHVpbnQxNl90CisgIGdldExpbWl0KCkgY29uc3QKKyAgeworICAgIHJldHVybiBOOworICB9CisKKyAgc2l6ZV90CisgIGdldFRvdGFsUGF5bG9hZExlbmd0aCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV90b3RhbFBheWxvYWRMZW5ndGg7CisgIH0KKworcHJvdGVjdGVkOgorCisgIHZpcnR1YWwgc2l6ZV90CisgIGdlbmVyYXRlKG5kbjo6RW5jb2RpbmdCdWZmZXImIG91dEJ1ZmZlcikKKyAgeworICAgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgICAgeworICAgICAgICB0b3RhbExlbmd0aCArPSBwcmVwZW5kTm9uTmVnYXRpdmVJbnRlZ2VyQmxvY2sob3V0QnVmZmVyLCB0bHY6OkNvbnRlbnQsIGkpOworICAgICAgfQorICAgIG1fdG90YWxQYXlsb2FkTGVuZ3RoICs9IHRvdGFsTGVuZ3RoOworICAgIHJldHVybiB0b3RhbExlbmd0aDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHNpemVfdCBtX3RvdGFsUGF5bG9hZExlbmd0aDsKK307CisKK3RlbXBsYXRlPGludDY0X3QgTj4KK2NsYXNzIFNlZ21lbnRQdWJsaXNoZXJGaXh0dXJlIDogcHVibGljIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisgIFNlZ21lbnRQdWJsaXNoZXJGaXh0dXJlKCkKKyAgICA6IG1fZmFjZShuZG46OnV0aWw6Om1ha2VEdW1teUNsaWVudEZhY2UoKSkKKyAgICAsIG1fcHVibGlzaGVyKCptX2ZhY2UsICIvbG9jYWxob3N0L25mZC9TZWdtZW50UHVibGlzaGVyRml4dHVyZSIsIG1fa2V5Q2hhaW4pCisgIHsKKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGUoY29uc3QgRGF0YSYgZGF0YSkKKyAgeworICAgIEJsb2NrIHBheWxvYWQgPSBkYXRhLmdldENvbnRlbnQoKTsKKyAgICBORkRfTE9HX0RFQlVHKCJwYXlsb2FkIHNpemUgKHcvbyBDb250ZW50IFRMVik6ICIgPDwgcGF5bG9hZC52YWx1ZV9zaXplKCkpOworCisgICAgbV9idWZmZXIuYXBwZW5kQnl0ZUFycmF5KHBheWxvYWQudmFsdWUoKSwgcGF5bG9hZC52YWx1ZV9zaXplKCkpOworCisgICAgdWludDY0X3Qgc2VnbWVudE5vID0gZGF0YS5nZXROYW1lKClbLTFdLnRvU2VnbWVudCgpOworICAgIGlmIChkYXRhLmdldEZpbmFsQmxvY2tJZCgpICE9IGRhdGEuZ2V0TmFtZSgpWy0xXSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgTkZEX0xPR19ERUJVRygiZ290IGZpbmFsIGJsb2NrOiAjIiA8PCBzZWdtZW50Tm8pOworCisgICAgLy8gd3JhcCBkYXRhIGluIGEgc2luZ2xlIENvbnRlbnQgVExWIGZvciBlYXN5IHBhcnNpbmcKKyAgICBtX2J1ZmZlci5wcmVwZW5kVmFyTnVtYmVyKG1fYnVmZmVyLnNpemUoKSk7CisgICAgbV9idWZmZXIucHJlcGVuZFZhck51bWJlcih0bHY6OkNvbnRlbnQpOworCisgICAgQk9PU1RfVEVTVF9DSEVDS1BPSU5UKCJjcmVhdGluZyBwYXJzZXIiKTsKKyAgICBuZG46OkJsb2NrIHBhcnNlcihtX2J1ZmZlci5idWYoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICBCT09TVF9URVNUX0NIRUNLUE9JTlQoInBhcnNpbmcgYWdncmVnYXRlZCByZXNwb25zZSIpOworICAgIHBhcnNlci5wYXJzZSgpOworCisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChwYXJzZXIuZWxlbWVudHNfc2l6ZSgpLCBtX3B1Ymxpc2hlci5nZXRMaW1pdCgpKTsKKworICAgIHVpbnQ2NF90IGV4cGVjdGVkTm8gPSBtX3B1Ymxpc2hlci5nZXRMaW1pdCgpIC0gMTsKKyAgICBmb3IgKEJsb2NrOjplbGVtZW50X2NvbnN0X2l0ZXJhdG9yIGkgPSBwYXJzZXIuZWxlbWVudHNfYmVnaW4oKTsKKyAgICAgICAgIGkgIT0gcGFyc2VyLmVsZW1lbnRzX2VuZCgpOworICAgICAgICAgKytpKQorICAgICAgeworICAgICAgICB1aW50NjRfdCBudW1iZXIgPSByZWFkTm9uTmVnYXRpdmVJbnRlZ2VyKCppKTsKKyAgICAgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChudW1iZXIsIGV4cGVjdGVkTm8pOworICAgICAgICAtLWV4cGVjdGVkTm87CisgICAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPG5kbjo6dXRpbDo6RHVtbXlDbGllbnRGYWNlPiBtX2ZhY2U7CisgIFRlc3RTZWdtZW50UHVibGlzaGVyPE4+IG1fcHVibGlzaGVyOworICBuZG46OkVuY29kaW5nQnVmZmVyIG1fYnVmZmVyOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47Cit9OworCit1c2luZyBib29zdDo6bXBsOjppbnRfOwordHlwZWRlZiBib29zdDo6bXBsOjp2ZWN0b3I8aW50XzwxMDAwMD4sIGludF88MTAwPiwgaW50XzwxMD4sIGludF88MD4gPiBEYXRhc2V0U2l6ZXM7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShTZWdtZW50UHVibGlzaGVyKQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRV9URU1QTEFURShHZW5lcmF0ZSwgVCwgRGF0YXNldFNpemVzLCBTZWdtZW50UHVibGlzaGVyRml4dHVyZTxUOjp2YWx1ZT4pCit7CisgIHRoaXMtPm1fcHVibGlzaGVyLnB1Ymxpc2goKTsKKyAgdGhpcy0+bV9mYWNlLT5wcm9jZXNzRXZlbnRzKCk7CisKKyAgc2l6ZV90IG5TZWdtZW50cyA9IHRoaXMtPm1fcHVibGlzaGVyLmdldFRvdGFsUGF5bG9hZExlbmd0aCgpIC8KKyAgICAgICAgICAgICAgICAgICAgIHRoaXMtPm1fcHVibGlzaGVyLmdldE1heFNlZ21lbnRTaXplKCk7CisgIGlmICh0aGlzLT5tX3B1Ymxpc2hlci5nZXRUb3RhbFBheWxvYWRMZW5ndGgoKSAlIHRoaXMtPm1fcHVibGlzaGVyLmdldE1heFNlZ21lbnRTaXplKCkgIT0gMCB8fAorICAgICAgblNlZ21lbnRzID09IDApCisgICAgKytuU2VnbWVudHM7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGhpcy0+bV9mYWNlLT5zZW50RGF0YXMuc2l6ZSgpLCBuU2VnbWVudHMpOworICBmb3IgKGNvbnN0IERhdGEmIGRhdGEgOiB0aGlzLT5tX2ZhY2UtPnNlbnREYXRhcykgeworICAgIHRoaXMtPnZhbGlkYXRlKGRhdGEpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvY29yZS9zaW1wbGUtbm90aWZpY2F0aW9uLmhwcCBiL05GRC90ZXN0cy9jb3JlL3NpbXBsZS1ub3RpZmljYXRpb24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGZkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvY29yZS9zaW1wbGUtbm90aWZpY2F0aW9uLmhwcApAQCAtMCwwICsxLDk0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9URVNUU19DT1JFX1NJTVBMRV9OT1RJRklDQVRJT05fSFBQCisjZGVmaW5lIE5GRF9URVNUU19DT1JFX1NJTVBMRV9OT1RJRklDQVRJT05fSFBQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK2NsYXNzIFNpbXBsZU5vdGlmaWNhdGlvbgoreworcHVibGljOgorICBTaW1wbGVOb3RpZmljYXRpb24oKQorICB7CisgIH0KKworICBTaW1wbGVOb3RpZmljYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBtX21lc3NhZ2UobWVzc2FnZSkKKyAgeworICB9CisKKyAgflNpbXBsZU5vdGlmaWNhdGlvbigpCisgIHsKKyAgfQorCisgIEJsb2NrCisgIHdpcmVFbmNvZGUoKSBjb25zdAorICB7CisgICAgbmRuOjpFbmNvZGluZ0J1ZmZlciBidWZmZXI7CisgICAgcHJlcGVuZEJ5dGVBcnJheUJsb2NrKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODg4LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihtX21lc3NhZ2UuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWVzc2FnZS5zaXplKCkpOworICAgIHJldHVybiBidWZmZXIuYmxvY2soKTsKKyAgfQorCisgIHZvaWQKKyAgd2lyZURlY29kZShjb25zdCBCbG9jayYgYmxvY2spCisgIHsKKyAgICBtX21lc3NhZ2UuYXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJsb2NrLnZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgYmxvY2sudmFsdWVfc2l6ZSgpKTsKKworICAgIC8vIGVycm9yIGZvciB0ZXN0aW5nCisgICAgaWYgKCFtX21lc3NhZ2UuZW1wdHkoKSAmJiBtX21lc3NhZ2VbMF0gPT0gJ1x4MDcnKQorICAgICAgdGhyb3cgdGx2OjpFcnJvcigiMHgwNyBlcnJvciIpOworICB9CisKK3B1YmxpYzoKKyAgY29uc3Qgc3RkOjpzdHJpbmcmCisgIGdldE1lc3NhZ2UoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fbWVzc2FnZTsKKyAgfQorCisgIHZvaWQKKyAgc2V0TWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgeworICAgIG1fbWVzc2FnZSA9IG1lc3NhZ2U7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbV9tZXNzYWdlOworfTsKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1RFU1RTX0NPUkVfU0lNUExFX05PVElGSUNBVElPTl9IUFAKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9jb3JlL3ZlcnNpb24uY3BwIGIvTkZEL3Rlc3RzL2NvcmUvdmVyc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlMzg1MQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9jb3JlL3ZlcnNpb24uY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ2ZXJzaW9uLmhwcCIKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKENvcmVWZXJzaW9uLCBCYXNlRml4dHVyZSkKKworTkZEX0xPR19JTklUKCJWZXJzaW9uVGVzdCIpOworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShWZXJzaW9uKQoreworICBORkRfTE9HX0lORk8oIk5GRF9WRVJTSU9OICIgPDwgTkZEX1ZFUlNJT04pOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE5GRF9WRVJTSU9OLCBORkRfVkVSU0lPTl9NQUpPUiAqIDEwMDAwMDAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZEX1ZFUlNJT05fTUlOT1IgKiAxMDAwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GRF9WRVJTSU9OX1BBVENIKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVmVyc2lvblN0cmluZykKK3sKKyAgTkZEX0xPR19JTkZPKCJORkRfVkVSU0lPTl9TVFJJTkcgIiA8PCBORkRfVkVSU0lPTl9TVFJJTkcpOworCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoTkZEX1ZFUlNJT05fTUFKT1IgPCAxMDAwKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVChORkRfVkVSU0lPTl9NSU5PUiA8IDEwMDApOworICBCT09TVF9TVEFUSUNfQVNTRVJUKE5GRF9WRVJTSU9OX1BBVENIIDwgMTAwMCk7CisgIGNoYXIgYnVmWzEyXTsKKyAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkLiVkLiVkIiwgTkZEX1ZFUlNJT05fTUFKT1IsIE5GRF9WRVJTSU9OX01JTk9SLCBORkRfVkVSU0lPTl9QQVRDSCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RkOjpzdHJpbmcoTkZEX1ZFUlNJT05fU1RSSU5HKSwgc3RkOjpzdHJpbmcoYnVmKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvZHVtbXktZmFjZS5ocHAgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvZHVtbXktZmFjZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwYWRiZgotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1mYWNlLmhwcApAQCAtMCwwICsxLDk5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9URVNUU19EQUVNT05fRkFDRV9EVU1NWV9GQUNFX0hQUAorI2RlZmluZSBORkRfVEVTVFNfREFFTU9OX0ZBQ0VfRFVNTVlfRkFDRV9IUFAKKworI2luY2x1ZGUgImZhY2UvZmFjZS5ocHAiCisjaW5jbHVkZSAiZmFjZS9sb2NhbC1mYWNlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCisvKiogXGNsYXNzIER1bW15RmFjZQorICogIFxicmllZiBhIEZhY2UgZm9yIHVuaXQgdGVzdGluZworICovCit0ZW1wbGF0ZTxjbGFzcyBGYWNlQmFzZT4KK2NsYXNzIER1bW15RmFjZUltcGwgOiBwdWJsaWMgRmFjZUJhc2UKK3sKK3B1YmxpYzoKKyAgRHVtbXlGYWNlSW1wbCgpCisgICAgOiBGYWNlQmFzZShGYWNlVXJpKCJkdW1teTovLyIpLCBGYWNlVXJpKCJkdW1teTovLyIpKQorICB7CisgIH0KKworICBEdW1teUZhY2VJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiByZW1vdGVVcmksIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhbFVyaSkKKyAgICA6IEZhY2VCYXNlKEZhY2VVcmkocmVtb3RlVXJpKSwgRmFjZVVyaShsb2NhbFVyaSkpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgdm9pZAorICBzZW5kSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQorICB7CisgICAgdGhpcy0+b25TZW5kSW50ZXJlc3QoaW50ZXJlc3QpOworICAgIG1fc2VudEludGVyZXN0cy5wdXNoX2JhY2soaW50ZXJlc3QpOworICAgIHRoaXMtPmFmdGVyU2VuZCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkCisgIHNlbmREYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICB0aGlzLT5vblNlbmREYXRhKGRhdGEpOworICAgIG1fc2VudERhdGFzLnB1c2hfYmFjayhkYXRhKTsKKyAgICB0aGlzLT5hZnRlclNlbmQoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZAorICBjbG9zZSgpCisgIHsKKyAgICB0aGlzLT5vbkZhaWwoImNsb3NlIik7CisgIH0KKworICB2b2lkCisgIHJlY2VpdmVJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCisgIHsKKyAgICB0aGlzLT5vblJlY2VpdmVJbnRlcmVzdChpbnRlcmVzdCk7CisgIH0KKworICB2b2lkCisgIHJlY2VpdmVEYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICB0aGlzLT5vblJlY2VpdmVEYXRhKGRhdGEpOworICB9CisKKyAgRXZlbnRFbWl0dGVyPD4gYWZ0ZXJTZW5kOworCitwdWJsaWM6CisgIHN0ZDo6dmVjdG9yPEludGVyZXN0PiBtX3NlbnRJbnRlcmVzdHM7CisgIHN0ZDo6dmVjdG9yPERhdGE+IG1fc2VudERhdGFzOworfTsKKwordHlwZWRlZiBEdW1teUZhY2VJbXBsPEZhY2U+IER1bW15RmFjZTsKK3R5cGVkZWYgRHVtbXlGYWNlSW1wbDxMb2NhbEZhY2U+IER1bW15TG9jYWxGYWNlOworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfVEVTVFNfREFFTU9OX0ZBQ0VfRFVNTVlfRkFDRV9IUFAKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1zdHJlYW0tc2VuZGVyLmhwcCBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1zdHJlYW0tc2VuZGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBlMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL2R1bW15LXN0cmVhbS1zZW5kZXIuaHBwCkBAIC0wLDAgKzEsMTE2IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9URVNUU19EQUVNT05fRkFDRV9EVU1NWV9TVFJFQU1fU0VOREVSX0hQUAorI2RlZmluZSBORkRfVEVTVFNfREFFTU9OX0ZBQ0VfRFVNTVlfU1RSRUFNX1NFTkRFUl9IUFAKKworI2luY2x1ZGUgImNvcmUvc2NoZWR1bGVyLmhwcCIKKyNpbmNsdWRlICJjb3JlL2dsb2JhbC1pby5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworCit0ZW1wbGF0ZTxjbGFzcyBQcm90b2NvbCwgY2xhc3MgRGF0YXNldD4KK2NsYXNzIER1bW15U3RyZWFtU2VuZGVyIDogcHVibGljIERhdGFzZXQKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQgRW5kcG9pbnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OnNvY2tldCBTb2NrZXQ7CisKKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IHN0ZDo6cnVudGltZV9lcnJvcih3aGF0KQorICAgIHsKKyAgICB9CisgIH07CisKKyAgRHVtbXlTdHJlYW1TZW5kZXIoKQorICAgIDogc29ja2V0KGdldEdsb2JhbElvU2VydmljZSgpKQorICB7CisgIH0KKworICB2b2lkCisgIHN0YXJ0KGNvbnN0IEVuZHBvaW50JiBlbmRwb2ludCkKKyAgeworICAgIHNvY2tldC5hc3luY19jb25uZWN0KGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkR1bW15U3RyZWFtU2VuZGVyOjpvblN1Y2Nlc3NmdWxsQ29ubmVjdCwgdGhpcywgXzEpKTsKKyAgfQorCisgIHZvaWQKKyAgb25TdWNjZXNzZnVsbENvbm5lY3QoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IpCisgIHsKKyAgICBpZiAoZXJyb3IpCisgICAgICB7CisgICAgICAgIHRocm93IEVycm9yKCJDb25uZWN0aW9uIGFib3J0ZWQiKTsKKyAgICAgIH0KKworICAgIC8vIFRoaXMgdmFsdWUgbWF5IG5lZWQgdG8gYmUgYWRqdXN0ZWQgaWYgc29tZSBkYXRhc2V0IGV4Y2VlZHMgMTAwaworICAgIHNvY2tldC5zZXRfb3B0aW9uKGJvb3N0Ojphc2lvOjpzb2NrZXRfYmFzZTo6c2VuZF9idWZmZXJfc2l6ZSgxMDAwMDApKTsKKworICAgIGZvciAodHlwZW5hbWUgRGF0YXNldDo6Q29udGFpbmVyOjppdGVyYXRvciBpID0gdGhpcy0+ZGF0YS5iZWdpbigpOworICAgICAgICAgaSAhPSB0aGlzLT5kYXRhLmVuZCgpOyArK2kpCisgICAgICB7CisgICAgICAgIHNvY2tldC5hc3luY19zZW5kKGJvb3N0Ojphc2lvOjpidWZmZXIoKmkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZEdW1teVN0cmVhbVNlbmRlcjo6b25TZW5kRmluaXNoZWQsIHRoaXMsIF8xLCBmYWxzZSkpOworICAgICAgfQorCisgICAgc29ja2V0LmFzeW5jX3NlbmQoYm9vc3Q6OmFzaW86OmJ1ZmZlcihzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oMCksIDApLAorICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkR1bW15U3RyZWFtU2VuZGVyOjpvblNlbmRGaW5pc2hlZCwgdGhpcywgXzEsIHRydWUpKTsKKyAgfQorCisgIHZvaWQKKyAgb25TZW5kRmluaXNoZWQoY29uc3QgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSYgZXJyb3IsIGJvb2wgaXNGaW5hbCkKKyAgeworICAgIGlmIChlcnJvcikgeworICAgICAgdGhyb3cgRXJyb3IoIkNvbm5lY3Rpb24gYWJvcnRlZCIpOworICAgIH0KKworICAgIGlmIChpc0ZpbmFsKSB7CisgICAgICBzY2hlZHVsZXI6OnNjaGVkdWxlKG5kbjo6dGltZTo6c2Vjb25kcygxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRHVtbXlTdHJlYW1TZW5kZXI6OnN0b3AsIHRoaXMpKTsKKyAgICB9CisgIH0KKworICB2b2lkCisgIHN0b3AoKQorICB7CisgICAgLy8gVGVybWluYXRlIHRlc3QKKyAgICBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlIGVycm9yOworICAgIHNvY2tldC5zaHV0ZG93bihTb2NrZXQ6OnNodXRkb3duX2JvdGgsIGVycm9yKTsKKyAgICBzb2NrZXQuY2xvc2UoZXJyb3IpOworICB9CisKK3B1YmxpYzoKKyAgU29ja2V0IHNvY2tldDsKK307CisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9URVNUU19EQUVNT05fRkFDRV9EVU1NWV9TVFJFQU1fU0VOREVSX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL2V0aGVybmV0LmNwcCBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9ldGhlcm5ldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMTgxYwotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9ldGhlcm5ldC5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJmYWNlL2V0aGVybmV0LWZhY2UuaHBwIgorI2luY2x1ZGUgImZhY2UvZXRoZXJuZXQtZmFjdG9yeS5ocHAiCisKKyNpbmNsdWRlICJjb3JlL25ldHdvcmstaW50ZXJmYWNlLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitjbGFzcyBJbnRlcmZhY2VzRml4dHVyZSA6IHByb3RlY3RlZCBCYXNlRml4dHVyZQoreworcHJvdGVjdGVkOgorICBJbnRlcmZhY2VzRml4dHVyZSgpCisgIHsKKyAgICBFdGhlcm5ldEZhY3RvcnkgZmFjdG9yeTsKKworICAgIGZvciAoY29uc3QgYXV0byYgbmV0aWYgOiBsaXN0TmV0d29ya0ludGVyZmFjZXMoKSkgeworICAgICAgaWYgKCFuZXRpZi5pc0xvb3BiYWNrKCkgJiYgbmV0aWYuaXNVcCgpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKG5ldGlmLCBldGhlcm5ldDo6Z2V0QnJvYWRjYXN0QWRkcmVzcygpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRmFjZTo6RXJyb3ImKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtX2ludGVyZmFjZXMucHVzaF9iYWNrKG5ldGlmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnZlY3RvcjxOZXR3b3JrSW50ZXJmYWNlSW5mbz4gbV9pbnRlcmZhY2VzOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEZhY2VFdGhlcm5ldCwgSW50ZXJmYWNlc0ZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEdldENoYW5uZWxzKQoreworICBFdGhlcm5ldEZhY3RvcnkgZmFjdG9yeTsKKworICBhdXRvIGNoYW5uZWxzID0gZmFjdG9yeS5nZXRDaGFubmVscygpOworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVscy5lbXB0eSgpLCB0cnVlKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTXVsdGljYXN0RmFjZXNNYXApCit7CisgIGlmIChtX2ludGVyZmFjZXMuZW1wdHkoKSkgeworICAgIEJPT1NUX1dBUk5fTUVTU0FHRShmYWxzZSwgIk5vIGludGVyZmFjZXMgYXZhaWxhYmxlIGZvciBwY2FwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHBlcmZvcm0gTXVsdGljYXN0RmFjZXNNYXAgdGVzdCIpOworICAgIHJldHVybjsKKyAgfQorCisgIEV0aGVybmV0RmFjdG9yeSBmYWN0b3J5OworICBzaGFyZWRfcHRyPEV0aGVybmV0RmFjZT4gZmFjZTEgPSBmYWN0b3J5LmNyZWF0ZU11bHRpY2FzdEZhY2UobV9pbnRlcmZhY2VzLmZyb250KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhlcm5ldDo6Z2V0QnJvYWRjYXN0QWRkcmVzcygpKTsKKyAgc2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+IGZhY2UxYmlzID0gZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKG1faW50ZXJmYWNlcy5mcm9udCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJuZXQ6OmdldEJyb2FkY2FzdEFkZHJlc3MoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLCBmYWNlMWJpcyk7CisKKyAgaWYgKG1faW50ZXJmYWNlcy5zaXplKCkgPiAxKSB7CisgICAgc2hhcmVkX3B0cjxFdGhlcm5ldEZhY2U+IGZhY2UyID0gZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKG1faW50ZXJmYWNlcy5iYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0OjpnZXRCcm9hZGNhc3RBZGRyZXNzKCkpOworICAgIEJPT1NUX0NIRUNLX05FKGZhY2UxLCBmYWNlMik7CisgIH0KKyAgZWxzZSB7CisgICAgQk9PU1RfV0FSTl9NRVNTQUdFKGZhbHNlLCAiT25seSBvbmUgaW50ZXJmYWNlIGF2YWlsYWJsZSBmb3IgcGNhcCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCB0ZXN0IHNlY29uZCBFdGhlcm5ldEZhY2UgY3JlYXRpb24iKTsKKyAgfQorCisgIHNoYXJlZF9wdHI8RXRoZXJuZXRGYWNlPiBmYWNlMyA9IGZhY3RvcnkuY3JlYXRlTXVsdGljYXN0RmFjZShtX2ludGVyZmFjZXMuZnJvbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhlcm5ldDo6Z2V0RGVmYXVsdE11bHRpY2FzdEFkZHJlc3MoKSk7CisgIEJPT1NUX0NIRUNLX05FKGZhY2UxLCBmYWNlMyk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNlbmRQYWNrZXQpCit7CisgIGlmIChtX2ludGVyZmFjZXMuZW1wdHkoKSkgeworICAgIEJPT1NUX1dBUk5fTUVTU0FHRShmYWxzZSwgIk5vIGludGVyZmFjZXMgYXZhaWxhYmxlIGZvciBwY2FwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHBlcmZvcm0gU2VuZFBhY2tldCB0ZXN0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgRXRoZXJuZXRGYWN0b3J5IGZhY3Rvcnk7CisgIHNoYXJlZF9wdHI8RXRoZXJuZXRGYWNlPiBmYWNlID0gZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKG1faW50ZXJmYWNlcy5mcm9udCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJuZXQ6OmdldERlZmF1bHRNdWx0aWNhc3RBZGRyZXNzKCkpOworCisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZSkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLT5pc0xvY2FsKCksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS0+aXNPbkRlbWFuZCgpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UtPmdldFJlbW90ZVVyaSgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICJldGhlcjovL1siICsgZXRoZXJuZXQ6OmdldERlZmF1bHRNdWx0aWNhc3RBZGRyZXNzKCkudG9TdHJpbmcoKSArICJdIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UtPmdldExvY2FsVXJpKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgImRldjovLyIgKyBtX2ludGVyZmFjZXMuZnJvbnQoKS5uYW1lKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS0+Z2V0Q291bnRlcnMoKS5nZXROSW5CeXRlcygpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS0+Z2V0Q291bnRlcnMoKS5nZXROT3V0Qnl0ZXMoKSwgMCk7CisKKyAgZmFjZS0+b25GYWlsICs9IFtdIChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKSB7IEJPT1NUX0ZBSUwocmVhc29uKTsgfTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDEgPSBtYWtlSW50ZXJlc3QoIm5kbjovVHBuekd2VzlSIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gICAgIGRhdGExICAgICA9IG1ha2VEYXRhKCJuZG46L0tmY3poVXFWaXgiKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QyID0gbWFrZUludGVyZXN0KCJuZG46L1FXaUlNZmo1c0wiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiAgICAgZGF0YTIgICAgID0gbWFrZURhdGEoIm5kbjovWE5CVjc5NmYiKTsKKworICBmYWNlLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0MSk7CisgIGZhY2UtPnNlbmREYXRhICAgICgqZGF0YTEgICAgKTsKKyAgZmFjZS0+c2VuZEludGVyZXN0KCppbnRlcmVzdDIpOworICBmYWNlLT5zZW5kRGF0YSAgICAoKmRhdGEyICAgICk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS0+Z2V0Q291bnRlcnMoKS5nZXROT3V0Qnl0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgMTQgKiA0ICsgLy8gNCBORE5MUCBoZWFkZXJzCisgICAgICAgICAgICAgICAgICAgIGludGVyZXN0MS0+d2lyZUVuY29kZSgpLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgIGRhdGExLT53aXJlRW5jb2RlKCkuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3QyLT53aXJlRW5jb2RlKCkuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgZGF0YTItPndpcmVFbmNvZGUoKS5zaXplKCkpOworCisvLyAgbV9pb1JlbWFpbmluZyA9IDQ7CisvLyAgbV9pb1NlcnZpY2UucnVuKCk7CisvLyAgbV9pb1NlcnZpY2UucmVzZXQoKTsKKworLy8gIEJPT1NUX1JFUVVJUkVfRVFVQUwobV9mYWNlMV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDEpOworLy8gIEJPT1NUX1JFUVVJUkVfRVFVQUwobV9mYWNlMV9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDEpOworLy8gIEJPT1NUX1JFUVVJUkVfRVFVQUwobV9mYWNlMl9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDEpOworLy8gIEJPT1NUX1JFUVVJUkVfRVFVQUwobV9mYWNlMl9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDEpOworCisvLyAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9mYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0Mi5nZXROYW1lKCkpOworLy8gIEJPT1NUX0NIRUNLX0VRVUFMKG1fZmFjZTFfcmVjZWl2ZWREYXRhcyAgICBbMF0uZ2V0TmFtZSgpLCBkYXRhMi5nZXROYW1lKCkpOworLy8gIEJPT1NUX0NIRUNLX0VRVUFMKG1fZmFjZTJfcmVjZWl2ZWRJbnRlcmVzdHNbMF0uZ2V0TmFtZSgpLCBpbnRlcmVzdDEuZ2V0TmFtZSgpKTsKKy8vICBCT09TVF9DSEVDS19FUVVBTChtX2ZhY2UyX3JlY2VpdmVkRGF0YXMgICAgWzBdLmdldE5hbWUoKSwgZGF0YTEuZ2V0TmFtZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUHJvY2Vzc0luY29taW5nUGFja2V0KQoreworICBpZiAobV9pbnRlcmZhY2VzLmVtcHR5KCkpIHsKKyAgICBCT09TVF9XQVJOX01FU1NBR0UoZmFsc2UsICJObyBpbnRlcmZhY2VzIGF2YWlsYWJsZSBmb3IgcGNhcCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwZXJmb3JtIFByb2Nlc3NJbmNvbWluZ1BhY2tldCB0ZXN0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgRXRoZXJuZXRGYWN0b3J5IGZhY3Rvcnk7CisgIHNoYXJlZF9wdHI8RXRoZXJuZXRGYWNlPiBmYWNlID0gZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKG1faW50ZXJmYWNlcy5mcm9udCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJuZXQ6OmdldERlZmF1bHRNdWx0aWNhc3RBZGRyZXNzKCkpOworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGZhY2UpKTsKKworICBzdGQ6OnZlY3RvcjxJbnRlcmVzdD4gcmVjSW50ZXJlc3RzOworICBzdGQ6OnZlY3RvcjxEYXRhPiAgICAgcmVjRGF0YXM7CisKKyAgZmFjZS0+b25GYWlsICAgICAgICAgICAgKz0gW10gKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pIHsgQk9PU1RfRkFJTChyZWFzb24pOyB9OworICBmYWNlLT5vblJlY2VpdmVJbnRlcmVzdCArPSBbJnJlY0ludGVyZXN0c10gKGNvbnN0IEludGVyZXN0JiBpKSB7IHJlY0ludGVyZXN0cy5wdXNoX2JhY2soaSk7IH07CisgIGZhY2UtPm9uUmVjZWl2ZURhdGEgICAgICs9IFsmcmVjRGF0YXNdICAgICAoY29uc3QgRGF0YSYgZCkgICAgIHsgcmVjRGF0YXMucHVzaF9iYWNrKGQpOyAgICAgfTsKKworICAvLyBjaGVjayB0aGF0IHBhY2tldCBkYXRhIGlzIG5vdCBhY2Nlc3NlZCBpZiBwY2FwIGRpZG4ndCBjYXB0dXJlIGFueXRoaW5nIChjYXBsZW4gPT0gMCkKKyAgc3RhdGljIGNvbnN0IHBjYXBfcGt0aGRyIGhlYWRlcjF7fTsKKyAgZmFjZS0+cHJvY2Vzc0luY29taW5nUGFja2V0KCZoZWFkZXIxLCBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS0+Z2V0Q291bnRlcnMoKS5nZXROSW5CeXRlcygpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVjSW50ZXJlc3RzLnNpemUoKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlY0RhdGFzLnNpemUoKSwgMCk7CisKKyAgLy8gcnVudCBmcmFtZSAodG9vIHNob3J0KQorICBzdGF0aWMgY29uc3QgcGNhcF9wa3RoZHIgaGVhZGVyMnt7fSwgZXRoZXJuZXQ6OkhEUl9MRU4gKyA2fTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFja2V0MltldGhlcm5ldDo6SERSX0xFTiArIDZde307CisgIGZhY2UtPnByb2Nlc3NJbmNvbWluZ1BhY2tldCgmaGVhZGVyMiwgcGFja2V0Mik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UtPmdldENvdW50ZXJzKCkuZ2V0TkluQnl0ZXMoKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlY0ludGVyZXN0cy5zaXplKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTChyZWNEYXRhcy5zaXplKCksIDApOworCisgIC8vIHZhbGlkIGZyYW1lLCBidXQgVExWIGJsb2NrIGhhcyBpbnZhbGlkIGxlbmd0aAorICBzdGF0aWMgY29uc3QgcGNhcF9wa3RoZHIgaGVhZGVyM3t7fSwgZXRoZXJuZXQ6OkhEUl9MRU4gKyBldGhlcm5ldDo6TUlOX0RBVEFfTEVOfTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFja2V0M1tldGhlcm5ldDo6SERSX0xFTiArIGV0aGVybmV0OjpNSU5fREFUQV9MRU5deworICAgIDB4MDEsIDB4MDAsIDB4NWUsIDB4MDAsIDB4MTcsIDB4YWEsIC8vIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAvLyBzb3VyY2UgYWRkcmVzcworICAgIDB4ODYsIDB4MjQsICAgICAgIC8vIE5ETiBldGhlcnR5cGUKKyAgICB0bHY6Ok5kbmxwRGF0YSwgICAvLyBUTFYgdHlwZQorICAgIDB4ZmQsIDB4ZmYsIDB4ZmYgIC8vIFRMViBsZW5ndGggKGludmFsaWQgYmVjYXVzZSBncmVhdGVyIHRoYW4gYnVmZmVyIHNpemUpCisgIH07CisgIGZhY2UtPnByb2Nlc3NJbmNvbWluZ1BhY2tldCgmaGVhZGVyMywgcGFja2V0Myk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UtPmdldENvdW50ZXJzKCkuZ2V0TkluQnl0ZXMoKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlY0ludGVyZXN0cy5zaXplKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTChyZWNEYXRhcy5zaXplKCksIDApOworCisgIC8vIHZhbGlkIGZyYW1lLCBidXQgVExWIGJsb2NrIGhhcyBpbnZhbGlkIHR5cGUKKyAgc3RhdGljIGNvbnN0IHBjYXBfcGt0aGRyIGhlYWRlcjR7e30sIGV0aGVybmV0OjpIRFJfTEVOICsgZXRoZXJuZXQ6Ok1JTl9EQVRBX0xFTn07CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhY2tldDRbZXRoZXJuZXQ6OkhEUl9MRU4gKyBldGhlcm5ldDo6TUlOX0RBVEFfTEVOXXsKKyAgICAweDAxLCAweDAwLCAweDVlLCAweDAwLCAweDE3LCAweGFhLCAvLyBkZXN0aW5hdGlvbiBhZGRyZXNzCisgICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgLy8gc291cmNlIGFkZHJlc3MKKyAgICAweDg2LCAweDI0LCAgICAgICAvLyBORE4gZXRoZXJ0eXBlCisgICAgMHgwMCwgICAgICAgICAgICAgLy8gVExWIHR5cGUgKGludmFsaWQpCisgICAgMHgwMCAgICAgICAgICAgICAgLy8gVExWIGxlbmd0aAorICB9OworICBmYWNlLT5wcm9jZXNzSW5jb21pbmdQYWNrZXQoJmhlYWRlcjQsIHBhY2tldDQpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLT5nZXRDb3VudGVycygpLmdldE5JbkJ5dGVzKCksIDIpOworICBCT09TVF9DSEVDS19FUVVBTChyZWNJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVjRGF0YXMuc2l6ZSgpLCAwKTsKKworICAvLyB2YWxpZCBmcmFtZSBhbmQgdmFsaWQgTkROTFAgaGVhZGVyLCBidXQgaW52YWxpZCBwYXlsb2FkCisgIHN0YXRpYyBjb25zdCBwY2FwX3BrdGhkciBoZWFkZXI1e3t9LCBldGhlcm5ldDo6SERSX0xFTiArIGV0aGVybmV0OjpNSU5fREFUQV9MRU59OworICBzdGF0aWMgY29uc3QgdWludDhfdCBwYWNrZXQ1W2V0aGVybmV0OjpIRFJfTEVOICsgZXRoZXJuZXQ6Ok1JTl9EQVRBX0xFTl17CisgICAgMHgwMSwgMHgwMCwgMHg1ZSwgMHgwMCwgMHgxNywgMHhhYSwgLy8gZGVzdGluYXRpb24gYWRkcmVzcworICAgIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIC8vIHNvdXJjZSBhZGRyZXNzCisgICAgMHg4NiwgMHgyNCwgICAgICAgICAgICAgICAgICAgLy8gTkROIGV0aGVydHlwZQorICAgIHRsdjo6TmRubHBEYXRhLCAgICAgMHgwZSwgICAgIC8vIE5ETkxQIGhlYWRlcgorICAgIHRsdjo6TmRubHBTZXF1ZW5jZSwgMHgwOCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIHRsdjo6TmRubHBQYXlsb2FkLCAgMHgwMiwKKyAgICAweDAwLCAgICAgICAgICAgICAvLyBORE4gVExWIHR5cGUgKGludmFsaWQpCisgICAgMHgwMCAgICAgICAgICAgICAgLy8gTkROIFRMViBsZW5ndGgKKyAgfTsKKyAgZmFjZS0+cHJvY2Vzc0luY29taW5nUGFja2V0KCZoZWFkZXI1LCBwYWNrZXQ1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS0+Z2V0Q291bnRlcnMoKS5nZXROSW5CeXRlcygpLCAxOCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlY0ludGVyZXN0cy5zaXplKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTChyZWNEYXRhcy5zaXplKCksIDApOworCisgIC8vIHZhbGlkIGZyYW1lLCB2YWxpZCBORE5MUCBoZWFkZXIsIGFuZCB2YWxpZCBORE4gKGludGVyZXN0KSBwYWNrZXQKKyAgc3RhdGljIGNvbnN0IHBjYXBfcGt0aGRyIGhlYWRlcjZ7e30sIGV0aGVybmV0OjpIRFJfTEVOICsgZXRoZXJuZXQ6Ok1JTl9EQVRBX0xFTn07CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhY2tldDZbZXRoZXJuZXQ6OkhEUl9MRU4gKyBldGhlcm5ldDo6TUlOX0RBVEFfTEVOXXsKKyAgICAweDAxLCAweDAwLCAweDVlLCAweDAwLCAweDE3LCAweGFhLCAvLyBkZXN0aW5hdGlvbiBhZGRyZXNzCisgICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgLy8gc291cmNlIGFkZHJlc3MKKyAgICAweDg2LCAweDI0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORE4gZXRoZXJ0eXBlCisgICAgdGx2OjpOZG5scERhdGEsIDB4MjQsICAgICAgICAgICAgICAgLy8gTkROTFAgVExWIHR5cGUgYW5kIGxlbmd0aAorICAgIDB4NTEsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIHJlc3Qgb2YgTkROTFAgaGVhZGVyCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NCwgMHgxOCwKKyAgICB0bHY6OkludGVyZXN0LCAweDE2LCAgICAgICAgICAgICAgICAvLyBORE4gVExWIHR5cGUgYW5kIGxlbmd0aAorICAgIDB4MDcsIDB4MGUsIDB4MDgsIDB4MDcsIDB4NjUsIDB4NzgsIC8vIHBheWxvYWQKKyAgICAweDYxLCAweDZkLCAweDcwLCAweDZjLCAweDY1LCAweDA4LAorICAgIDB4MDMsIDB4NjYsIDB4NmYsIDB4NmYsIDB4MGEsIDB4MDQsCisgICAgMHgwMywgMHhlZiwgMHhlOSwgMHg3YworICB9OworICBmYWNlLT5wcm9jZXNzSW5jb21pbmdQYWNrZXQoJmhlYWRlcjYsIHBhY2tldDYpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLT5nZXRDb3VudGVycygpLmdldE5JbkJ5dGVzKCksIDU2KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVjSW50ZXJlc3RzLnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlY0RhdGFzLnNpemUoKSwgMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvZmFjZS1jb3VudGVycy5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvZmFjZS1jb3VudGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlMGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9mYWNlLWNvdW50ZXJzLmNwcApAQCAtMCwwICsxLDc5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImZhY2UvZmFjZS1jb3VudGVycy5ocHAiCisjaW5jbHVkZSAiZHVtbXktZmFjZS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEZhY2VGYWNlQ291bnRlcnMsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShQYWNrZXRDbnQpCit7CisgIFBhY2tldENvdW50ZXIgY291bnRlcjsKKworICB1aW50NjRfdCBvYnNlcnZhdGlvbiA9IGNvdW50ZXI7Ly9pbXBsaWNpdCBjb252ZXJ0aWJsZQorICBCT09TVF9DSEVDS19FUVVBTChvYnNlcnZhdGlvbiwgMCk7CisKKyAgKytjb3VudGVyOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxpbnQ+KGNvdW50ZXIpLCAxKTsKKyAgKytjb3VudGVyOworICArK2NvdW50ZXI7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PGludD4oY291bnRlciksIDMpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCeXRlQ250KQoreworICBCeXRlQ291bnRlciBjb3VudGVyOworCisgIHVpbnQ2NF90IG9ic2VydmF0aW9uID0gY291bnRlcjsvL2ltcGxpY2l0IGNvbnZlcnRpYmxlCisgIEJPT1NUX0NIRUNLX0VRVUFMKG9ic2VydmF0aW9uLCAwKTsKKworICBjb3VudGVyICs9IDIwOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxpbnQ+KGNvdW50ZXIpLCAyMCk7CisgIGNvdW50ZXIgKz0gODA7CisgIGNvdW50ZXIgKz0gOTA7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PGludD4oY291bnRlciksIDE5MCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENvdW50ZXJzKQoreworICBEdW1teUZhY2UgZmFjZTsKKyAgY29uc3QgRmFjZUNvdW50ZXJzJiBjb3VudGVycyA9IGZhY2UuZ2V0Q291bnRlcnMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMuZ2V0TkluSW50ZXJlc3RzKCkgLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMuZ2V0TkluRGF0YXMoKSAgICAgLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMuZ2V0Tk91dEludGVyZXN0cygpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMuZ2V0Tk91dERhdGFzKCkgICAgLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMuZ2V0TkluQnl0ZXMoKSAgICAgLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMuZ2V0Tk91dEJ5dGVzKCkgICAgLCAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vZmFjZS9mYWNlLmNwcCBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9mYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNkZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL2ZhY2UuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImZhY2UvZmFjZS5ocHAiCisjaW5jbHVkZSAiZmFjZS9sb2NhbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJkdW1teS1mYWNlLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoRmFjZUZhY2UsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShEZXNjcmlwdGlvbikKK3sKKyAgRHVtbXlGYWNlIGZhY2U7CisgIGZhY2Uuc2V0RGVzY3JpcHRpb24oIjNwRnNLcnZXciIpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLmdldERlc2NyaXB0aW9uKCksICIzcEZzS3J2V3IiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZCkKK3sKKyAgRHVtbXlMb2NhbEZhY2UgZmFjZTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZCgpLCBmYWxzZSk7CisKKyAgZmFjZS5zZXRMb2NhbENvbnRyb2xIZWFkZXJGZWF0dXJlKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lELCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UuaXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lEKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UuaXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMX0NPTlRST0xfRkVBVFVSRV9ORVhUX0hPUF9GQUNFX0lEKSwgZmFsc2UpOworCisgIGZhY2Uuc2V0TG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZShMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZCgpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UuaXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lEKSwgZmFsc2UpOworfQorCitjbGFzcyBGYWNlRmFpbFRlc3RGYWNlIDogcHVibGljIER1bW15RmFjZQoreworcHVibGljOgorICBGYWNlRmFpbFRlc3RGYWNlKCkKKyAgICA6IGZhaWxDb3VudCgwKQorICB7CisgICAgdGhpcy0+b25GYWlsICs9IGJpbmQoJkZhY2VGYWlsVGVzdEZhY2U6OmZhaWxIYW5kbGVyLCB0aGlzLCBfMSk7CisgIH0KKworICB2b2lkCisgIGZhaWxPbmNlKCkKKyAgeworICAgIHRoaXMtPmZhaWwoInJlYXNvbiIpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQKKyAgZmFpbEhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbikKKyAgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlYXNvbiwgInJlYXNvbiIpOworICAgICsrdGhpcy0+ZmFpbENvdW50OworICB9CisKK3B1YmxpYzoKKyAgaW50IGZhaWxDb3VudDsKK307CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEZhaWxUd2ljZSkKK3sKKyAgRmFjZUZhaWxUZXN0RmFjZSBmYWNlOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLmZhaWxDb3VudCwgMCk7CisgIGZhY2UuZmFpbE9uY2UoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZS5mYWlsQ291bnQsIDEpOworICBmYWNlLmZhaWxPbmNlKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UuZmFpbENvdW50LCAxKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vZmFjZS9uZG5scC5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvbmRubHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmE4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvbmRubHAuY3BwCkBAIC0wLDAgKzEsMjMyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAiZmFjZS9uZG5scC1zZXF1ZW5jZS1nZW5lcmF0b3IuaHBwIgorI2luY2x1ZGUgImZhY2UvbmRubHAtc2xpY2VyLmhwcCIKKyNpbmNsdWRlICJmYWNlL25kbmxwLXBhcnRpYWwtbWVzc2FnZS1zdG9yZS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGYWNlTmRubHAsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXF1ZW5jZUJsb2NrKQoreworICBuZG5scDo6U2VxdWVuY2VCbG9jayBzYigweDgwMDAsIDIpOworICBCT09TVF9DSEVDS19FUVVBTChzYi5jb3VudCgpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2JbMF0sIDB4ODAwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNiWzFdLCAweDgwMDEpOworICBCT09TVF9DSEVDS19USFJPVyhzYlsyXSwgc3RkOjpvdXRfb2ZfcmFuZ2UpOworfQorCisvLyBzZXF1ZW5jZSBudW1iZXIgY2FuIHNhZmVseSB3cmFwIGFyb3VuZAorQk9PU1RfQVVUT19URVNUX0NBU0UoU2VxdWVuY2VCbG9ja1dyYXApCit7CisgIG5kbmxwOjpTZXF1ZW5jZUJsb2NrIHNiKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNiWzBdLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICBCT09TVF9DSEVDS19FUVVBTChzYlsxXSwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1pbigpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2JbMV0gLSBzYlswXSwgMSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcXVlbmNlR2VuZXJhdG9yKQoreworICBuZG5scDo6U2VxdWVuY2VHZW5lcmF0b3Igc2VxZ2VuOworCisgIG5kbmxwOjpTZXF1ZW5jZUJsb2NrIHNiMSA9IHNlcWdlbi5uZXh0QmxvY2soMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNiMS5jb3VudCgpLCAyKTsKKworICBuZG5scDo6U2VxdWVuY2VCbG9jayBzYjIgPSBzZXFnZW4ubmV4dEJsb2NrKDEpOworICBCT09TVF9DSEVDS19ORShzYjFbMF0sIHNiMlswXSk7CisgIEJPT1NUX0NIRUNLX05FKHNiMVsxXSwgc2IyWzBdKTsKK30KKworLy8gc2xpY2UgYSBCbG9jayB0byBvbmUgTkROTFAgcGFja2V0CitCT09TVF9BVVRPX1RFU1RfQ0FTRShTbGljZTEpCit7CisgIHVpbnQ4X3QgYmxvY2tWYWx1ZVs2MF07CisgIG1lbXNldChibG9ja1ZhbHVlLCAweGNjLCBzaXplb2YoYmxvY2tWYWx1ZSkpOworICBCbG9jayBibG9jayA9IG5kbjo6ZGF0YUJsb2NrKDB4MDEsIGJsb2NrVmFsdWUsIHNpemVvZihibG9ja1ZhbHVlKSk7CisKKyAgbmRubHA6OlNsaWNlciBzbGljZXIoOTAwMCk7CisgIG5kbmxwOjpQYWNrZXRBcnJheSBwYSA9IHNsaWNlci5zbGljZShibG9jayk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChwYS0+c2l6ZSgpLCAxKTsKKworICBjb25zdCBCbG9jayYgcGt0ID0gcGEtPmF0KDApOworICBCT09TVF9DSEVDS19FUVVBTChwa3QudHlwZSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGx2OjpOZG5scERhdGEpKTsKKyAgcGt0LnBhcnNlKCk7CisKKyAgY29uc3QgQmxvY2s6OmVsZW1lbnRfY29udGFpbmVyJiBlbGVtZW50cyA9IHBrdC5lbGVtZW50cygpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGVsZW1lbnRzLnNpemUoKSwgMik7CisKKyAgY29uc3QgQmxvY2smIHNlcXVlbmNlRWxlbWVudCA9IGVsZW1lbnRzWzBdOworICBCT09TVF9DSEVDS19FUVVBTChzZXF1ZW5jZUVsZW1lbnQudHlwZSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGx2OjpOZG5scFNlcXVlbmNlKSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc2VxdWVuY2VFbGVtZW50LnZhbHVlX3NpemUoKSwgc2l6ZW9mKHVpbnQ2NF90KSk7CisKKyAgY29uc3QgQmxvY2smIHBheWxvYWRFbGVtZW50ID0gZWxlbWVudHNbMV07CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBheWxvYWRFbGVtZW50LnR5cGUoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRsdjo6TmRubHBQYXlsb2FkKSk7CisgIHNpemVfdCBwYXlsb2FkU2l6ZSA9IHBheWxvYWRFbGVtZW50LnZhbHVlX3NpemUoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGF5bG9hZFNpemUsIGJsb2NrLnNpemUoKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUxfQ09MTEVDVElPTlMocGF5bG9hZEVsZW1lbnQudmFsdWVfYmVnaW4oKSwgcGF5bG9hZEVsZW1lbnQudmFsdWVfZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmJlZ2luKCksICAgICAgICAgICAgICAgIGJsb2NrLmVuZCgpKTsKK30KKworLy8gc2xpY2UgYSBCbG9jayB0byBmb3VyIE5ETkxQIHBhY2tldHMKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNsaWNlNCkKK3sKKyAgdWludDhfdCBibG9ja1ZhbHVlWzUwNTBdOworICBtZW1zZXQoYmxvY2tWYWx1ZSwgMHhjYywgc2l6ZW9mKGJsb2NrVmFsdWUpKTsKKyAgQmxvY2sgYmxvY2sgPSBuZG46OmRhdGFCbG9jaygweDAxLCBibG9ja1ZhbHVlLCBzaXplb2YoYmxvY2tWYWx1ZSkpOworCisgIG5kbmxwOjpTbGljZXIgc2xpY2VyKDE1MDApOworICBuZG5scDo6UGFja2V0QXJyYXkgcGEgPSBzbGljZXIuc2xpY2UoYmxvY2spOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwocGEtPnNpemUoKSwgNCk7CisKKyAgdWludDY0X3Qgc2VxMCA9IDB4ZGRkZDsKKworICBzaXplX3QgdG90YWxQYXlsb2FkU2l6ZSA9IDA7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBCbG9jayYgcGt0ID0gcGEtPmF0KGkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHBrdC50eXBlKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bHY6Ok5kbmxwRGF0YSkpOworICAgIHBrdC5wYXJzZSgpOworCisgICAgY29uc3QgQmxvY2s6OmVsZW1lbnRfY29udGFpbmVyJiBlbGVtZW50cyA9IHBrdC5lbGVtZW50cygpOworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZWxlbWVudHMuc2l6ZSgpLCA0KTsKKworICAgIGNvbnN0IEJsb2NrJiBzZXF1ZW5jZUVsZW1lbnQgPSBlbGVtZW50c1swXTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzZXF1ZW5jZUVsZW1lbnQudHlwZSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGx2OjpOZG5scFNlcXVlbmNlKSk7CisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChzZXF1ZW5jZUVsZW1lbnQudmFsdWVfc2l6ZSgpLCBzaXplb2YodWludDY0X3QpKTsKKyAgICB1aW50NjRfdCBzZXEgPSBiZTY0dG9oKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYqc2VxdWVuY2VFbGVtZW50LnZhbHVlX2JlZ2luKCkpKTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBzZXEwID0gc2VxOworICAgIH0KKyAgICBCT09TVF9DSEVDS19FUVVBTChzZXEsIHNlcTAgKyBpKTsKKworICAgIGNvbnN0IEJsb2NrJiBmcmFnSW5kZXhFbGVtZW50ID0gZWxlbWVudHNbMV07CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZnJhZ0luZGV4RWxlbWVudC50eXBlKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bHY6Ok5kbmxwRnJhZ0luZGV4KSk7CisgICAgdWludDY0X3QgZnJhZ0luZGV4ID0gbmRuOjpyZWFkTm9uTmVnYXRpdmVJbnRlZ2VyKGZyYWdJbmRleEVsZW1lbnQpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZyYWdJbmRleCwgaSk7CisKKyAgICBjb25zdCBCbG9jayYgZnJhZ0NvdW50RWxlbWVudCA9IGVsZW1lbnRzWzJdOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZyYWdDb3VudEVsZW1lbnQudHlwZSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGx2OjpOZG5scEZyYWdDb3VudCkpOworICAgIHVpbnQ2NF90IGZyYWdDb3VudCA9IG5kbjo6cmVhZE5vbk5lZ2F0aXZlSW50ZWdlcihmcmFnQ291bnRFbGVtZW50KTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChmcmFnQ291bnQsIDQpOworCisgICAgY29uc3QgQmxvY2smIHBheWxvYWRFbGVtZW50ID0gZWxlbWVudHNbM107CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwocGF5bG9hZEVsZW1lbnQudHlwZSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGx2OjpOZG5scFBheWxvYWQpKTsKKyAgICBzaXplX3QgcGF5bG9hZFNpemUgPSBwYXlsb2FkRWxlbWVudC52YWx1ZV9zaXplKCk7CisgICAgdG90YWxQYXlsb2FkU2l6ZSArPSBwYXlsb2FkU2l6ZTsKKyAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvdGFsUGF5bG9hZFNpemUsIGJsb2NrLnNpemUoKSk7Cit9CisKK2NsYXNzIFJlYXNzZW1ibGVGaXh0dXJlIDogcHJvdGVjdGVkIEJhc2VGaXh0dXJlCit7Citwcm90ZWN0ZWQ6CisgIFJlYXNzZW1ibGVGaXh0dXJlKCkKKyAgICA6IG1fc2xpY2VyKDE1MDApCisgIHsKKyAgICBtX3BhcnRpYWxNZXNzYWdlU3RvcmUub25SZWNlaXZlICs9CisgICAgICAvLyBwdXNoX2JhY2sgaW4gQysrMTEgaGFzIDIgb3ZlcmxvYWRzLCBhbmQgc3BlY2lmaWMgdmVyc2lvbiBuZWVkcyB0byBiZSBzZWxlY3RlZAorICAgICAgYmluZChzdGF0aWNfY2FzdDx2b2lkIChzdGQ6OnZlY3RvcjxCbG9jaz46OiopKGNvbnN0IEJsb2NrJik+KCZzdGQ6OnZlY3RvcjxCbG9jaz46OnB1c2hfYmFjayksCisgICAgICAgICAgICZtX3JlY2VpdmVkLCBfMSk7CisgIH0KKworICBCbG9jaworICBtYWtlQmxvY2soc2l6ZV90IHZhbHVlTGVuZ3RoKQorICB7CisgICAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiBibG9ja1ZhbHVlKG5ldyB1aW50OF90W3ZhbHVlTGVuZ3RoXSk7CisgICAgbWVtc2V0KGJsb2NrVmFsdWUuZ2V0KCksIDB4Y2MsIHZhbHVlTGVuZ3RoKTsKKyAgICByZXR1cm4gbmRuOjpkYXRhQmxvY2soMHgwMSwgYmxvY2tWYWx1ZS5nZXQoKSwgdmFsdWVMZW5ndGgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgbmRubHA6OlNsaWNlciBtX3NsaWNlcjsKKyAgbmRubHA6OlBhcnRpYWxNZXNzYWdlU3RvcmUgbV9wYXJ0aWFsTWVzc2FnZVN0b3JlOworCisgIC8vIHJlY2VpdmVkIG5ldHdvcmsgbGF5ZXIgcGFja2V0cworICBzdGQ6OnZlY3RvcjxCbG9jaz4gbV9yZWNlaXZlZDsKK307CisKKy8vIHJlYXNzZW1ibGUgb25lIE5ETkxQIHBhY2tldHMgaW50byBvbmUgQmxvY2sKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFJlYXNzZW1ibGUxLCBSZWFzc2VtYmxlRml4dHVyZSkKK3sKKyAgQmxvY2sgYmxvY2sgPSBtYWtlQmxvY2soNjApOworICBuZG5scDo6UGFja2V0QXJyYXkgcGEgPSBtX3NsaWNlci5zbGljZShibG9jayk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwocGEtPnNpemUoKSwgMSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9yZWNlaXZlZC5zaXplKCksIDApOworICBtX3BhcnRpYWxNZXNzYWdlU3RvcmUucmVjZWl2ZU5kbmxwRGF0YShwYS0+YXQoMCkpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwobV9yZWNlaXZlZC5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTF9DT0xMRUNUSU9OUyhtX3JlY2VpdmVkLmF0KDApLmJlZ2luKCksIG1fcmVjZWl2ZWQuYXQoMCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmJlZ2luKCksICAgICAgICAgICAgYmxvY2suZW5kKCkpOworfQorCisvLyByZWFzc2VtYmxlIGZvdXIgYW5kIHR3byBORE5MUCBwYWNrZXRzIGludG8gdHdvIEJsb2NrcworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVhc3NlbWJsZTRhbmQyLCBSZWFzc2VtYmxlRml4dHVyZSkKK3sKKyAgQmxvY2sgYmxvY2sgPSBtYWtlQmxvY2soNTA1MCk7CisgIG5kbmxwOjpQYWNrZXRBcnJheSBwYSA9IG1fc2xpY2VyLnNsaWNlKGJsb2NrKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChwYS0+c2l6ZSgpLCA0KTsKKworICBCbG9jayBibG9jazIgPSBtYWtlQmxvY2soMjAwMCk7CisgIG5kbmxwOjpQYWNrZXRBcnJheSBwYTIgPSBtX3NsaWNlci5zbGljZShibG9jazIpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHBhMi0+c2l6ZSgpLCAyKTsKKworICBCT09TVF9DSEVDS19FUVVBTChtX3JlY2VpdmVkLnNpemUoKSwgMCk7CisgIG1fcGFydGlhbE1lc3NhZ2VTdG9yZS5yZWNlaXZlTmRubHBEYXRhKHBhLT5hdCgwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1fcmVjZWl2ZWQuc2l6ZSgpLCAwKTsKKyAgbV9wYXJ0aWFsTWVzc2FnZVN0b3JlLnJlY2VpdmVOZG5scERhdGEocGEtPmF0KDEpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9yZWNlaXZlZC5zaXplKCksIDApOworICBtX3BhcnRpYWxNZXNzYWdlU3RvcmUucmVjZWl2ZU5kbmxwRGF0YShwYTItPmF0KDEpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9yZWNlaXZlZC5zaXplKCksIDApOworICBtX3BhcnRpYWxNZXNzYWdlU3RvcmUucmVjZWl2ZU5kbmxwRGF0YShwYS0+YXQoMSkpOworICBCT09TVF9DSEVDS19FUVVBTChtX3JlY2VpdmVkLnNpemUoKSwgMCk7CisgIG1fcGFydGlhbE1lc3NhZ2VTdG9yZS5yZWNlaXZlTmRubHBEYXRhKHBhMi0+YXQoMCkpOworICBCT09TVF9DSEVDS19FUVVBTChtX3JlY2VpdmVkLnNpemUoKSwgMSk7CisgIG1fcGFydGlhbE1lc3NhZ2VTdG9yZS5yZWNlaXZlTmRubHBEYXRhKHBhLT5hdCgzKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1fcmVjZWl2ZWQuc2l6ZSgpLCAxKTsKKyAgbV9wYXJ0aWFsTWVzc2FnZVN0b3JlLnJlY2VpdmVOZG5scERhdGEocGEtPmF0KDIpKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKG1fcmVjZWl2ZWQuc2l6ZSgpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUxfQ09MTEVDVElPTlMobV9yZWNlaXZlZC5hdCgxKS5iZWdpbigpLCBtX3JlY2VpdmVkLmF0KDEpLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay5iZWdpbigpLCAgICAgICAgICAgIGJsb2NrLmVuZCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUxfQ09MTEVDVElPTlMobV9yZWNlaXZlZC5hdCgwKS5iZWdpbigpLCBtX3JlY2VpdmVkLmF0KDApLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazIuYmVnaW4oKSwgICAgICAgICAgIGJsb2NrMi5lbmQoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvbnVsbC5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvbnVsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5MDQxMAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9udWxsLmNwcApAQCAtMCwwICsxLDUxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZmFjZS9udWxsLWZhY2UuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGYWNlTnVsbCwgQmFzZUZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNlbmQpCit7CisgIHNoYXJlZF9wdHI8TnVsbEZhY2U+IGZhY2UgPSBtYWtlX3NoYXJlZDxOdWxsRmFjZT4oKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2VJbnRlcmVzdCgiL0EiKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coZmFjZS0+c2VuZEludGVyZXN0KCppbnRlcmVzdCkpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKCIvQiIpOworICBCT09TVF9DSEVDS19OT19USFJPVyhmYWNlLT5zZW5kRGF0YSgqZGF0YSkpOworCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKGZhY2UtPmNsb3NlKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3BhY2tldC1kYXRhc2V0cy5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvcGFja2V0LWRhdGFzZXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY2MWRiCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3BhY2tldC1kYXRhc2V0cy5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInBhY2tldC1kYXRhc2V0cy5ocHAiCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKERhdGFzZXRzLCBCYXNlRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ29ycnVwdGVkKQoreworICB7CisgICAgdHlwZWRlZiBDb3JydXB0ZWRJbnRlcmVzdCBEYXRhc2V0OworICAgIERhdGFzZXQgZGF0YXNldDsKKworICAgIEJPT1NUX0ZPUkVBQ0goRGF0YXNldDo6Q29udGFpbmVyOjp2YWx1ZV90eXBlJiBkYXRhLCBkYXRhc2V0LmRhdGEpCisgICAgICB7CisgICAgICAgIEJsb2NrIGJsb2NrKGRhdGEuYnVmKCksIGRhdGEuc2l6ZSgpKTsKKworICAgICAgICBCT09TVF9DSEVDS19USFJPVygoSW50ZXJlc3QoYmxvY2spKSwgdGx2OjpFcnJvcik7CisgICAgICB9CisgIH0KKworICB7CisgICAgdHlwZWRlZiBDb3JydXB0ZWRJbnRlcmVzdFdpdGhMb2NhbENvbnRyb2xIZWFkZXIgRGF0YXNldDsKKyAgICBEYXRhc2V0IGRhdGFzZXQ7CisKKyAgICBCT09TVF9GT1JFQUNIKERhdGFzZXQ6OkNvbnRhaW5lcjo6dmFsdWVfdHlwZSYgZGF0YSwgZGF0YXNldC5kYXRhKQorICAgICAgeworICAgICAgICBCbG9jayBibG9jayhkYXRhLmJ1ZigpLCBkYXRhLnNpemUoKSk7CisKKyAgICAgICAgQk9PU1RfQ0hFQ0tfVEhST1cobmRuOjpuZmQ6OkxvY2FsQ29udHJvbEhlYWRlcjo6Z2V0UGF5bG9hZChibG9jayksIHRsdjo6RXJyb3IpOworICAgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvcGFja2V0LWRhdGFzZXRzLmhwcCBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS9wYWNrZXQtZGF0YXNldHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2Y0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvcGFja2V0LWRhdGFzZXRzLmhwcApAQCAtMCwwICsxLDkxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9URVNUU19EQUVNT05fRkFDRV9QQUNLRVRfREFUQVNFVFNfSFBQCisjZGVmaW5lIE5GRF9URVNUU19EQUVNT05fRkFDRV9QQUNLRVRfREFUQVNFVFNfSFBQCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworY2xhc3MgQ29ycnVwdGVkSW50ZXJlc3RXaXRoTG9jYWxDb250cm9sSGVhZGVyCit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8bmRuOjpCdWZmZXI+IENvbnRhaW5lcjsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcKKyAgZ2V0TmFtZSgpCisgIHsKKyAgICByZXR1cm4gIkNvcnJ1cHRlZEludGVyZXN0V2l0aExvY2FsQ29udHJvbEhlYWRlciI7CisgIH0KKworICBDb3JydXB0ZWRJbnRlcmVzdFdpdGhMb2NhbENvbnRyb2xIZWFkZXIoKQorICB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW50ZXJlc3RbXSA9IHsKKyAgICAgIDB4NTAsIDB4MjIsIDB4NTEsIDB4ODEsIDB4MGEsIDB4MDUsIDB4MWQsIDB4MDcsIDB4MTQsIDB4MDgsIDB4MDUsIDB4NmMsIDB4NmYsIDB4NjMsIDB4NjEsCisgICAgICAweDZjLCAweDA4LCAweDAzLCAweDZlLCAweDY0LCAweDZlLCAweDA4LCAweDA2LCAweDcwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LCAweDc4LCAweDA5LAorICAgICAgMHgwMiwgMHgxMiwgMHgwMCwgMHgwYSwgMHgwMSwgMHgwMQorICAgIH07CisKKyAgICBkYXRhLnB1c2hfYmFjayhuZG46OkJ1ZmZlcihpbnRlcmVzdCwgc2l6ZW9mKGludGVyZXN0KSkpOworICB9CitwdWJsaWM6CisgIENvbnRhaW5lciBkYXRhOworfTsKKworY2xhc3MgQ29ycnVwdGVkSW50ZXJlc3QKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxuZG46OkJ1ZmZlcj4gQ29udGFpbmVyOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZworICBnZXROYW1lKCkKKyAgeworICAgIHJldHVybiAiQ29ycnVwdGVkSW50ZXJlc3QiOworICB9CisKKyAgQ29ycnVwdGVkSW50ZXJlc3QoKQorICB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW50ZXJlc3RbXSA9IHsKKyAgICAgIDB4MDUsIDB4MWQsIDB4MDcsIDB4ODQsIDB4MDgsIDB4MDUsIDB4NmMsIDB4NmYsIDB4NjMsIDB4NjEsIDB4NmMsIDB4MDgsIDB4MDMsIDB4NmUsIDB4NjQsCisgICAgICAweDZlLCAweDA4LCAweDA2LCAweDcwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LCAweDc4LCAweDA5LCAweDAyLCAweDEyLCAweDAwLCAweDBhLCAweDAxLAorICAgICAgMHgwMQorICAgIH07CisKKyAgICBkYXRhLnB1c2hfYmFjayhuZG46OkJ1ZmZlcihpbnRlcmVzdCwgc2l6ZW9mKGludGVyZXN0KSkpOworICB9CitwdWJsaWM6CisgIENvbnRhaW5lciBkYXRhOworfTsKKworCit0eXBlZGVmIGJvb3N0OjptcGw6OnZlY3RvcjwgQ29ycnVwdGVkSW50ZXJlc3RXaXRoTG9jYWxDb250cm9sSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcnJ1cHRlZEludGVyZXN0PiBDb3JydXB0ZWRQYWNrZXRzOworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfVEVTVFNfREFFTU9OX0ZBQ0VfUEFDS0VUX0RBVEFTRVRTX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3RjcC5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvdGNwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhlMzNiCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3RjcC5jcHAKQEAgLTAsMCArMSw3NzMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJmYWNlL3RjcC1mYWN0b3J5LmhwcCIKKyNpbmNsdWRlICJjb3JlL3Jlc29sdmVyLmhwcCIKKyNpbmNsdWRlICJjb3JlL25ldHdvcmstaW50ZXJmYWNlLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSAidGVzdHMvbGltaXRlZC1pby5ocHAiCisjaW5jbHVkZSAiZHVtbXktc3RyZWFtLXNlbmRlci5ocHAiCisjaW5jbHVkZSAicGFja2V0LWRhdGFzZXRzLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoRmFjZVRjcCwgQmFzZUZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENoYW5uZWxNYXApCit7CisgIFRjcEZhY3RvcnkgZmFjdG9yeTsKKworICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsMWEgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMSIsICIyMDA3MCIpOworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMSwgY2hhbm5lbDFhKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPmdldFVyaSgpLnRvU3RyaW5nKCksICJ0Y3A0Oi8vMTI3LjAuMC4xOjIwMDcwIik7CisKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisgIEJPT1NUX0NIRUNLX05FKGNoYW5uZWwxLCBjaGFubmVsMik7CisKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsMyA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiOjoxIiwgIjIwMDcxIik7CisgIEJPT1NUX0NIRUNLX05FKGNoYW5uZWwyLCBjaGFubmVsMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNoYW5uZWwzLT5nZXRVcmkoKS50b1N0cmluZygpLCAidGNwNjovL1s6OjFdOjIwMDcxIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEdldENoYW5uZWxzKQoreworICBUY3BGYWN0b3J5IGZhY3Rvcnk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjdG9yeS5nZXRDaGFubmVscygpLmVtcHR5KCksIHRydWUpOworCisgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4+IGV4cGVjdGVkQ2hhbm5lbHM7CisgIGV4cGVjdGVkQ2hhbm5lbHMucHVzaF9iYWNrKGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcwIikpOworICBleHBlY3RlZENoYW5uZWxzLnB1c2hfYmFjayhmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMSIsICIyMDA3MSIpKTsKKyAgZXhwZWN0ZWRDaGFubmVscy5wdXNoX2JhY2soZmFjdG9yeS5jcmVhdGVDaGFubmVsKCI6OjEiLCAiMjAwNzEiKSk7CisKKyAgZm9yIChjb25zdCBhdXRvJiBjaCA6IGZhY3RvcnkuZ2V0Q2hhbm5lbHMoKSkgeworICAgIGF1dG8gcG9zID0gc3RkOjpmaW5kKGV4cGVjdGVkQ2hhbm5lbHMuYmVnaW4oKSwgZXhwZWN0ZWRDaGFubmVscy5lbmQoKSwgY2gpOworICAgIEJPT1NUX1JFUVVJUkUocG9zICE9IGV4cGVjdGVkQ2hhbm5lbHMuZW5kKCkpOworICAgIGV4cGVjdGVkQ2hhbm5lbHMuZXJhc2UocG9zKTsKKyAgfQorICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZENoYW5uZWxzLnNpemUoKSwgMCk7Cit9CisKK2NsYXNzIEZhY2VDcmVhdGVGaXh0dXJlIDogcHJvdGVjdGVkIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisgIHZvaWQKKyAgaWdub3JlKCkKKyAgeworICB9CisKKyAgdm9pZAorICBjaGVja0Vycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvckFjdHVhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yRXhwZWN0ZWQpCisgIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChlcnJvckFjdHVhbCwgZXJyb3JFeHBlY3RlZCk7CisgIH0KKworICB2b2lkCisgIGZhaWxJZkVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvckFjdHVhbCkKKyAgeworICAgIEJPT1NUX0ZBSUwoIk5vIGVycm9yIGV4cGVjdGVkLCBidXQgZ290OiBbIiA8PCBlcnJvckFjdHVhbCA8PCAiXSIpOworICB9Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShGYWNlQ3JlYXRlLCBGYWNlQ3JlYXRlRml4dHVyZSkKK3sKKyAgVGNwRmFjdG9yeSBmYWN0b3J5ID0gVGNwRmFjdG9yeSgpOworCisgIGZhY3RvcnkuY3JlYXRlRmFjZShGYWNlVXJpKCJ0Y3A0Oi8vMTI3LjAuMC4xIiksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlQ3JlYXRlRml4dHVyZTo6aWdub3JlLCB0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VDcmVhdGVGaXh0dXJlOjpmYWlsSWZFcnJvciwgdGhpcywgXzEpKTsKKworICBmYWN0b3J5LmNyZWF0ZUZhY2UoRmFjZVVyaSgidGNwNDovLzEyNy4wLjAuMS8iKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VDcmVhdGVGaXh0dXJlOjppZ25vcmUsIHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmRmFjZUNyZWF0ZUZpeHR1cmU6OmZhaWxJZkVycm9yLCB0aGlzLCBfMSkpOworCisgIGZhY3RvcnkuY3JlYXRlRmFjZShGYWNlVXJpKCJ0Y3A0Oi8vMTI3LjAuMC4xL3BhdGgiKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VDcmVhdGVGaXh0dXJlOjppZ25vcmUsIHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmRmFjZUNyZWF0ZUZpeHR1cmU6OmNoZWNrRXJyb3IsIHRoaXMsIF8xLCAiSW52YWxpZCBVUkkiKSk7Cit9CisKK2NsYXNzIEVuZFRvRW5kRml4dHVyZSA6IHByb3RlY3RlZCBCYXNlRml4dHVyZQoreworcHVibGljOgorICB2b2lkCisgIGNoYW5uZWwxX29uRmFjZUNyZWF0ZWQoY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgbmV3RmFjZSkKKyAgeworICAgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICAgIGZhY2UxID0gbmV3RmFjZTsKKyAgICBmYWNlMS0+b25SZWNlaXZlSW50ZXJlc3QgKz0KKyAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTFfb25SZWNlaXZlSW50ZXJlc3QsIHRoaXMsIF8xKTsKKyAgICBmYWNlMS0+b25SZWNlaXZlRGF0YSArPQorICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpmYWNlMV9vblJlY2VpdmVEYXRhLCB0aGlzLCBfMSk7CisgICAgZmFjZTEtPm9uRmFpbCArPQorICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpmYWNlMV9vbkZhaWwsIHRoaXMpOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2hhbm5lbDFfb25Db25uZWN0RmFpbGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCisgIHsKKyAgICBCT09TVF9DSEVDS19NRVNTQUdFKGZhbHNlLCByZWFzb24pOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgZmFjZTFfb25SZWNlaXZlSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQorICB7CisgICAgZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHMucHVzaF9iYWNrKGludGVyZXN0KTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGZhY2UxX29uUmVjZWl2ZURhdGEoY29uc3QgRGF0YSYgZGF0YSkKKyAgeworICAgIGZhY2UxX3JlY2VpdmVkRGF0YXMucHVzaF9iYWNrKGRhdGEpOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgZmFjZTFfb25GYWlsKCkKKyAgeworICAgIGZhY2UxLnJlc2V0KCk7CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2hhbm5lbDJfb25GYWNlQ3JlYXRlZChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBuZXdGYWNlKQorICB7CisgICAgQk9PU1RfQ0hFQ0soIXN0YXRpY19jYXN0PGJvb2w+KGZhY2UyKSk7CisgICAgZmFjZTIgPSBuZXdGYWNlOworICAgIGZhY2UyLT5vblJlY2VpdmVJbnRlcmVzdCArPQorICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpmYWNlMl9vblJlY2VpdmVJbnRlcmVzdCwgdGhpcywgXzEpOworICAgIGZhY2UyLT5vblJlY2VpdmVEYXRhICs9CisgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UyX29uUmVjZWl2ZURhdGEsIHRoaXMsIF8xKTsKKyAgICBmYWNlMi0+b25GYWlsICs9CisgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UyX29uRmFpbCwgdGhpcyk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBjaGFubmVsMl9vbkNvbm5lY3RGYWlsZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbikKKyAgeworICAgIEJPT1NUX0NIRUNLX01FU1NBR0UoZmFsc2UsIHJlYXNvbik7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBmYWNlMl9vblJlY2VpdmVJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCisgIHsKKyAgICBmYWNlMl9yZWNlaXZlZEludGVyZXN0cy5wdXNoX2JhY2soaW50ZXJlc3QpOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgZmFjZTJfb25SZWNlaXZlRGF0YShjb25zdCBEYXRhJiBkYXRhKQorICB7CisgICAgZmFjZTJfcmVjZWl2ZWREYXRhcy5wdXNoX2JhY2soZGF0YSk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBmYWNlMl9vbkZhaWwoKQorICB7CisgICAgZmFjZTIucmVzZXQoKTsKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBjaGFubmVsX29uRmFjZUNyZWF0ZWQoY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgbmV3RmFjZSkKKyAgeworICAgIGZhY2VzLnB1c2hfYmFjayhuZXdGYWNlKTsKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBjaGFubmVsX29uQ29ubmVjdEZhaWxlZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShmYWxzZSwgcmVhc29uKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNoZWNrRmFjZUxpc3Qoc2l6ZV90IHNob3VsZEJlKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCBzaG91bGRCZSk7CisgIH0KKworICB2b2lkCisgIGNvbm5lY3QoY29uc3Qgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiYgY2hhbm5lbCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVtb3RlSG9zdCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVtb3RlUG9ydCkKKyAgeworICAgIGNoYW5uZWwtPmNvbm5lY3QocmVtb3RlSG9zdCwgcmVtb3RlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkZhY2VDcmVhdGVkLCB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWxfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworICB9CisKK3B1YmxpYzoKKyAgTGltaXRlZElvIGxpbWl0ZWRJbzsKKworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UxOworICBzdGQ6OnZlY3RvcjxJbnRlcmVzdD4gZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHM7CisgIHN0ZDo6dmVjdG9yPERhdGE+IGZhY2UxX3JlY2VpdmVkRGF0YXM7CisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTI7CisgIHN0ZDo6dmVjdG9yPEludGVyZXN0PiBmYWNlMl9yZWNlaXZlZEludGVyZXN0czsKKyAgc3RkOjp2ZWN0b3I8RGF0YT4gZmFjZTJfcmVjZWl2ZWREYXRhczsKKworICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxGYWNlPj4gZmFjZXM7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShFbmRUb0VuZDQsIEVuZFRvRW5kRml4dHVyZSkKK3sKKyAgVGNwRmFjdG9yeSBmYWN0b3J5MTsKKworICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeTEuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcwIik7CisgIGZhY3RvcnkxLmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMSIsICIyMDA3MSIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGNoYW5uZWwxLT5pc0xpc3RlbmluZygpLCBmYWxzZSk7CisKKyAgY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDFfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGNoYW5uZWwxLT5pc0xpc3RlbmluZygpLCB0cnVlKTsKKworICBUY3BGYWN0b3J5IGZhY3RvcnkyOworCisgIHNoYXJlZF9wdHI8VGNwQ2hhbm5lbD4gY2hhbm5lbDIgPSBmYWN0b3J5Mi5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjIiLCAiMjAwNzAiKTsKKyAgZmFjdG9yeTIuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4yIiwgIjIwMDcxIik7CisKKyAgZmFjdG9yeTIuY3JlYXRlRmFjZShGYWNlVXJpKCJ0Y3A6Ly8xMjcuMC4wLjE6MjAwNzAiKSwKKyAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwgdGltZTo6c2Vjb25kcygxMCkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVGNwQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGZhY2UyKSk7CisKKyAgQk9PU1RfQ0hFQ0soZmFjZTEtPmlzT25EZW1hbmQoKSk7CisgIEJPT1NUX0NIRUNLKCFmYWNlMi0+aXNPbkRlbWFuZCgpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMi0+Z2V0UmVtb3RlVXJpKCkudG9TdHJpbmcoKSwgInRjcDQ6Ly8xMjcuMC4wLjE6MjAwNzAiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldExvY2FsVXJpKCkudG9TdHJpbmcoKSwgInRjcDQ6Ly8xMjcuMC4wLjE6MjAwNzAiKTsKKyAgLy8gZmFjZTEgaGFzIGFuIHVua25vd24gcmVtb3RlVXJpLCBzaW5jZSB0aGUgc291cmNlIHBvcnQgaXMgYXV0b21hdGljYWxseSBjaG9zZW4gYnkgT1MKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+aXNMb2NhbCgpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTItPmlzTG9jYWwoKSwgdHJ1ZSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdGljX2Nhc3Q8Ym9vbD4oZHluYW1pY19wb2ludGVyX2Nhc3Q8TG9jYWxGYWNlPihmYWNlMSkpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdGljX2Nhc3Q8Ym9vbD4oZHluYW1pY19wb2ludGVyX2Nhc3Q8TG9jYWxGYWNlPihmYWNlMikpLCB0cnVlKTsKKworICAvLyBpbnRlZ3JhdGVkIHRlc3RzIG5lZWRzIHRvIGNoZWNrIHRoYXQgVGNwRmFjZSBmb3Igbm9uLWxvb3BiYWNrIGZhaWxzIHRoZXNlIHRlc3RzLi4uCisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QxID0gbWFrZUludGVyZXN0KCJuZG46L1RwbnpHdlc5UiIpOworICBzaGFyZWRfcHRyPERhdGE+ICAgICBkYXRhMSAgICAgPSBtYWtlRGF0YSgibmRuOi9LZmN6aFVxVml4Iik7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MiA9IG1ha2VJbnRlcmVzdCgibmRuOi9RV2lJTWZqNXNMIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gICAgIGRhdGEyICAgICA9IG1ha2VEYXRhKCJuZG46L1hOQlY3OTZmIik7CisKKyAgZmFjZTEtPnNlbmRJbnRlcmVzdCgqaW50ZXJlc3QxKTsKKyAgZmFjZTEtPnNlbmRJbnRlcmVzdCgqaW50ZXJlc3QxKTsKKyAgZmFjZTEtPnNlbmRJbnRlcmVzdCgqaW50ZXJlc3QxKTsKKyAgZmFjZTEtPnNlbmREYXRhICAgICgqZGF0YTEgICAgKTsKKyAgc2l6ZV90IG5CeXRlc1NlbnQxID0gaW50ZXJlc3QxLT53aXJlRW5jb2RlKCkuc2l6ZSgpICogMyArIGRhdGExLT53aXJlRW5jb2RlKCkuc2l6ZSgpOworICBmYWNlMi0+c2VuZEludGVyZXN0KCppbnRlcmVzdDIpOworICBmYWNlMi0+c2VuZERhdGEgICAgKCpkYXRhMiAgICApOworICBmYWNlMi0+c2VuZERhdGEgICAgKCpkYXRhMiAgICApOworICBmYWNlMi0+c2VuZERhdGEgICAgKCpkYXRhMiAgICApOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1big4LCB0aW1lOjpzZWNvbmRzKDEwKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJUY3BDaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDMpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMyk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTJfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0Mi0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICBbMF0uZ2V0TmFtZSgpLCBkYXRhMi0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTJfcmVjZWl2ZWRJbnRlcmVzdHNbMF0uZ2V0TmFtZSgpLCBpbnRlcmVzdDEtPmdldE5hbWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkRGF0YXMgICAgWzBdLmdldE5hbWUoKSwgZGF0YTEtPmdldE5hbWUoKSk7CisKKyAgLy8gbmVlZGVkIHRvIGVuc3VyZSBOT3V0Qnl0ZXMgY291bnRlcnMgYXJlIGFjY3VyYXRlCisgIGxpbWl0ZWRJby5ydW4oTGltaXRlZElvOjpVTkxJTUlURURfT1BTLCB0aW1lOjpzZWNvbmRzKDEpKTsKKworICBjb25zdCBGYWNlQ291bnRlcnMmIGNvdW50ZXJzMSA9IGZhY2UxLT5nZXRDb3VudGVycygpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0TkluSW50ZXJlc3RzKCkgLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5JbkRhdGFzKCkgICAgICwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMS5nZXROT3V0SW50ZXJlc3RzKCksIDMpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0Tk91dERhdGFzKCkgICAgLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5PdXRCeXRlcygpLCBuQnl0ZXNTZW50MSk7CisKKyAgY29uc3QgRmFjZUNvdW50ZXJzJiBjb3VudGVyczIgPSBmYWNlMi0+Z2V0Q291bnRlcnMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMyLmdldE5JbkludGVyZXN0cygpICwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMi5nZXROSW5EYXRhcygpICAgICAsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczIuZ2V0Tk91dEludGVyZXN0cygpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMyLmdldE5PdXREYXRhcygpICAgICwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMi5nZXROSW5CeXRlcygpLCBuQnl0ZXNTZW50MSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEVuZFRvRW5kNiwgRW5kVG9FbmRGaXh0dXJlKQoreworICBUY3BGYWN0b3J5IGZhY3RvcnkxOworCisgIHNoYXJlZF9wdHI8VGNwQ2hhbm5lbD4gY2hhbm5lbDEgPSBmYWN0b3J5MS5jcmVhdGVDaGFubmVsKCI6OjEiLCAiMjAwNzAiKTsKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkxLmNyZWF0ZUNoYW5uZWwoIjo6MSIsICIyMDA3MSIpOworCisgIGNoYW5uZWwxLT5saXN0ZW4oYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkZhY2VDcmVhdGVkLCAgIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBUY3BGYWN0b3J5IGZhY3RvcnkyOworCisgIGZhY3RvcnkyLmNyZWF0ZUNoYW5uZWwoIjo6MiIsICIyMDA3MCIpOworCisgIGZhY3RvcnkyLmNyZWF0ZUZhY2UoRmFjZVVyaSgidGNwOi8vWzo6MV06MjAwNzAiKSwKKyAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwgdGltZTo6c2Vjb25kcygxMCkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVGNwQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGZhY2UyKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTItPmdldFJlbW90ZVVyaSgpLnRvU3RyaW5nKCksICJ0Y3A2Oi8vWzo6MV06MjAwNzAiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldExvY2FsVXJpKCkudG9TdHJpbmcoKSwgInRjcDY6Ly9bOjoxXToyMDA3MCIpOworICAvLyBmYWNlMSBoYXMgYW4gdW5rbm93biByZW1vdGVVcmksIHNpbmNlIHRoZSBzb3VyY2UgcG9ydCBpcyBhdXRvbWF0aWNhbGx5IGNob3NlbiBieSBPUworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLT5pc0xvY2FsKCksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMi0+aXNMb2NhbCgpLCB0cnVlKTsKKworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihkeW5hbWljX3BvaW50ZXJfY2FzdDxMb2NhbEZhY2U+KGZhY2UxKSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihkeW5hbWljX3BvaW50ZXJfY2FzdDxMb2NhbEZhY2U+KGZhY2UyKSksIHRydWUpOworCisgIC8vIGludGVncmF0ZWQgdGVzdHMgbmVlZHMgdG8gY2hlY2sgdGhhdCBUY3BGYWNlIGZvciBub24tbG9vcGJhY2sgZmFpbHMgdGhlc2UgdGVzdHMuLi4KKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDEgPSBtYWtlSW50ZXJlc3QoIm5kbjovVHBuekd2VzlSIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gICAgIGRhdGExICAgICA9IG1ha2VEYXRhKCJuZG46L0tmY3poVXFWaXgiKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QyID0gbWFrZUludGVyZXN0KCJuZG46L1FXaUlNZmo1c0wiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiAgICAgZGF0YTIgICAgID0gbWFrZURhdGEoIm5kbjovWE5CVjc5NmYiKTsKKworICBmYWNlMS0+c2VuZEludGVyZXN0KCppbnRlcmVzdDEpOworICBmYWNlMS0+c2VuZERhdGEgICAgKCpkYXRhMSAgICApOworICBmYWNlMi0+c2VuZEludGVyZXN0KCppbnRlcmVzdDIpOworICBmYWNlMi0+c2VuZERhdGEgICAgKCpkYXRhMiAgICApOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1big0LCB0aW1lOjpzZWNvbmRzKDEwKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJUY3BDaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpOworCisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDEpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UxX3JlY2VpdmVkRGF0YXMgICAgLnNpemUoKSwgMSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTJfcmVjZWl2ZWRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMl9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDEpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzWzBdLmdldE5hbWUoKSwgaW50ZXJlc3QyLT5nZXROYW1lKCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIFswXS5nZXROYW1lKCksIGRhdGEyLT5nZXROYW1lKCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMl9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0MS0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTJfcmVjZWl2ZWREYXRhcyAgICBbMF0uZ2V0TmFtZSgpLCBkYXRhMS0+Z2V0TmFtZSgpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoTXVsdGlwbGVBY2NlcHRzLCBFbmRUb0VuZEZpeHR1cmUpCit7CisgIFRjcEZhY3RvcnkgZmFjdG9yeTsKKworICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisKKyAgY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWxfb25GYWNlQ3JlYXRlZCwgICB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBjaGFubmVsMi0+Y29ubmVjdCgiMTI3LjAuMC4xIiwgIjIwMDcwIiwKKyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgICB0aW1lOjpzZWNvbmRzKDQpKTsgLy8gdmVyeSBzaG9ydCB0aW1lb3V0CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDIsIHRpbWU6OnNlY29uZHMoMTApKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlRjcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBjb25uZWN0IG9yIGNhbm5vdCBhY2NlcHQgY29ubmVjdGlvbiIpOworCisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCAyKTsKKworICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGNoYW5uZWwzID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzIiKTsKKyAgY2hhbm5lbDMtPmNvbm5lY3QoIjEyNy4wLjAuMSIsICIyMDA3MCIsCisgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkZhY2VDcmVhdGVkLCB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgdGltZTo6c2Vjb25kcyg0KSk7IC8vIHZlcnkgc2hvcnQgdGltZW91dAorCisKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsNCA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDczIik7CisKKyAgQk9PU1RfQ0hFQ0tfTkUoY2hhbm5lbDMsIGNoYW5uZWw0KTsKKworICBzY2hlZHVsZXI6OnNjaGVkdWxlKHRpbWU6OnNlY29uZHMoMSksCisgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjb25uZWN0LCB0aGlzLCBjaGFubmVsNCwgIjEyNy4wLjAuMSIsICIyMDA3MCIpKTsKKworICBzY2hlZHVsZXI6OnNjaGVkdWxlKHRpbWU6Om1pbGxpc2Vjb25kcyg1MDApLAorICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hlY2tGYWNlTGlzdCwgdGhpcywgNCkpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1big0LC8vIDIgY29ubmVjdHMgYW5kIDIgYWNjZXB0cworICAgICAgICAgICAgICAgICAgICAgIHRpbWU6OnNlY29uZHMoMTApKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlRjcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBjb25uZWN0IG9yIGNhbm5vdCBhY2NlcHQgbXVsdGlwbGUgY29ubmVjdGlvbnMiKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlcy5zaXplKCksIDYpOworfQorCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEZhY2VDbG9zaW5nLCBFbmRUb0VuZEZpeHR1cmUpCit7CisgIFRjcEZhY3RvcnkgZmFjdG9yeTsKKworICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisKKyAgY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDFfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisgIGNoYW5uZWwyLT5jb25uZWN0KCIxMjcuMC4wLjEiLCAiMjAwNzAiLAorICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMl9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgdGltZTo6c2Vjb25kcyg0KSk7IC8vIHZlcnkgc2hvcnQgdGltZW91dAorCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigyLCB0aW1lOjpzZWNvbmRzKDEwKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJUY3BDaGFubmVsIGVycm9yOiBjYW5ub3QgY29ubmVjdCBvciBjYW5ub3QgYWNjZXB0IGNvbm5lY3Rpb24iKTsKKworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMS0+c2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDItPnNpemUoKSwgMSk7CisKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICBCT09TVF9DSEVDSyhzdGF0aWNfY2FzdDxib29sPihmYWNlMikpOworCisgIC8vIEZhY2U6OmNsb3NlIG11c3QgYmUgaW52b2tlZCBkdXJpbmcgaW8gcnVuIHRvIGJlIGNvdW50ZWQgYXMgYW4gb3AKKyAgc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjptaWxsaXNlY29uZHMoMTAwKSwgYmluZCgmRmFjZTo6Y2xvc2UsIGZhY2UxKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDIsIHRpbWU6OnNlY29uZHMoMTApKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIkZhY2VDbG9zaW5nIGVycm9yOiBjYW5ub3QgcHJvcGVybHkgY2xvc2UgZmFjZXMiKTsKKworICAvLyBib3RoIGZhY2VzIHNob3VsZCBnZXQgY2xvc2VkCisgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTIpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMS0+c2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDItPnNpemUoKSwgMCk7Cit9CisKKworY2xhc3MgU2ltcGxlRW5kVG9FbmRGaXh0dXJlIDogcHJvdGVjdGVkIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisgIHZvaWQKKyAgb25GYWNlQ3JlYXRlZChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBmYWNlKQorICB7CisgICAgZmFjZS0+b25SZWNlaXZlSW50ZXJlc3QgKz0KKyAgICAgIGJpbmQoJlNpbXBsZUVuZFRvRW5kRml4dHVyZTo6b25SZWNlaXZlSW50ZXJlc3QsIHRoaXMsIF8xKTsKKyAgICBmYWNlLT5vblJlY2VpdmVEYXRhICs9CisgICAgICBiaW5kKCZTaW1wbGVFbmRUb0VuZEZpeHR1cmU6Om9uUmVjZWl2ZURhdGEsIHRoaXMsIF8xKTsKKyAgICBmYWNlLT5vbkZhaWwgKz0KKyAgICAgIGJpbmQoJlNpbXBsZUVuZFRvRW5kRml4dHVyZTo6b25GYWlsLCB0aGlzLCBmYWNlKTsKKworICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihkeW5hbWljX3BvaW50ZXJfY2FzdDxMb2NhbEZhY2U+KGZhY2UpKSkgeworICAgICAgc3RhdGljX3BvaW50ZXJfY2FzdDxMb2NhbEZhY2U+KGZhY2UpLT5zZXRMb2NhbENvbnRyb2xIZWFkZXJGZWF0dXJlKAorICAgICAgICBMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCk7CisKKyAgICAgIHN0YXRpY19wb2ludGVyX2Nhc3Q8TG9jYWxGYWNlPihmYWNlKS0+c2V0TG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZSgKKyAgICAgICAgTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpOworICAgIH0KKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIG9uQ29ubmVjdEZhaWxlZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShmYWxzZSwgcmVhc29uKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIG9uUmVjZWl2ZUludGVyZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKKyAgeworICAgIHJlY2VpdmVkSW50ZXJlc3RzLnB1c2hfYmFjayhpbnRlcmVzdCk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBvblJlY2VpdmVEYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICByZWNlaXZlZERhdGFzLnB1c2hfYmFjayhkYXRhKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIG9uRmFpbChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBmYWNlKQorICB7CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCitwdWJsaWM6CisgIExpbWl0ZWRJbyBsaW1pdGVkSW87CisKKyAgc3RkOjp2ZWN0b3I8SW50ZXJlc3Q+IHJlY2VpdmVkSW50ZXJlc3RzOworICBzdGQ6OnZlY3RvcjxEYXRhPiByZWNlaXZlZERhdGFzOworfTsKKworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRV9URU1QTEFURShMb2NhbEZhY2VDb3JydXB0ZWRJbnB1dCwgRGF0YXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcnJ1cHRlZFBhY2tldHMsIFNpbXBsZUVuZFRvRW5kRml4dHVyZSkKK3sKKyAgVGNwRmFjdG9yeSBmYWN0b3J5OworCisgIHNoYXJlZF9wdHI8VGNwQ2hhbm5lbD4gY2hhbm5lbCA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcwIik7CisgIGNoYW5uZWwtPmxpc3RlbihiaW5kKCZTaW1wbGVFbmRUb0VuZEZpeHR1cmU6Om9uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgYmluZCgmU2ltcGxlRW5kVG9FbmRGaXh0dXJlOjpvbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoY2hhbm5lbC0+aXNMaXN0ZW5pbmcoKSwgdHJ1ZSk7CisKKyAgRHVtbXlTdHJlYW1TZW5kZXI8Ym9vc3Q6OmFzaW86OmlwOjp0Y3AsIERhdGFzZXQ+IHNlbmRlcjsKKyAgc2VuZGVyLnN0YXJ0KFJlc29sdmVyPGJvb3N0Ojphc2lvOjppcDo6dGNwPjo6c3luY1Jlc29sdmUoIjEyNy4wLjAuMSIsICIyMDA3MCIpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oTGltaXRlZElvOjpVTkxJTUlURURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biBmb3IgIiArIERhdGFzZXQ6OmdldE5hbWUoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFX1RFTVBMQVRFKEZhY2VDb3JydXB0ZWRJbnB1dCwgRGF0YXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcnJ1cHRlZFBhY2tldHMsIFNpbXBsZUVuZFRvRW5kRml4dHVyZSkKK3sKKyAgLy8gdGVzdHMgd2l0aCBub24tbG9jYWwgRmFjZQorICBzdGQ6OnN0cmluZyBzb21lSXB2NEFkZHJlc3M7CisgIGZvciAoY29uc3QgYXV0byYgbmV0aWYgOiBsaXN0TmV0d29ya0ludGVyZmFjZXMoKSkgeworICAgIGlmICghbmV0aWYuaXNMb29wYmFjaygpICYmIG5ldGlmLmlzVXAoKSAmJiAhbmV0aWYuaXB2NEFkZHJlc3Nlcy5lbXB0eSgpKSB7CisgICAgICBzb21lSXB2NEFkZHJlc3MgPSBuZXRpZi5pcHY0QWRkcmVzc2VzWzBdLnRvX3N0cmluZygpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChzb21lSXB2NEFkZHJlc3MuZW1wdHkoKSkgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdCB3aXRoIG5vbi1sb2NhbCBGYWNlIGNhbm5vdCBiZSBydW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiKG5vIG5vbi1sb2NhbCBpbnRlcmZhY2Ugd2l0aCBJUHY0IGFkZHJlc3MgYXZhaWxhYmxlKSIpOworICAgIHJldHVybjsKKyAgfQorCisgIFRjcEZhY3RvcnkgZmFjdG9yeTsKKworICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGNoYW5uZWwgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoc29tZUlwdjRBZGRyZXNzLCAiMjAwNzAiKTsKKyAgY2hhbm5lbC0+bGlzdGVuKGJpbmQoJlNpbXBsZUVuZFRvRW5kRml4dHVyZTo6b25GYWNlQ3JlYXRlZCwgICB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICBiaW5kKCZTaW1wbGVFbmRUb0VuZEZpeHR1cmU6Om9uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChjaGFubmVsLT5pc0xpc3RlbmluZygpLCB0cnVlKTsKKworICBEdW1teVN0cmVhbVNlbmRlcjxib29zdDo6YXNpbzo6aXA6OnRjcCwgRGF0YXNldD4gc2VuZGVyOworICBzZW5kZXIuc3RhcnQoUmVzb2x2ZXI8Ym9vc3Q6OmFzaW86OmlwOjp0Y3A+OjpzeW5jUmVzb2x2ZShzb21lSXB2NEFkZHJlc3MsICIyMDA3MCIpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oTGltaXRlZElvOjpVTkxJTUlURURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biBmb3IgIiArIERhdGFzZXQ6OmdldE5hbWUoKSk7Cit9CisKK2NsYXNzIEZhY2VDcmVhdGVUaW1lb3V0Rml4dHVyZSA6IHByb3RlY3RlZCBCYXNlRml4dHVyZQoreworcHVibGljOgorICB2b2lkCisgIG9uRmFjZUNyZWF0ZWQoY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgbmV3RmFjZSkKKyAgeworICAgIEJPT1NUX0NIRUNLX01FU1NBR0UoZmFsc2UsICJUaW1lb3V0IGV4cGVjdGVkIik7CisgICAgQk9PU1RfQ0hFQ0soIXN0YXRpY19jYXN0PGJvb2w+KGZhY2UxKSk7CisgICAgZmFjZTEgPSBuZXdGYWNlOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgb25Db25uZWN0RmFpbGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCisgIHsKKyAgICBCT09TVF9DSEVDS19NRVNTQUdFKHRydWUsIHJlYXNvbik7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKK3B1YmxpYzoKKyAgTGltaXRlZElvIGxpbWl0ZWRJbzsKKworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UxOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoRmFjZUNyZWF0ZVRpbWVvdXQsIEZhY2VDcmVhdGVUaW1lb3V0Rml4dHVyZSkKK3sKKyAgVGNwRmFjdG9yeSBmYWN0b3J5OworICBzaGFyZWRfcHRyPFRjcENoYW5uZWw+IGNoYW5uZWwgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjAuMC4wLjAiLCAiMjAwNzAiKTsKKworICBmYWN0b3J5LmNyZWF0ZUZhY2UoRmFjZVVyaSgidGNwOi8vMTkyLjAuMi4xOjIwMDcwIiksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlQ3JlYXRlVGltZW91dEZpeHR1cmU6Om9uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VDcmVhdGVUaW1lb3V0Rml4dHVyZTo6b25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigxLCB0aW1lOjpzZWNvbmRzKDEwKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJUY3BDaGFubmVsIGVycm9yOiBjYW5ub3QgY29ubmVjdCBvciBjYW5ub3QgYWNjZXB0IGNvbm5lY3Rpb24iKTsKKworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihmYWNlMSksIGZhbHNlKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoQnVnMTg1NiwgRW5kVG9FbmRGaXh0dXJlKQoreworICBUY3BGYWN0b3J5IGZhY3RvcnkxOworCisgIHNoYXJlZF9wdHI8VGNwQ2hhbm5lbD4gY2hhbm5lbDEgPSBmYWN0b3J5MS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgZmFjdG9yeTEuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPmlzTGlzdGVuaW5nKCksIGZhbHNlKTsKKworICBjaGFubmVsMS0+bGlzdGVuKGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDFfb25GYWNlQ3JlYXRlZCwgICB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPmlzTGlzdGVuaW5nKCksIHRydWUpOworCisgIFRjcEZhY3RvcnkgZmFjdG9yeTI7CisKKyAgc2hhcmVkX3B0cjxUY3BDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkyLmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMiIsICIyMDA3MCIpOworICBmYWN0b3J5Mi5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjIiLCAiMjAwNzEiKTsKKworICBmYWN0b3J5Mi5jcmVhdGVGYWNlKEZhY2VVcmkoInRjcDovLzEyNy4wLjAuMToyMDA3MCIpLAorICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDJfb25GYWNlQ3JlYXRlZCwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDJfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigyLCB0aW1lOjpzZWNvbmRzKDEwKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJUY3BDaGFubmVsIGVycm9yOiBjYW5ub3QgY29ubmVjdCBvciBjYW5ub3QgYWNjZXB0IGNvbm5lY3Rpb24iKTsKKworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGZhY2UxKSk7CisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTIpKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gaHVnZU5hbWU7CisgIGh1Z2VOYW1lIDw8ICIvaHVnZS1uYW1lLyI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmRuOjpNQVhfTkROX1BBQ0tFVF9TSVpFOyBpKyspCisgICAgaHVnZU5hbWUgPDwgJ2EnOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZUludGVyZXN0KCJuZG46L0tmY3poVXFWaXgiKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaHVnZUludGVyZXN0ID0gbWFrZUludGVyZXN0KGh1Z2VOYW1lLnN0cigpKTsKKworICBmYWNlMS0+c2VuZEludGVyZXN0KCpodWdlSW50ZXJlc3QpOworICBmYWNlMi0+c2VuZEludGVyZXN0KCppbnRlcmVzdCk7CisgIGZhY2UyLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0KTsKKworICBsaW1pdGVkSW8ucnVuKExpbWl0ZWRJbzo6VU5MSU1JVEVEX09QUywgdGltZTo6c2Vjb25kcygxKSk7CisgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVW5leHBlY3RlZCBhc3NlcnRpb24gdGVzdCBwYXNzZWQiKTsKK30KKworY2xhc3MgRmFrZU5ldHdvcmtJbnRlcmZhY2VGaXh0dXJlIDogcHVibGljIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisgIEZha2VOZXR3b3JrSW50ZXJmYWNlRml4dHVyZSgpCisgIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmFzaW86OmlwOworCisgICAgYXV0byBmYWtlSW50ZXJmYWNlcyA9IG1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPE5ldHdvcmtJbnRlcmZhY2VJbmZvPj4oKTsKKworICAgIGZha2VJbnRlcmZhY2VzLT5wdXNoX2JhY2soCisgICAgICBOZXR3b3JrSW50ZXJmYWNlSW5mbyB7MCwgImV0aDAiLAorICAgICAgICBldGhlcm5ldDo6QWRkcmVzczo6ZnJvbVN0cmluZygiM2U6MTU6YzI6OGI6NjU6MDAiKSwKKyAgICAgICAge2FkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIwLjAuMC4wIil9LAorICAgICAgICB7YWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjo6Iil9LAorICAgICAgICBhZGRyZXNzX3Y0KCksCisgICAgICAgIElGRl9VUH0pOworICAgIGZha2VJbnRlcmZhY2VzLT5wdXNoX2JhY2soCisgICAgICBOZXR3b3JrSW50ZXJmYWNlSW5mbyB7MSwgImV0aDAiLAorICAgICAgICBldGhlcm5ldDo6QWRkcmVzczo6ZnJvbVN0cmluZygiM2U6MTU6YzI6OGI6NjU6MDAiKSwKKyAgICAgICAge2FkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTIuMTY4LjIuMSIpLCBhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTkyLjE2OC4yLjIiKX0sCisgICAgICAgIHt9LAorICAgICAgICBhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTkyLjE2OC4yLjI1NSIpLAorICAgICAgICAwfSk7CisgICAgZmFrZUludGVyZmFjZXMtPnB1c2hfYmFjaygKKyAgICAgIE5ldHdvcmtJbnRlcmZhY2VJbmZvIHsyLCAiZXRoMSIsCisgICAgICAgIGV0aGVybmV0OjpBZGRyZXNzOjpmcm9tU3RyaW5nKCIzZToxNTpjMjo4Yjo2NTowMCIpLAorICAgICAgICB7YWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5OC41MS4xMDAuMSIpfSwKKyAgICAgICAge2FkZHJlc3NfdjY6OmZyb21fc3RyaW5nKCIyMDAxOmRiODo6MiIpLCBhZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZygiMjAwMTpkYjg6OjMiKX0sCisgICAgICAgIGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTguNTEuMTAwLjI1NSIpLAorICAgICAgICBJRkZfTVVMVElDQVNUIHwgSUZGX0JST0FEQ0FTVCB8IElGRl9VUH0pOworCisgICAgc2V0RGVidWdOZXR3b3JrSW50ZXJmYWNlcyhmYWtlSW50ZXJmYWNlcyk7CisgIH0KKworICB+RmFrZU5ldHdvcmtJbnRlcmZhY2VGaXh0dXJlKCkKKyAgeworICAgIHNldERlYnVnTmV0d29ya0ludGVyZmFjZXMobnVsbHB0cik7CisgIH0KK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEJ1ZzIyOTIsIEZha2VOZXR3b3JrSW50ZXJmYWNlRml4dHVyZSkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOjppcDsKKworICBUY3BGYWN0b3J5IGZhY3Rvcnk7CisgIGZhY3RvcnkucHJvaGliaXRFbmRwb2ludCh0Y3A6OkVuZHBvaW50KGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTIuMTY4LjIuMSIpLCAxMDI0KSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0soKGZhY3RvcnkubV9wcm9oaWJpdGVkRW5kcG9pbnRzID09CisgICAgICAgICAgICAgICBzdGQ6OnNldDx0Y3A6OkVuZHBvaW50PiB7CisgICAgICAgICAgICAgICAgIHRjcDo6RW5kcG9pbnQoYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5Mi4xNjguMi4xIiksIDEwMjQpLAorICAgICAgICAgICAgICAgfSkpOworCisgIGZhY3RvcnkubV9wcm9oaWJpdGVkRW5kcG9pbnRzLmNsZWFyKCk7CisgIGZhY3RvcnkucHJvaGliaXRFbmRwb2ludCh0Y3A6OkVuZHBvaW50KGFkZHJlc3NfdjY6OmZyb21fc3RyaW5nKCIyMDAxOmRiODo6MSIpLCAyMDQ4KSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0soKGZhY3RvcnkubV9wcm9oaWJpdGVkRW5kcG9pbnRzID09CisgICAgICAgICAgICAgICBzdGQ6OnNldDx0Y3A6OkVuZHBvaW50PiB7CisgICAgICAgICAgICAgICAgIHRjcDo6RW5kcG9pbnQoYWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjoxIiksIDIwNDgpCisgICAgICAgICAgICAgICB9KSk7CisKKyAgZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuY2xlYXIoKTsKKyAgZmFjdG9yeS5wcm9oaWJpdEVuZHBvaW50KHRjcDo6RW5kcG9pbnQoYWRkcmVzc192NCgpLCAxMDI0KSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuc2l6ZSgpLCA0KTsKKyAgQk9PU1RfQ0hFQ0soKGZhY3RvcnkubV9wcm9oaWJpdGVkRW5kcG9pbnRzID09CisgICAgICAgICAgICAgICBzdGQ6OnNldDx0Y3A6OkVuZHBvaW50PiB7CisgICAgICAgICAgICAgICAgIHRjcDo6RW5kcG9pbnQoYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5Mi4xNjguMi4xIiksIDEwMjQpLAorICAgICAgICAgICAgICAgICB0Y3A6OkVuZHBvaW50KGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTIuMTY4LjIuMiIpLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgdGNwOjpFbmRwb2ludChhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTk4LjUxLjEwMC4xIiksIDEwMjQpLAorICAgICAgICAgICAgICAgICB0Y3A6OkVuZHBvaW50KGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIwLjAuMC4wIiksIDEwMjQpCisgICAgICAgICAgICAgICB9KSk7CisKKyAgZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuY2xlYXIoKTsKKyAgZmFjdG9yeS5wcm9oaWJpdEVuZHBvaW50KHRjcDo6RW5kcG9pbnQoYWRkcmVzc192NigpLCAyMDQ4KSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuc2l6ZSgpLCAzKTsKKyAgQk9PU1RfQ0hFQ0soKGZhY3RvcnkubV9wcm9oaWJpdGVkRW5kcG9pbnRzID09CisgICAgICAgICAgICAgICBzdGQ6OnNldDx0Y3A6OkVuZHBvaW50PiB7CisgICAgICAgICAgICAgICAgIHRjcDo6RW5kcG9pbnQoYWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjoyIiksIDIwNDgpLAorICAgICAgICAgICAgICAgICB0Y3A6OkVuZHBvaW50KGFkZHJlc3NfdjY6OmZyb21fc3RyaW5nKCIyMDAxOmRiODo6MyIpLCAyMDQ4KSwKKyAgICAgICAgICAgICAgICAgdGNwOjpFbmRwb2ludChhZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZygiOjoiKSwgMjA0OCkKKyAgICAgICAgICAgICAgIH0pKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vZmFjZS91ZHAuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3VkcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYjMyMAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS91ZHAuY3BwCkBAIC0wLDAgKzEsMTA3OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZhY2UvdWRwLWZhY3RvcnkuaHBwIgorI2luY2x1ZGUgImNvcmUvbmV0d29yay1pbnRlcmZhY2UuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2xpbWl0ZWQtaW8uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGYWNlVWRwLCBCYXNlRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoR2V0Q2hhbm5lbHMpCit7CisgIFVkcEZhY3RvcnkgZmFjdG9yeTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWN0b3J5LmdldENoYW5uZWxzKCkuZW1wdHkoKSwgdHJ1ZSk7CisKKyAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+IGV4cGVjdGVkQ2hhbm5lbHM7CisKKyAgZXhwZWN0ZWRDaGFubmVscy5wdXNoX2JhY2soZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKSk7CisgIGV4cGVjdGVkQ2hhbm5lbHMucHVzaF9iYWNrKGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIikpOworICBleHBlY3RlZENoYW5uZWxzLnB1c2hfYmFjayhmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjo6MSIsICIyMDA3MSIpKTsKKworICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+IGNoYW5uZWxzID0gZmFjdG9yeS5nZXRDaGFubmVscygpOworICBmb3IgKHN0ZDo6bGlzdDxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID46OmNvbnN0X2l0ZXJhdG9yIGkgPSBjaGFubmVscy5iZWdpbigpOworICAgICAgIGkgIT0gY2hhbm5lbHMuZW5kKCk7ICsraSkKKyAgICB7CisgICAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID46Oml0ZXJhdG9yIHBvcyA9CisgICAgICAgIHN0ZDo6ZmluZChleHBlY3RlZENoYW5uZWxzLmJlZ2luKCksIGV4cGVjdGVkQ2hhbm5lbHMuZW5kKCksICppKTsKKworICAgICAgQk9PU1RfUkVRVUlSRShwb3MgIT0gZXhwZWN0ZWRDaGFubmVscy5lbmQoKSk7CisgICAgICBleHBlY3RlZENoYW5uZWxzLmVyYXNlKHBvcyk7CisgICAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkQ2hhbm5lbHMuc2l6ZSgpLCAwKTsKK30KKworY2xhc3MgRmFjdG9yeUVycm9yQ2hlY2sgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgYm9vbAorICBpc1RoZVNhbWVNdWx0aWNhc3RFbmRwb2ludChjb25zdCBVZHBGYWN0b3J5OjpFcnJvciYgZSkgeworICAgIHJldHVybiBzdHJjbXAoZS53aGF0KCksCisgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIFVEUCB1bmljYXN0IGNoYW5uZWwsIGxvY2FsICIKKyAgICAgICAgICAgICAgICAgICJlbmRwb2ludCBpcyBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgYSBVRFAgbXVsdGljYXN0IGZhY2UiKSA9PSAwOworICB9CisKKyAgYm9vbAorICBpc05vdE11bHRpY2FzdEFkZHJlc3MoY29uc3QgVWRwRmFjdG9yeTo6RXJyb3ImIGUpIHsKKyAgICByZXR1cm4gc3RyY21wKGUud2hhdCgpLAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBVRFAgbXVsdGljYXN0IGZhY2UsICIKKyAgICAgICAgICAgICAgICAgICJ0aGUgbXVsdGljYXN0IGdyb3VwIGdpdmVuIGFzIGlucHV0IGlzIG5vdCBhIG11bHRpY2FzdCBhZGRyZXNzIikgPT0gMDsKKyAgfQorCisgIGJvb2wKKyAgaXNUaGVTYW1lVW5pY2FzdEVuZHBvaW50KGNvbnN0IFVkcEZhY3Rvcnk6OkVycm9yJiBlKSB7CisgICAgcmV0dXJuIHN0cmNtcChlLndoYXQoKSwKKyAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgVURQIG11bHRpY2FzdCBmYWNlLCBsb2NhbCAiCisgICAgICAgICAgICAgICAgICAiZW5kcG9pbnQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgZm9yIGEgVURQIHVuaWNhc3QgY2hhbm5lbCIpID09IDA7CisgIH0KKworICBib29sCisgIGlzTG9jYWxFbmRwb2ludE9uRGlmZmVyZW50R3JvdXAoY29uc3QgVWRwRmFjdG9yeTo6RXJyb3ImIGUpIHsKKyAgICByZXR1cm4gc3RyY21wKGUud2hhdCgpLAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBVRFAgbXVsdGljYXN0IGZhY2UsIGxvY2FsICIKKyAgICAgICAgICAgICAgICAgICJlbmRwb2ludCBpcyBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgYSBVRFAgbXVsdGljYXN0IGZhY2UgIgorICAgICAgICAgICAgICAgICAgIm9uIGEgZGlmZmVyZW50IG11bHRpY2FzdCBncm91cCIpID09IDA7CisgIH0KK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKENoYW5uZWxNYXBVZHAsIEZhY3RvcnlFcnJvckNoZWNrKQoreworICB1c2luZyBib29zdDo6YXNpbzo6aXA6OnVkcDsKKworICBVZHBGYWN0b3J5IGZhY3RvcnkgPSBVZHBGYWN0b3J5KCk7CisKKyAgLy90byBpbnN0YW50aWF0ZSBtdWx0aWNhc3QgZmFjZSBvbiBhIHNwZWNpZmljIGlwIGFkZHJlc3MsIGNoYW5nZSBpbnRlcmZhY2VJcAorICBzdGQ6OnN0cmluZyBpbnRlcmZhY2VJcCA9ICIwLjAuMC4wIjsKKworICBzaGFyZWRfcHRyPFVkcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMWEgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMSIsICIyMDA3MCIpOworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMSwgY2hhbm5lbDFhKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPmdldFVyaSgpLnRvU3RyaW5nKCksICJ1ZHA0Oi8vMTI3LjAuMC4xOjIwMDcwIik7CisKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisgIEJPT1NUX0NIRUNLX05FKGNoYW5uZWwxLCBjaGFubmVsMik7CisKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMyA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbChpbnRlcmZhY2VJcCwgIjIwMDcwIik7CisKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsNCA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiOjoxIiwgIjIwMDcxIik7CisgIEJPT1NUX0NIRUNLX05FKGNoYW5uZWwyLCBjaGFubmVsNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNoYW5uZWw0LT5nZXRVcmkoKS50b1N0cmluZygpLCAidWRwNjovL1s6OjFdOjIwMDcxIik7CisKKyAgLy9zYW1lIGVuZHBvaW50IG9mIGEgdW5pY2FzdCBjaGFubmVsCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihmYWN0b3J5LmNyZWF0ZU11bHRpY2FzdEZhY2UoaW50ZXJmYWNlSXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIyNC4wLjAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDcwIiksCisgICAgICAgICAgICAgICAgICAgICAgICBVZHBGYWN0b3J5OjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzVGhlU2FtZVVuaWNhc3RFbmRwb2ludCk7CisKKworICBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+IG11bHRpY2FzdEZhY2UxID0gZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKGludGVyZmFjZUlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMjQuMC4wLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA3MiIpOworICBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+IG11bHRpY2FzdEZhY2UxYSA9IGZhY3RvcnkuY3JlYXRlTXVsdGljYXN0RmFjZShpbnRlcmZhY2VJcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjI0LjAuMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwNzIiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobXVsdGljYXN0RmFjZTEsIG11bHRpY2FzdEZhY2UxYSk7CisKKworICAvL3NhbWUgZW5kcG9pbnQgb2YgYSBtdWx0aWNhc3QgZmFjZQorICBCT09TVF9DSEVDS19FWENFUFRJT04oZmFjdG9yeS5jcmVhdGVDaGFubmVsKGludGVyZmFjZUlwLCAiMjAwNzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVkcEZhY3Rvcnk6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNUaGVTYW1lTXVsdGljYXN0RW5kcG9pbnQpOworCisgIC8vc2FtZSBtdWx0aWNhc3QgZW5kcG9pbnQsIGRpZmZlcmVudCBncm91cAorICBCT09TVF9DSEVDS19FWENFUFRJT04oZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKGludGVyZmFjZUlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMjQuMC4wLjQyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwNzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVkcEZhY3Rvcnk6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2NhbEVuZHBvaW50T25EaWZmZXJlbnRHcm91cCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKGZhY3RvcnkuY3JlYXRlTXVsdGljYXN0RmFjZShpbnRlcmZhY2VJcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTkyLjE2OC4xMC4xNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDI1IiksCisgICAgICAgICAgICAgICAgICAgICAgICBVZHBGYWN0b3J5OjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzTm90TXVsdGljYXN0QWRkcmVzcyk7CisKKworLy8gIC8vVGVzdCBjb21tZW50ZWQgYmVjYXVzZSBpdCByZXF1aXJlZCB0byBiZSBydW4gaW4gYSBtYWNoaW5lIHRoYXQgY2FuIHJlc29sdmUgaXB2NiBxdWVyeQorLy8gIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gY2hhbm5lbDF2NiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgvLyI6OjEiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZTgwOjo1ZTk2OjlkZmY6ZmU3ZDo5YzhkJWVuMSIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8iZmU4MDo6YWE1NDpiMmZmOmZlMDg6MjdiOCV3bGFuMCIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDcwIik7CisvLworLy8gIC8vdGhlIGNyZWF0aW9uIG9mIG11bHRpY2FzdEZhY2UyIHdvcmtzIHByb3Blcmx5LiBJdCBoYXMgYmVlbiBkaXNhYmxlIGJlY2F1c2UgaXQgbmVlZHMgYW4gSVAgYWRkcmVzcyBvZgorLy8gIC8vYW4gYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlIChkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lIHVzZWQpCisvLyAgc2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlPiBtdWx0aWNhc3RGYWNlMiA9IGZhY3RvcnkuY3JlYXRlTXVsdGljYXN0RmFjZSgiMTkyLjE2OC4xLjE3IiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMjQuMC4wLjEiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDczIik7CisvLyAgQk9PU1RfQ0hFQ0tfTkUobXVsdGljYXN0RmFjZTEsIG11bHRpY2FzdEZhY2UyKTsKKy8vCisvLworLy8gIC8vaXB2NiAtIHdvcmsgaW4gcHJvZ3Jlc3MKKy8vICBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+IG11bHRpY2FzdEZhY2UzID0gZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKCJmZTgwOjo1ZTk2OjlkZmY6ZmU3ZDo5YzhkJWVuMSIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkYwMTowOjA6MDowOjA6MDoyIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA3MyIpOworLy8KKy8vICBzaGFyZWRfcHRyPE11bHRpY2FzdFVkcEZhY2U+IG11bHRpY2FzdEZhY2U0ID0gZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKCJmZTgwOjphYTU0OmIyZmY6ZmUwODoyN2I4JXdsYW4wIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGRjAxOjA6MDowOjA6MDowOjIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDczIik7CisvLworLy8gIEJPT1NUX0NIRUNLX0VRVUFMKG11bHRpY2FzdEZhY2UzLCBtdWx0aWNhc3RGYWNlNCk7CisvLworLy8gIHNoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4gbXVsdGljYXN0RmFjZTUgPSBmYWN0b3J5LmNyZWF0ZU11bHRpY2FzdEZhY2UoIjo6MSIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkYwMTowOjA6MDowOjA6MDoyIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA3MyIpOworLy8KKy8vICBCT09TVF9DSEVDS19ORShtdWx0aWNhc3RGYWNlMywgbXVsdGljYXN0RmFjZTUpOworLy8KKy8vICAvL3NhbWUgbG9jYWwgaXB2NiBlbmRwb2ludCBmb3IgYSBkaWZmZXJlbnQgbXVsdGljYXN0IGdyb3VwCisvLyAgQk9PU1RfQ0hFQ0tfVEhST1coZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKCJmZTgwOjphYTU0OmIyZmY6ZmUwODoyN2I4JXdsYW4wIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZFMDE6MDowOjA6MDowOjA6MiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA3MyIpLAorLy8gICAgICAgICAgICAgICAgICAgIFVkcEZhY3Rvcnk6OkVycm9yKTsKKy8vCisvLyAgLy9zYW1lIGxvY2FsIGlwdjYgKGV4cGVjdCBmb3IgdGggcG9ydCBudW1iZXIpIGVuZHBvaW50IGZvciBhIGRpZmZlcmVudCBtdWx0aWNhc3QgZ3JvdXAKKy8vICBCT09TVF9DSEVDS19USFJPVyhmYWN0b3J5LmNyZWF0ZU11bHRpY2FzdEZhY2UoImZlODA6OmFhNTQ6YjJmZjpmZTA4OjI3Yjgld2xhbjAiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkUwMTowOjA6MDowOjA6MDoyIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDc1IiksCisvLyAgICAgICAgICAgICAgICAgICAgVWRwRmFjdG9yeTo6RXJyb3IpOworLy8KKy8vICBCT09TVF9DSEVDS19USFJPVyhmYWN0b3J5LmNyZWF0ZU11bHRpY2FzdEZhY2UoImZhODA6OjIwYTo5ZGZmOmZlZjY6MTJmZiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGRTEyOjA6MDowOjA6MDowOjIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwNzUiKSwKKy8vICAgICAgICAgICAgICAgICAgICBVZHBGYWN0b3J5OjpFcnJvcik7CisvLworLy8gIC8vbm90IGEgbXVsdGljYXN0IGlwdjYKKy8vICBCT09TVF9DSEVDS19USFJPVyhmYWN0b3J5LmNyZWF0ZU11bHRpY2FzdEZhY2UoImZhODA6OjIwYTo5ZGZmOmZlZjY6MTJmZiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBMTEyOjA6MDowOjA6MDowOjIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwNzUiKSwKKy8vICAgICAgICAgICAgICAgICAgICBVZHBGYWN0b3J5OjpFcnJvcik7Cit9CisKK2NsYXNzIEZhY2VDcmVhdGVGaXh0dXJlIDogcHJvdGVjdGVkIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisgIHZvaWQKKyAgaWdub3JlKCkKKyAgeworICB9CisKKyAgdm9pZAorICBjaGVja0Vycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvckFjdHVhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yRXhwZWN0ZWQpCisgIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChlcnJvckFjdHVhbCwgZXJyb3JFeHBlY3RlZCk7CisgIH0KKworICB2b2lkCisgIGZhaWxJZkVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvckFjdHVhbCkKKyAgeworICAgIEJPT1NUX0ZBSUwoIk5vIGVycm9yIGV4cGVjdGVkLCBidXQgZ290OiBbIiA8PCBlcnJvckFjdHVhbCA8PCAiXSIpOworICB9Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShGYWNlQ3JlYXRlLCBGYWNlQ3JlYXRlRml4dHVyZSkKK3sKKyAgVWRwRmFjdG9yeSBmYWN0b3J5ID0gVWRwRmFjdG9yeSgpOworCisgIGZhY3RvcnkuY3JlYXRlRmFjZShGYWNlVXJpKCJ1ZHA0Oi8vMTI3LjAuMC4xIiksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlQ3JlYXRlRml4dHVyZTo6aWdub3JlLCB0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VDcmVhdGVGaXh0dXJlOjpmYWlsSWZFcnJvciwgdGhpcywgXzEpKTsKKworICBmYWN0b3J5LmNyZWF0ZUZhY2UoRmFjZVVyaSgidWRwNDovLzEyNy4wLjAuMS8iKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VDcmVhdGVGaXh0dXJlOjppZ25vcmUsIHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmRmFjZUNyZWF0ZUZpeHR1cmU6OmZhaWxJZkVycm9yLCB0aGlzLCBfMSkpOworCisgIGZhY3RvcnkuY3JlYXRlRmFjZShGYWNlVXJpKCJ1ZHA0Oi8vMTI3LjAuMC4xL3BhdGgiKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VDcmVhdGVGaXh0dXJlOjppZ25vcmUsIHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmRmFjZUNyZWF0ZUZpeHR1cmU6OmNoZWNrRXJyb3IsIHRoaXMsIF8xLCAiSW52YWxpZCBVUkkiKSk7CisKK30KKworY2xhc3MgRW5kVG9FbmRGaXh0dXJlIDogcHJvdGVjdGVkIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisgIHZvaWQKKyAgY2hhbm5lbDFfb25GYWNlQ3JlYXRlZChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBuZXdGYWNlKQorICB7CisgICAgQk9PU1RfQ0hFQ0soIXN0YXRpY19jYXN0PGJvb2w+KGZhY2UxKSk7CisgICAgY2hhbm5lbDFfb25GYWNlQ3JlYXRlZE5vQ2hlY2sobmV3RmFjZSk7CisgIH0KKworICB2b2lkCisgIGNoYW5uZWwxX29uRmFjZUNyZWF0ZWROb0NoZWNrKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIG5ld0ZhY2UpCisgIHsKKyAgICBmYWNlMSA9IG5ld0ZhY2U7CisgICAgZmFjZTEtPm9uUmVjZWl2ZUludGVyZXN0ICs9CisgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UxX29uUmVjZWl2ZUludGVyZXN0LCB0aGlzLCBfMSk7CisgICAgZmFjZTEtPm9uUmVjZWl2ZURhdGEgKz0KKyAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTFfb25SZWNlaXZlRGF0YSwgdGhpcywgXzEpOworICAgIGZhY2UxLT5vbkZhaWwgKz0KKyAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTFfb25GYWlsLCB0aGlzKTsKKyAgICBCT09TVF9DSEVDS19NRVNTQUdFKHRydWUsICJjaGFubmVsIDEgZmFjZSBjcmVhdGVkIik7CisKKyAgICBmYWNlcy5wdXNoX2JhY2soZmFjZTEpOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2hhbm5lbDFfb25Db25uZWN0RmFpbGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCisgIHsKKyAgICBCT09TVF9DSEVDS19NRVNTQUdFKGZhbHNlLCByZWFzb24pOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgZmFjZTFfb25SZWNlaXZlSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQorICB7CisgICAgZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHMucHVzaF9iYWNrKGludGVyZXN0KTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGZhY2UxX29uUmVjZWl2ZURhdGEoY29uc3QgRGF0YSYgZGF0YSkKKyAgeworICAgIGZhY2UxX3JlY2VpdmVkRGF0YXMucHVzaF9iYWNrKGRhdGEpOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgZmFjZTFfb25GYWlsKCkKKyAgeworICAgIGZhY2UxLnJlc2V0KCk7CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2hhbm5lbDJfb25GYWNlQ3JlYXRlZChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBuZXdGYWNlKQorICB7CisgICAgQk9PU1RfQ0hFQ0soIXN0YXRpY19jYXN0PGJvb2w+KGZhY2UyKSk7CisgICAgZmFjZTIgPSBuZXdGYWNlOworICAgIGZhY2UyLT5vblJlY2VpdmVJbnRlcmVzdCArPQorICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpmYWNlMl9vblJlY2VpdmVJbnRlcmVzdCwgdGhpcywgXzEpOworICAgIGZhY2UyLT5vblJlY2VpdmVEYXRhICs9CisgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UyX29uUmVjZWl2ZURhdGEsIHRoaXMsIF8xKTsKKyAgICBmYWNlMi0+b25GYWlsICs9CisgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UyX29uRmFpbCwgdGhpcyk7CisKKyAgICBmYWNlcy5wdXNoX2JhY2soZmFjZTIpOworCisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSh0cnVlLCAiY2hhbm5lbCAyIGZhY2UgY3JlYXRlZCIpOworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNoYW5uZWwyX29uQ29ubmVjdEZhaWxlZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShmYWxzZSwgcmVhc29uKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGZhY2UyX29uUmVjZWl2ZUludGVyZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKKyAgeworICAgIGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnB1c2hfYmFjayhpbnRlcmVzdCk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBmYWNlMl9vblJlY2VpdmVEYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBmYWNlMl9yZWNlaXZlZERhdGFzLnB1c2hfYmFjayhkYXRhKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGZhY2UyX29uRmFpbCgpCisgIHsKKyAgICBmYWNlMi5yZXNldCgpOworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNoYW5uZWwzX29uRmFjZUNyZWF0ZWQoY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgbmV3RmFjZSkKKyAgeworICAgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICAgIGZhY2UzID0gbmV3RmFjZTsKKyAgICBmYWNlcy5wdXNoX2JhY2sobmV3RmFjZSk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBjaGFubmVsX29uRmFjZUNyZWF0ZWQoY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgbmV3RmFjZSkKKyAgeworICAgIGZhY2VzLnB1c2hfYmFjayhuZXdGYWNlKTsKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBjaGFubmVsX29uQ29ubmVjdEZhaWxlZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShmYWxzZSwgcmVhc29uKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNoYW5uZWxfb25Db25uZWN0RmFpbGVkT2soY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbikKKyAgeworICAgIC8vIGl0J3Mgb2ssIGl0IHdhcyBzdXBwb3NlZCB0byBmYWlsCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2hlY2tGYWNlTGlzdChzaXplX3Qgc2hvdWxkQmUpCisgIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChmYWNlcy5zaXplKCksIHNob3VsZEJlKTsKKyAgfQorCisgIHZvaWQKKyAgY29ubmVjdChjb25zdCBzaGFyZWRfcHRyPFVkcENoYW5uZWw+JiBjaGFubmVsLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZW1vdGVIb3N0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZW1vdGVQb3J0KQorICB7CisgICAgY2hhbm5lbC0+Y29ubmVjdChyZW1vdGVIb3N0LCByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisgIH0KKworcHVibGljOgorICBMaW1pdGVkSW8gbGltaXRlZElvOworCisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTE7CisgIHN0ZDo6dmVjdG9yPEludGVyZXN0PiBmYWNlMV9yZWNlaXZlZEludGVyZXN0czsKKyAgc3RkOjp2ZWN0b3I8RGF0YT4gZmFjZTFfcmVjZWl2ZWREYXRhczsKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlMjsKKyAgc3RkOjp2ZWN0b3I8SW50ZXJlc3Q+IGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzOworICBzdGQ6OnZlY3RvcjxEYXRhPiBmYWNlMl9yZWNlaXZlZERhdGFzOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UzOworCisgIHN0ZDo6bGlzdDwgc2hhcmVkX3B0cjxGYWNlPiA+IGZhY2VzOworfTsKKworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShFbmRUb0VuZDQsIEVuZFRvRW5kRml4dHVyZSkKK3sKKyAgVWRwRmFjdG9yeSBmYWN0b3J5OworCisgIGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisKKyAgZmFjdG9yeS5jcmVhdGVGYWNlKEZhY2VVcmkoInVkcDQ6Ly8xMjcuMC4wLjE6MjAwNzAiKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDJfb25GYWNlQ3JlYXRlZCwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMl9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMSwgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3QgY29ubmVjdCBvciBjYW5ub3QgYWNjZXB0IGNvbm5lY3Rpb24iKTsKKworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGZhY2UyKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLT5nZXRSZW1vdGVVcmkoKS50b1N0cmluZygpLCAidWRwNDovLzEyNy4wLjAuMToyMDA3MCIpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMi0+Z2V0TG9jYWxVcmkoKS50b1N0cmluZygpLCAidWRwNDovLzEyNy4wLjAuMToyMDA3MSIpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMi0+aXNMb2NhbCgpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLT5nZXRDb3VudGVycygpLmdldE5PdXRCeXRlcygpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTItPmdldENvdW50ZXJzKCkuZ2V0TkluQnl0ZXMoKSwgMCk7CisgIC8vIGZhY2UxIGlzIG5vdCBjcmVhdGVkIHlldAorCisgIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gY2hhbm5lbDEgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMSIsICIyMDA3MCIpOworICBjaGFubmVsMS0+bGlzdGVuKGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDFfb25GYWNlQ3JlYXRlZCwgICB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKyAgSW50ZXJlc3QgaW50ZXJlc3QxKCJuZG46L1RwbnpHdlc5UiIpOworICBEYXRhICAgICBkYXRhMSAgICAoIm5kbjovS2ZjemhVcVZpeCIpOworICBkYXRhMS5zZXRDb250ZW50KDAsIDApOworICBJbnRlcmVzdCBpbnRlcmVzdDIoIm5kbjovUVdpSU1majVzTCIpOworICBEYXRhICAgICBkYXRhMiAgICAoIm5kbjovWE5CVjc5NmYiKTsKKyAgZGF0YTIuc2V0Q29udGVudCgwLCAwKTsKKyAgSW50ZXJlc3QgaW50ZXJlc3QzKCJuZG46L1FXaUloamdrajVzTCIpOworICBEYXRhICAgICBkYXRhMyAgICAoIm5kbjovWE5CVjc5NGYiKTsKKyAgZGF0YTMuc2V0Q29udGVudCgwLCAwKTsKKworCisgIG5kbjo6U2lnbmF0dXJlU2hhMjU2V2l0aFJzYSBmYWtlU2lnbmF0dXJlOworICBmYWtlU2lnbmF0dXJlLnNldFZhbHVlKG5kbjo6ZGF0YUJsb2NrKHRsdjo6U2lnbmF0dXJlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpOworCisgIC8vIHNldCBmYWtlIHNpZ25hdHVyZSBvbiBkYXRhMSBhbmQgZGF0YTIKKyAgZGF0YTEuc2V0U2lnbmF0dXJlKGZha2VTaWduYXR1cmUpOworICBkYXRhMi5zZXRTaWduYXR1cmUoZmFrZVNpZ25hdHVyZSk7CisgIGRhdGEzLnNldFNpZ25hdHVyZShmYWtlU2lnbmF0dXJlKTsKKworICBmYWNlMi0+c2VuZEludGVyZXN0KGludGVyZXN0Mik7CisgIGZhY2UyLT5zZW5kRGF0YSAgICAoZGF0YTIgICAgKTsKKyAgZmFjZTItPnNlbmREYXRhICAgIChkYXRhMiAgICApOworICBmYWNlMi0+c2VuZERhdGEgICAgKGRhdGEyICAgICk7CisgIHNpemVfdCBuQnl0ZXNTZW50MiA9IGludGVyZXN0Mi53aXJlRW5jb2RlKCkuc2l6ZSgpICsgZGF0YTIud2lyZUVuY29kZSgpLnNpemUoKSAqIDM7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDUsLy80IHNlbmQgKyAxIGxpc3RlbiByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lOjpzZWNvbmRzKDQpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIik7CisKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+Z2V0UmVtb3RlVXJpKCkudG9TdHJpbmcoKSwgInVkcDQ6Ly8xMjcuMC4wLjE6MjAwNzEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldExvY2FsVXJpKCkudG9TdHJpbmcoKSwgInVkcDQ6Ly8xMjcuMC4wLjE6MjAwNzAiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmlzTG9jYWwoKSwgZmFsc2UpOworCisgIGZhY2UxLT5zZW5kSW50ZXJlc3QoaW50ZXJlc3QxKTsKKyAgZmFjZTEtPnNlbmRJbnRlcmVzdChpbnRlcmVzdDEpOworICBmYWNlMS0+c2VuZEludGVyZXN0KGludGVyZXN0MSk7CisgIGZhY2UxLT5zZW5kRGF0YSAgICAoZGF0YTEgICAgKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oNCwgdGltZTo6c2Vjb25kcyg0KSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDMpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMyk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTJfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0Mi5nZXROYW1lKCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIFswXS5nZXROYW1lKCksIGRhdGEyLmdldE5hbWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzWzBdLmdldE5hbWUoKSwgaW50ZXJlc3QxLmdldE5hbWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkRGF0YXMgICAgWzBdLmdldE5hbWUoKSwgZGF0YTEuZ2V0TmFtZSgpKTsKKworCisKKyAgLy9jaGVja2luZyBpZiB0aGUgY29ubmVjdGlvbiBhY2NlcHRpbmcgbWVjaGFuaXNtIHdvcmtzIHByb3Blcmx5LgorCisgIGZhY2UyLT5zZW5kRGF0YSAgICAoZGF0YTMgICAgKTsKKyAgZmFjZTItPnNlbmRJbnRlcmVzdChpbnRlcmVzdDMpOworICBuQnl0ZXNTZW50MiArPSBkYXRhMy53aXJlRW5jb2RlKCkuc2l6ZSgpICsgaW50ZXJlc3QzLndpcmVFbmNvZGUoKS5zaXplKCk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDIsIHRpbWU6OnNlY29uZHMoMSkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IHNlbmQgb3IgcmVjZWl2ZSBJbnRlcmVzdC9EYXRhIHBhY2tldHMiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMik7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCA0KTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1sxXS5nZXROYW1lKCksIGludGVyZXN0My5nZXROYW1lKCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIFszXS5nZXROYW1lKCksIGRhdGEzLmdldE5hbWUoKSk7CisKKyAgY29uc3QgRmFjZUNvdW50ZXJzJiBjb3VudGVyczEgPSBmYWNlMS0+Z2V0Q291bnRlcnMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5JbkludGVyZXN0cygpICwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMS5nZXROSW5EYXRhcygpICAgICAsIDQpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0Tk91dEludGVyZXN0cygpLCAzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5PdXREYXRhcygpICAgICwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMS5nZXROSW5CeXRlcygpLCBuQnl0ZXNTZW50Mik7CisKKyAgY29uc3QgRmFjZUNvdW50ZXJzJiBjb3VudGVyczIgPSBmYWNlMi0+Z2V0Q291bnRlcnMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMyLmdldE5JbkludGVyZXN0cygpICwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMi5nZXROSW5EYXRhcygpICAgICAsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczIuZ2V0Tk91dEludGVyZXN0cygpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMyLmdldE5PdXREYXRhcygpICAgICwgNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMi5nZXROT3V0Qnl0ZXMoKSwgbkJ5dGVzU2VudDIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShFbmRUb0VuZDYsIEVuZFRvRW5kRml4dHVyZSkKK3sKKyAgVWRwRmFjdG9yeSBmYWN0b3J5OworCisgIGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiOjoxIiwgIjIwMDcxIik7CisKKyAgZmFjdG9yeS5jcmVhdGVGYWNlKEZhY2VVcmkoInVkcDovL1s6OjFdOjIwMDcwIiksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDJfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDEsIHRpbWU6OnNlY29uZHMoMSkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMikpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMi0+Z2V0UmVtb3RlVXJpKCkudG9TdHJpbmcoKSwgInVkcDY6Ly9bOjoxXToyMDA3MCIpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMi0+Z2V0TG9jYWxVcmkoKS50b1N0cmluZygpLCAidWRwNjovL1s6OjFdOjIwMDcxIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLT5pc0xvY2FsKCksIGZhbHNlKTsKKyAgLy8gZmFjZTEgaXMgbm90IGNyZWF0ZWQgeWV0CisKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMSA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiOjoxIiwgIjIwMDcwIik7CisgIGNoYW5uZWwxLT5saXN0ZW4oYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkZhY2VDcmVhdGVkLCAgIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBJbnRlcmVzdCBpbnRlcmVzdDEoIm5kbjovVHBuekd2VzlSIik7CisgIERhdGEgICAgIGRhdGExICAgICgibmRuOi9LZmN6aFVxVml4Iik7CisgIGRhdGExLnNldENvbnRlbnQoMCwgMCk7CisgIEludGVyZXN0IGludGVyZXN0MigibmRuOi9RV2lJTWZqNXNMIik7CisgIERhdGEgICAgIGRhdGEyICAgICgibmRuOi9YTkJWNzk2ZiIpOworICBkYXRhMi5zZXRDb250ZW50KDAsIDApOworICBJbnRlcmVzdCBpbnRlcmVzdDMoIm5kbjovUVdpSWhqZ2tqNXNMIik7CisgIERhdGEgICAgIGRhdGEzICAgICgibmRuOi9YTkJWNzk0ZiIpOworICBkYXRhMy5zZXRDb250ZW50KDAsIDApOworCisKKyAgbmRuOjpTaWduYXR1cmVTaGEyNTZXaXRoUnNhIGZha2VTaWduYXR1cmU7CisgIGZha2VTaWduYXR1cmUuc2V0VmFsdWUobmRuOjpkYXRhQmxvY2sodGx2OjpTaWduYXR1cmVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSk7CisKKyAgLy8gc2V0IGZha2Ugc2lnbmF0dXJlIG9uIGRhdGExIGFuZCBkYXRhMgorICBkYXRhMS5zZXRTaWduYXR1cmUoZmFrZVNpZ25hdHVyZSk7CisgIGRhdGEyLnNldFNpZ25hdHVyZShmYWtlU2lnbmF0dXJlKTsKKyAgZGF0YTMuc2V0U2lnbmF0dXJlKGZha2VTaWduYXR1cmUpOworCisgIGZhY2UyLT5zZW5kSW50ZXJlc3QoaW50ZXJlc3QyKTsKKyAgZmFjZTItPnNlbmREYXRhICAgIChkYXRhMiAgICApOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigzLC8vMiBzZW5kICsgMSBsaXN0ZW4gcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpOworCisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTEpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldFJlbW90ZVVyaSgpLnRvU3RyaW5nKCksICJ1ZHA2Oi8vWzo6MV06MjAwNzEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldExvY2FsVXJpKCkudG9TdHJpbmcoKSwgInVkcDY6Ly9bOjoxXToyMDA3MCIpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+aXNMb2NhbCgpLCBmYWxzZSk7CisKKyAgZmFjZTEtPnNlbmRJbnRlcmVzdChpbnRlcmVzdDEpOworICBmYWNlMS0+c2VuZERhdGEgICAgKGRhdGExICAgICk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDIsIHRpbWU6OnNlY29uZHMoMSkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IHNlbmQgb3IgcmVjZWl2ZSBJbnRlcmVzdC9EYXRhIHBhY2tldHMiKTsKKworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDEpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTJfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0Mi5nZXROYW1lKCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIFswXS5nZXROYW1lKCksIGRhdGEyLmdldE5hbWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzWzBdLmdldE5hbWUoKSwgaW50ZXJlc3QxLmdldE5hbWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkRGF0YXMgICAgWzBdLmdldE5hbWUoKSwgZGF0YTEuZ2V0TmFtZSgpKTsKKworCisKKyAgLy9jaGVja2luZyBpZiB0aGUgY29ubmVjdGlvbiBhY2NlcHRpbmcgbWVjaGFuaXNtIHdvcmtzIHByb3Blcmx5LgorCisgIGZhY2UyLT5zZW5kRGF0YSAgICAoZGF0YTMgICAgKTsKKyAgZmFjZTItPnNlbmRJbnRlcmVzdChpbnRlcmVzdDMpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigyLCB0aW1lOjpzZWNvbmRzKDEpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIik7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDIpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UxX3JlY2VpdmVkRGF0YXMgICAgLnNpemUoKSwgMik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHNbMV0uZ2V0TmFtZSgpLCBpbnRlcmVzdDMuZ2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICBbMV0uZ2V0TmFtZSgpLCBkYXRhMy5nZXROYW1lKCkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShNdWx0aXBsZUFjY2VwdHMsIEVuZFRvRW5kRml4dHVyZSkKK3sKKyAgSW50ZXJlc3QgaW50ZXJlc3QxKCJuZG46L1RwbnpHdlc5UiIpOworICBJbnRlcmVzdCBpbnRlcmVzdDIoIm5kbjovUVdpSU1majVzTCIpOworCisgIFVkcEZhY3RvcnkgZmFjdG9yeTsKKworICBzaGFyZWRfcHRyPFVkcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisKKyAgY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWxfb25GYWNlQ3JlYXRlZCwgICB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBjaGFubmVsMi0+Y29ubmVjdCgiMTI3LjAuMC4xIiwgIjIwMDcwIiwKKyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMl9vbkZhY2VDcmVhdGVkLCB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMSwgdGltZTo6c2Vjb25kcyg0KSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3QgY29ubmVjdCBvciBjYW5ub3QgYWNjZXB0IGNvbm5lY3Rpb24iKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlcy5zaXplKCksIDEpOworCisgIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gY2hhbm5lbDMgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMSIsICIyMDA3MiIpOworICBjaGFubmVsMy0+Y29ubmVjdCgiMTI3LjAuMC4xIiwgIjIwMDcwIiwKKyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsM19vbkZhY2VDcmVhdGVkLCB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsNCA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDczIik7CisKKyAgQk9PU1RfQ0hFQ0tfTkUoY2hhbm5lbDMsIGNoYW5uZWw0KTsKKworICBzY2hlZHVsZXI6OnNjaGVkdWxlKHRpbWU6Om1pbGxpc2Vjb25kcyg1MDApLAorICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y29ubmVjdCwgdGhpcywgY2hhbm5lbDQsICIxMjcuMC4wLjEiLCAiMjAwNzAiKSk7CisKKyAgc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjptaWxsaXNlY29uZHMoNDAwKSwgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGVja0ZhY2VMaXN0LCB0aGlzLCAyKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDIsLy8gMiBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgIHRpbWU6OnNlY29uZHMoNCkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBtdWx0aXBsZSBjb25uZWN0aW9ucyIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VzLnNpemUoKSwgMyk7CisKKworICBmYWNlMi0+c2VuZEludGVyZXN0KGludGVyZXN0MSk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigxLCB0aW1lOjpzZWNvbmRzKDEpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCA0KTsKKworICBmYWNlMy0+c2VuZEludGVyZXN0KGludGVyZXN0Mik7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigxLCB0aW1lOjpzZWNvbmRzKDEpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIik7CisKKyAgLy9jaGFubmVsMSBzaG91bGQgaGF2ZSBjcmVhdGVkIDIgZmFjZXMsIG9uZSB3aGVuIGZhY2UyIHNlbnQgYW4gaW50ZXJlc3QsIG9uZSB3aGVuIGZhY2UzIHNlbnQgYW4gaW50ZXJlc3QKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCA1KTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWxfb25GYWNlQ3JlYXRlZCwgICAgIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWxfb25Db25uZWN0RmFpbGVkT2ssIHRoaXMsIF8xKSksCisgICAgICAgICAgICAgICAgICAgIFVkcENoYW5uZWw6OkVycm9yKTsKK30KKworLy9UZXN0IGNvbW1lbnRlZCBiZWNhdXNlIGl0IHJlcXVpcmVkIHRvIGJlIHJ1biBpbiBhIG1hY2hpbmUgdGhhdCBjYW4gcmVzb2x2ZSBpcHY2IHF1ZXJ5CisvL0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEVuZFRvRW5kSXB2NiwgRW5kVG9FbmRGaXh0dXJlKQorLy97CisvLyAgVWRwRmFjdG9yeSBmYWN0b3J5ID0gVWRwRmFjdG9yeSgpOworLy8gIFNjaGVkdWxlciBzY2hlZHVsZXIoZ19pbyk7IC8vIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgdGltZSB0aGUgdGVzdCBtYXkgdGFrZQorLy8KKy8vICBFdmVudElkIGFib3J0RXZlbnQgPQorLy8gIHNjaGVkdWxlci5zY2hlZHVsZUV2ZW50KHRpbWU6OnNlY29uZHMoMSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjphYm9ydFRlc3RDYXNlLCB0aGlzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIikpOworLy8KKy8vICBsaW1pdGVkSW9SZW1haW5pbmcgPSAxOworLy8KKy8vICBzaGFyZWRfcHRyPFVkcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCI6OjEiLCAiMjAwNzAiKTsKKy8vICBzaGFyZWRfcHRyPFVkcENoYW5uZWw+IGNoYW5uZWwyID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCI6OjEiLCAiMjAwNzEiKTsKKy8vCisvLyAgY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorLy8gICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisvLworLy8gIGNoYW5uZWwyLT5jb25uZWN0KCI6OjEiLCAiMjAwNzAiLAorLy8gICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDJfb25GYWNlQ3JlYXRlZCwgdGhpcywgXzEpLAorLy8gICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDJfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworLy8gIGdfaW8ucnVuKCk7CisvLyAgZ19pby5yZXNldCgpOworLy8gIHNjaGVkdWxlci5jYW5jZWxFdmVudChhYm9ydEV2ZW50KTsKKy8vCisvLyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMikpOworLy8KKy8vICBhYm9ydEV2ZW50ID0KKy8vICBzY2hlZHVsZXIuc2NoZWR1bGVFdmVudCh0aW1lOjpzZWNvbmRzKDEpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6YWJvcnRUZXN0Q2FzZSwgdGhpcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpKTsKKy8vCisvLyAgSW50ZXJlc3QgaW50ZXJlc3QxKCJuZG46L1RwbnpHdlc5UiIpOworLy8gIERhdGEgICAgIGRhdGExICAgICgibmRuOi9LZmN6aFVxVml4Iik7CisvLyAgZGF0YTEuc2V0Q29udGVudCgwLCAwKTsKKy8vICBJbnRlcmVzdCBpbnRlcmVzdDIoIm5kbjovUVdpSU1majVzTCIpOworLy8gIERhdGEgICAgIGRhdGEyICAgICgibmRuOi9YTkJWNzk2ZiIpOworLy8gIGRhdGEyLnNldENvbnRlbnQoMCwgMCk7CisvLyAgSW50ZXJlc3QgaW50ZXJlc3QzKCJuZG46L1FXaUloamdrajVzTCIpOworLy8gIERhdGEgICAgIGRhdGEzICAgICgibmRuOi9YTkJWNzk0ZiIpOworLy8gIGRhdGEzLnNldENvbnRlbnQoMCwgMCk7CisvLworLy8gIG5kbjo6U2lnbmF0dXJlU2hhMjU2V2l0aFJzYSBmYWtlU2lnbmF0dXJlOworLy8gIGZha2VTaWduYXR1cmUuc2V0VmFsdWUobmRuOjpkYXRhQmxvY2sodGx2OjpTaWduYXR1cmVWYWx1ZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oMCksIDApKTsKKy8vCisvLyAgLy8gc2V0IGZha2Ugc2lnbmF0dXJlIG9uIGRhdGExIGFuZCBkYXRhMgorLy8gIGRhdGExLnNldFNpZ25hdHVyZShmYWtlU2lnbmF0dXJlKTsKKy8vICBkYXRhMi5zZXRTaWduYXR1cmUoZmFrZVNpZ25hdHVyZSk7CisvLyAgZGF0YTMuc2V0U2lnbmF0dXJlKGZha2VTaWduYXR1cmUpOworLy8KKy8vICBmYWNlMi0+c2VuZEludGVyZXN0KGludGVyZXN0Mik7CisvLyAgZmFjZTItPnNlbmREYXRhICAgIChkYXRhMiAgICApOworLy8KKy8vICBsaW1pdGVkSW9SZW1haW5pbmcgPSAzOyAvLzIgc2VuZCArIDEgbGlzdGVuIHJldHVybgorLy8gIGdfaW8ucnVuKCk7CisvLyAgZ19pby5yZXNldCgpOworLy8gIHNjaGVkdWxlci5jYW5jZWxFdmVudChhYm9ydEV2ZW50KTsKKy8vCisvLyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworLy8KKy8vICBmYWNlMS0+c2VuZEludGVyZXN0KGludGVyZXN0MSk7CisvLyAgZmFjZTEtPnNlbmREYXRhICAgIChkYXRhMSAgICApOworLy8KKy8vICBhYm9ydEV2ZW50ID0KKy8vICBzY2hlZHVsZXIuc2NoZWR1bGVFdmVudCh0aW1lOjpzZWNvbmRzKDEpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6YWJvcnRUZXN0Q2FzZSwgdGhpcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpKTsKKy8vICBsaW1pdGVkSW9SZW1haW5pbmcgPSAyOworLy8gIGdfaW8ucnVuKCk7CisvLyAgZ19pby5yZXNldCgpOworLy8gIHNjaGVkdWxlci5jYW5jZWxFdmVudChhYm9ydEV2ZW50KTsKKy8vCisvLyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDEpOworLy8gIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKy8vICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMSk7CisvLyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMl9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDEpOworLy8KKy8vICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0Mi5nZXROYW1lKCkpOworLy8gIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxX3JlY2VpdmVkRGF0YXMgICAgWzBdLmdldE5hbWUoKSwgZGF0YTIuZ2V0TmFtZSgpKTsKKy8vICBCT09TVF9DSEVDS19FUVVBTChmYWNlMl9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0MS5nZXROYW1lKCkpOworLy8gIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkRGF0YXMgICAgWzBdLmdldE5hbWUoKSwgZGF0YTEuZ2V0TmFtZSgpKTsKKy8vCisvLyAgLy9jaGVja2luZyBpZiB0aGUgY29ubmVjdGlvbiBhY2NlcHRpbmcgbWVjaGFuaXNtIHdvcmtzIHByb3Blcmx5LgorLy8KKy8vICBmYWNlMi0+c2VuZERhdGEgICAgKGRhdGEzICAgICk7CisvLyAgZmFjZTItPnNlbmRJbnRlcmVzdChpbnRlcmVzdDMpOworLy8KKy8vICBhYm9ydEV2ZW50ID0KKy8vICBzY2hlZHVsZXIuc2NoZWR1bGVFdmVudCh0aW1lOjpzZWNvbmRzKDEpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6YWJvcnRUZXN0Q2FzZSwgdGhpcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpKTsKKy8vICBsaW1pdGVkSW9SZW1haW5pbmcgPSAyOworLy8gIGdfaW8ucnVuKCk7CisvLyAgZ19pby5yZXNldCgpOworLy8gIHNjaGVkdWxlci5jYW5jZWxFdmVudChhYm9ydEV2ZW50KTsKKy8vCisvLyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDIpOworLy8gIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAyKTsKKy8vCisvLyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHNbMV0uZ2V0TmFtZSgpLCBpbnRlcmVzdDMuZ2V0TmFtZSgpKTsKKy8vICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIFsxXS5nZXROYW1lKCksIGRhdGEzLmdldE5hbWUoKSk7CisvLworLy99CisKKworLy9UZXN0IGNvbW1lbnRlZCBiZWNhdXNlIGl0IHJlcXVpcmVkIHRvIGJlIHJ1biBpbiBhIG1hY2hpbmUgdGhhdCBjYW4gcmVzb2x2ZSBpcHY2IHF1ZXJ5CisvL0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKE11bHRpcGxlQWNjZXB0c0lwdjYsIEVuZFRvRW5kRml4dHVyZSkKKy8veworLy8gIEludGVyZXN0IGludGVyZXN0MSgibmRuOi9UcG56R3ZXOVIiKTsKKy8vICBJbnRlcmVzdCBpbnRlcmVzdDIoIm5kbjovUVdpSU1majVzTCIpOworLy8gIEludGVyZXN0IGludGVyZXN0MygibmRuOi9RV2lJaGpna2o1c0wiKTsKKy8vCisvLyAgVWRwRmFjdG9yeSBmYWN0b3J5ID0gVWRwRmFjdG9yeSgpOworLy8gIFNjaGVkdWxlciBzY2hlZHVsZXIoZ19pbyk7IC8vIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgdGltZSB0aGUgdGVzdCBtYXkgdGFrZQorLy8KKy8vICBFdmVudElkIGFib3J0RXZlbnQgPQorLy8gIHNjaGVkdWxlci5zY2hlZHVsZUV2ZW50KHRpbWU6OnNlY29uZHMoNCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjphYm9ydFRlc3RDYXNlLCB0aGlzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBjb25uZWN0IG9yIGNhbm5vdCBhY2NlcHQgY29ubmVjdGlvbiIpKTsKKy8vCisvLyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMSA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiOjoxIiwgIjIwMDcwIik7CisvLyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiOjoxIiwgIjIwMDcxIik7CisvLworLy8gIGNoYW5uZWwxLT5saXN0ZW4oYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorLy8gICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKy8vCisvLyAgY2hhbm5lbDItPmNvbm5lY3QoIjo6MSIsICIyMDA3MCIsCisvLyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMl9vbkZhY2VDcmVhdGVkLCB0aGlzLCBfMSksCisvLyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKy8vCisvLyAgbGltaXRlZElvUmVtYWluaW5nID0gMTsKKy8vICBnX2lvLnJ1bigpOworLy8gIGdfaW8ucmVzZXQoKTsKKy8vICBzY2hlZHVsZXIuY2FuY2VsRXZlbnQoYWJvcnRFdmVudCk7CisvLworLy8gIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VzLnNpemUoKSwgMSk7CisvLworLy8gIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gY2hhbm5lbDMgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjo6MSIsICIyMDA3MiIpOworLy8gIGNoYW5uZWwzLT5jb25uZWN0KCI6OjEiLCAiMjAwNzAiLAorLy8gICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDNfb25GYWNlQ3JlYXRlZCwgdGhpcywgXzEpLAorLy8gICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisvLworLy8gIHNoYXJlZF9wdHI8VWRwQ2hhbm5lbD4gY2hhbm5lbDQgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjo6MSIsICIyMDA3MyIpOworLy8KKy8vICBCT09TVF9DSEVDS19ORShjaGFubmVsMywgY2hhbm5lbDQpOworLy8KKy8vICBzY2hlZHVsZXIKKy8vICAuc2NoZWR1bGVFdmVudCh0aW1lOjptaWxsaXNlY29uZHMoNTAwKSwKKy8vICAgICAgICAgICAgICAgICBiaW5kKCZVZHBDaGFubmVsOjpjb25uZWN0LCBjaGFubmVsNCwKKy8vICAgICAgICAgICAgICAgICAgICAgICI6OjEiLCAiMjAwNzAiLAorLy8gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VWRwQ2hhbm5lbDo6RmFjZUNyZWF0ZWRDYWxsYmFjaz4oYmluZCgmRW5kVG9FbmRGaXh0dXJlOjoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9vbkZhY2VDcmVhdGVkLCB0aGlzLCBfMSkpLAorLy8gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VWRwQ2hhbm5lbDo6Q29ubmVjdEZhaWxlZENhbGxiYWNrPihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpKSk7CisvLworLy8gIGxpbWl0ZWRJb1JlbWFpbmluZyA9IDI7IC8vIDIgY29ubmVjdHMKKy8vICBhYm9ydEV2ZW50ID0KKy8vICBzY2hlZHVsZXIuc2NoZWR1bGVFdmVudCh0aW1lOjpzZWNvbmRzKDQpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6YWJvcnRUZXN0Q2FzZSwgdGhpcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3QgY29ubmVjdCBvciBjYW5ub3QgYWNjZXB0IG11bHRpcGxlIGNvbm5lY3Rpb25zIikpOworLy8KKy8vICBzY2hlZHVsZXIuc2NoZWR1bGVFdmVudCh0aW1lOjpzZWNvbmRzKDAuNCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGVja0ZhY2VMaXN0LCB0aGlzLCAyKSk7CisvLworLy8gIGdfaW8ucnVuKCk7CisvLyAgZ19pby5yZXNldCgpOworLy8KKy8vICBCT09TVF9DSEVDS19FUVVBTChmYWNlcy5zaXplKCksIDMpOworLy8KKy8vCisvLyAgZmFjZTItPnNlbmRJbnRlcmVzdChpbnRlcmVzdDEpOworLy8gIGFib3J0RXZlbnQgPQorLy8gIHNjaGVkdWxlci5zY2hlZHVsZUV2ZW50KHRpbWU6OnNlY29uZHMoMSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjphYm9ydFRlc3RDYXNlLCB0aGlzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIikpOworLy8gIGxpbWl0ZWRJb1JlbWFpbmluZyA9IDE7CisvLyAgZ19pby5ydW4oKTsKKy8vICBnX2lvLnJlc2V0KCk7CisvLyAgc2NoZWR1bGVyLmNhbmNlbEV2ZW50KGFib3J0RXZlbnQpOworLy8KKy8vICBCT09TVF9DSEVDS19FUVVBTChmYWNlcy5zaXplKCksIDQpOworLy8KKy8vICBmYWNlMy0+c2VuZEludGVyZXN0KGludGVyZXN0Mik7CisvLyAgYWJvcnRFdmVudCA9CisvLyAgc2NoZWR1bGVyLnNjaGVkdWxlRXZlbnQodGltZTo6c2Vjb25kcygxKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmFib3J0VGVzdENhc2UsIHRoaXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IHNlbmQgb3IgcmVjZWl2ZSBJbnRlcmVzdC9EYXRhIHBhY2tldHMiKSk7CisvLyAgbGltaXRlZElvUmVtYWluaW5nID0gMTsKKy8vICBnX2lvLnJ1bigpOworLy8gIGdfaW8ucmVzZXQoKTsKKy8vICBzY2hlZHVsZXIuY2FuY2VsRXZlbnQoYWJvcnRFdmVudCk7CisvLworLy8gIC8vY2hhbm5lbDEgc2hvdWxkIGhhdmUgY3JlYXRlZCAyIGZhY2VzLCBvbmUgd2hlbiBmYWNlMiBzZW50IGFuIGludGVyZXN0LCBvbmUgd2hlbiBmYWNlMyBzZW50IGFuIGludGVyZXN0CisvLyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCA1KTsKKy8vICBCT09TVF9DSEVDS19USFJPVyhjaGFubmVsMS0+bGlzdGVuKGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbF9vbkZhY2VDcmVhdGVkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfMSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsX29uQ29ubmVjdEZhaWxlZE9rLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfMSkpLAorLy8gICAgICAgICAgICAgICAgICAgIFVkcENoYW5uZWw6OkVycm9yKTsKKy8vfQorCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEZhY2VDbG9zaW5nLCBFbmRUb0VuZEZpeHR1cmUpCit7CisgIFVkcEZhY3RvcnkgZmFjdG9yeSA9IFVkcEZhY3RvcnkoKTsKKworICBzaGFyZWRfcHRyPFVkcENoYW5uZWw+IGNoYW5uZWwxID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIik7CisKKyAgY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDFfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisgIGNoYW5uZWwyLT5jb25uZWN0KCIxMjcuMC4wLjEiLCAiMjAwNzAiLAorICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uRmFjZUNyZWF0ZWQsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMl9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDEsIHRpbWU6OnNlY29uZHMoNCkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDItPnNpemUoKSwgMSk7CisKKyAgQk9PU1RfQ0hFQ0soc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTIpKTsKKworICAvLyBGYWNlOjpjbG9zZSBtdXN0IGJlIGludm9rZWQgZHVyaW5nIGlvIHJ1biB0byBiZSBjb3VudGVkIGFzIGFuIG9wCisgIHNjaGVkdWxlcjo6c2NoZWR1bGUodGltZTo6bWlsbGlzZWNvbmRzKDEwMCksIGJpbmQoJkZhY2U6OmNsb3NlLCBmYWNlMikpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigxLCB0aW1lOjpzZWNvbmRzKDQpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIkZhY2VDbG9zaW5nIGVycm9yOiBjYW5ub3QgcHJvcGVybHkgY2xvc2UgZmFjZXMiKTsKKworICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTIpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMi0+c2l6ZSgpLCAwKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoQ2xvc2luZ0lkbGVGYWNlLCBFbmRUb0VuZEZpeHR1cmUpCit7CisgIEludGVyZXN0IGludGVyZXN0MSgibmRuOi9UcG56R3ZXOVIiKTsKKyAgSW50ZXJlc3QgaW50ZXJlc3QyKCJuZG46L1FXaUlNZmo1c0wiKTsKKworICBVZHBGYWN0b3J5IGZhY3Rvcnk7CisKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMSA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOjpzZWNvbmRzKDIpKTsKKyAgc2hhcmVkX3B0cjxVZHBDaGFubmVsPiBjaGFubmVsMiA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiMTI3LjAuMC4xIiwgIjIwMDcxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOjpzZWNvbmRzKDIpKTsKKworICBjaGFubmVsMS0+bGlzdGVuKGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDFfb25GYWNlQ3JlYXRlZCwgICB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKyAgY2hhbm5lbDItPmNvbm5lY3QoIjEyNy4wLjAuMSIsICIyMDA3MCIsCisgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDJfb25GYWNlQ3JlYXRlZCwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwyX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMSwgdGltZTo6c2Vjb25kcyg0KSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVZHBDaGFubmVsIGVycm9yOiBjYW5ub3QgY29ubmVjdCBvciBjYW5ub3QgYWNjZXB0IGNvbm5lY3Rpb24iKTsKKworICBmYWNlMi0+c2VuZEludGVyZXN0KGludGVyZXN0MSk7CisgIEJPT1NUX0NIRUNLKCFmYWNlMi0+aXNPbkRlbWFuZCgpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwvLzEgc2VuZCArIDEgbGlzdGVuIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOjpzZWNvbmRzKDEpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDEsIHRpbWU6OnNlY29uZHMoMikpID09IExpbWl0ZWRJbzo6RVhDRUVEX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgIklkbGUgZmFjZSBzaG91bGQgYmUgc3RpbGwgb3BlbiBiZWNhdXNlIGhhcyBiZWVuIHVzZWQgcmVjZW50bHkiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDEsIHRpbWU6OnNlY29uZHMoNCkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiQ2xvc2luZyBpZGxlIGZhY2UgZXJyb3I6IGZhY2Ugc2hvdWxkIGJlIGNsb3NlZCBieSBub3ciKTsKKworICAvL3RoZSBmYWNlIG9uIGxpc3RlbiBzaG91bGQgYmUgY2xvc2VkIG5vdworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMS0+c2l6ZSgpLCAwKTsKKyAgLy9jaGVja2luZyB0aGF0IGZhY2UyIGhhcyBub3QgYmVlbiBjbG9zZWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDItPnNpemUoKSwgMSk7CisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTIpKTsKKworICBmYWNlMi0+c2VuZEludGVyZXN0KGludGVyZXN0Mik7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1bigyLC8vMSBzZW5kICsgMSBsaXN0ZW4gcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6OnNlY29uZHMoMSkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVWRwQ2hhbm5lbCBlcnJvcjogY2Fubm90IHNlbmQgb3IgcmVjZWl2ZSBJbnRlcmVzdC9EYXRhIHBhY2tldHMiKTsKKyAgLy9jaGFubmVsMSBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgbmV3IGZhY2UgYnkgbm93CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNoYW5uZWwxLT5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMi0+c2l6ZSgpLCAxKTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworICBCT09TVF9DSEVDSyhmYWNlMS0+aXNPbkRlbWFuZCgpKTsKKworICBjaGFubmVsMS0+Y29ubmVjdCgiMTI3LjAuMC4xIiwgIjIwMDcxIiwKKyAgICAgICAgICAgICAgICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkZhY2VDcmVhdGVkTm9DaGVjaywgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMSwvLzEgY29ubmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOjpzZWNvbmRzKDEpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlVkcENoYW5uZWwgZXJyb3I6IGNhbm5vdCBjb25uZWN0Iik7CisKKyAgQk9PU1RfQ0hFQ0soIWZhY2UxLT5pc09uRGVtYW5kKCkpOworCisgIC8vdGhlIGNvbm5lY3Qgc2hvdWxkIGhhdmUgc2V0IGZhY2UxIGFzIHBlcm1hbmVudCBmYWNlLAorICAvL2J1dCBpdCBzaG91bG4ndCBoYXZlIGNyZWF0ZWQgYW55IGFkZGl0aW9uYWwgZmFjZXMKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNoYW5uZWwyLT5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMSwgdGltZTo6c2Vjb25kcyg0KSkgPT0gTGltaXRlZElvOjpFWENFRURfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAiSWRsZSBmYWNlIHNob3VsZCBiZSBzdGlsbCBvcGVuIGJlY2F1c2UgaXQncyBwZXJtYW5lbnQgbm93Iik7CisgIC8vYm90aCBmYWNlcyBhcmUgcGVybWFuZW50LCBub3RoaW5nIHNob3VsZCBoYXZlIGNoYW5nZWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNoYW5uZWwyLT5zaXplKCksIDEpOworfQorCitjbGFzcyBGYWtlTmV0d29ya0ludGVyZmFjZUZpeHR1cmUgOiBwdWJsaWMgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgRmFrZU5ldHdvcmtJbnRlcmZhY2VGaXh0dXJlKCkKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6YXNpbzo6aXA7CisKKyAgICBhdXRvIGZha2VJbnRlcmZhY2VzID0gbWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8TmV0d29ya0ludGVyZmFjZUluZm8+PigpOworCisgICAgZmFrZUludGVyZmFjZXMtPnB1c2hfYmFjaygKKyAgICAgIE5ldHdvcmtJbnRlcmZhY2VJbmZvIHswLCAiZXRoMCIsCisgICAgICAgIGV0aGVybmV0OjpBZGRyZXNzOjpmcm9tU3RyaW5nKCIzZToxNTpjMjo4Yjo2NTowMCIpLAorICAgICAgICB7YWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjAuMC4wLjAiKX0sCisgICAgICAgIHthZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZygiOjoiKX0sCisgICAgICAgIGFkZHJlc3NfdjQoKSwKKyAgICAgICAgSUZGX1VQfSk7CisgICAgZmFrZUludGVyZmFjZXMtPnB1c2hfYmFjaygKKyAgICAgIE5ldHdvcmtJbnRlcmZhY2VJbmZvIHsxLCAiZXRoMCIsCisgICAgICAgIGV0aGVybmV0OjpBZGRyZXNzOjpmcm9tU3RyaW5nKCIzZToxNTpjMjo4Yjo2NTowMCIpLAorICAgICAgICB7YWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5Mi4xNjguMi4xIiksIGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTIuMTY4LjIuMiIpfSwKKyAgICAgICAge30sCisgICAgICAgIGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTIuMTY4LjIuMjU1IiksCisgICAgICAgIDB9KTsKKyAgICBmYWtlSW50ZXJmYWNlcy0+cHVzaF9iYWNrKAorICAgICAgTmV0d29ya0ludGVyZmFjZUluZm8gezIsICJldGgxIiwKKyAgICAgICAgZXRoZXJuZXQ6OkFkZHJlc3M6OmZyb21TdHJpbmcoIjNlOjE1OmMyOjhiOjY1OjAwIiksCisgICAgICAgIHthZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTk4LjUxLjEwMC4xIil9LAorICAgICAgICB7YWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjoyIiksIGFkZHJlc3NfdjY6OmZyb21fc3RyaW5nKCIyMDAxOmRiODo6MyIpfSwKKyAgICAgICAgYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5OC41MS4xMDAuMjU1IiksCisgICAgICAgIElGRl9NVUxUSUNBU1QgfCBJRkZfQlJPQURDQVNUIHwgSUZGX1VQfSk7CisKKyAgICBzZXREZWJ1Z05ldHdvcmtJbnRlcmZhY2VzKGZha2VJbnRlcmZhY2VzKTsKKyAgfQorCisgIH5GYWtlTmV0d29ya0ludGVyZmFjZUZpeHR1cmUoKQorICB7CisgICAgc2V0RGVidWdOZXR3b3JrSW50ZXJmYWNlcyhudWxscHRyKTsKKyAgfQorfTsKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoQnVnMjI5MiwgRmFrZU5ldHdvcmtJbnRlcmZhY2VGaXh0dXJlKQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmFzaW86OmlwOworCisgIFVkcEZhY3RvcnkgZmFjdG9yeTsKKyAgZmFjdG9yeS5wcm9oaWJpdEVuZHBvaW50KHVkcDo6RW5kcG9pbnQoYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5Mi4xNjguMi4xIiksIDEwMjQpKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWN0b3J5Lm1fcHJvaGliaXRlZEVuZHBvaW50cy5zaXplKCksIDEpOworICBCT09TVF9DSEVDSygoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMgPT0KKyAgICAgICAgICAgICAgIHN0ZDo6c2V0PHVkcDo6RW5kcG9pbnQ+IHsKKyAgICAgICAgICAgICAgICAgdWRwOjpFbmRwb2ludChhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTkyLjE2OC4yLjEiKSwgMTAyNCksCisgICAgICAgICAgICAgICB9KSk7CisKKyAgZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuY2xlYXIoKTsKKyAgZmFjdG9yeS5wcm9oaWJpdEVuZHBvaW50KHVkcDo6RW5kcG9pbnQoYWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjoxIiksIDIwNDgpKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWN0b3J5Lm1fcHJvaGliaXRlZEVuZHBvaW50cy5zaXplKCksIDEpOworICBCT09TVF9DSEVDSygoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMgPT0KKyAgICAgICAgICAgICAgIHN0ZDo6c2V0PHVkcDo6RW5kcG9pbnQ+IHsKKyAgICAgICAgICAgICAgICAgdWRwOjpFbmRwb2ludChhZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZygiMjAwMTpkYjg6OjEiKSwgMjA0OCksCisgICAgICAgICAgICAgICB9KSk7CisKKyAgZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuY2xlYXIoKTsKKyAgZmFjdG9yeS5wcm9oaWJpdEVuZHBvaW50KHVkcDo6RW5kcG9pbnQoYWRkcmVzc192NCgpLCAxMDI0KSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuc2l6ZSgpLCA2KTsKKyAgQk9PU1RfQ0hFQ0soKGZhY3RvcnkubV9wcm9oaWJpdGVkRW5kcG9pbnRzID09CisgICAgICAgICAgICAgICBzdGQ6OnNldDx1ZHA6OkVuZHBvaW50PiB7CisgICAgICAgICAgICAgICAgIHVkcDo6RW5kcG9pbnQoYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoIjE5Mi4xNjguMi4xIiksIDEwMjQpLAorICAgICAgICAgICAgICAgICB1ZHA6OkVuZHBvaW50KGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTIuMTY4LjIuMiIpLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgdWRwOjpFbmRwb2ludChhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMTk4LjUxLjEwMC4xIiksIDEwMjQpLAorICAgICAgICAgICAgICAgICB1ZHA6OkVuZHBvaW50KGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxOTguNTEuMTAwLjI1NSIpLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgdWRwOjpFbmRwb2ludChhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygiMjU1LjI1NS4yNTUuMjU1IiksIDEwMjQpLAorICAgICAgICAgICAgICAgICB1ZHA6OkVuZHBvaW50KGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIwLjAuMC4wIiksIDEwMjQpCisgICAgICAgICAgICAgICB9KSk7CisKKyAgZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuY2xlYXIoKTsKKyAgZmFjdG9yeS5wcm9oaWJpdEVuZHBvaW50KHVkcDo6RW5kcG9pbnQoYWRkcmVzc192NigpLCAyMDQ4KSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjdG9yeS5tX3Byb2hpYml0ZWRFbmRwb2ludHMuc2l6ZSgpLCAzKTsKKyAgQk9PU1RfQ0hFQ0soKGZhY3RvcnkubV9wcm9oaWJpdGVkRW5kcG9pbnRzID09CisgICAgICAgICAgICAgICBzdGQ6OnNldDx1ZHA6OkVuZHBvaW50PiB7CisgICAgICAgICAgICAgICAgIHVkcDo6RW5kcG9pbnQoYWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoIjIwMDE6ZGI4OjoyIiksIDIwNDgpLAorICAgICAgICAgICAgICAgICB1ZHA6OkVuZHBvaW50KGFkZHJlc3NfdjY6OmZyb21fc3RyaW5nKCIyMDAxOmRiODo6MyIpLCAyMDQ4KSwKKyAgICAgICAgICAgICAgICAgdWRwOjpFbmRwb2ludChhZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZygiOjoiKSwgMjA0OCksCisgICAgICAgICAgICAgICB9KSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2ZhY2UvdW5peC1zdHJlYW0uY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1NGVjCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3VuaXgtc3RyZWFtLmNwcApAQCAtMCwwICsxLDUwNSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZhY2UvdW5peC1zdHJlYW0tZmFjdG9yeS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSAidGVzdHMvbGltaXRlZC1pby5ocHAiCisjaW5jbHVkZSAiZHVtbXktc3RyZWFtLXNlbmRlci5ocHAiCisjaW5jbHVkZSAicGFja2V0LWRhdGFzZXRzLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCit1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmFzaW86OmxvY2FsOworCisjZGVmaW5lIENIQU5ORUxfUEFUSDEgInVuaXgtc3RyZWFtLXRlc3QuMS5zb2NrIgorI2RlZmluZSBDSEFOTkVMX1BBVEgyICJ1bml4LXN0cmVhbS10ZXN0LjIuc29jayIKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEZhY2VVbml4U3RyZWFtLCBCYXNlRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2hhbm5lbE1hcCkKK3sKKyAgVW5peFN0cmVhbUZhY3RvcnkgZmFjdG9yeTsKKworICBzaGFyZWRfcHRyPFVuaXhTdHJlYW1DaGFubmVsPiBjaGFubmVsMSA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbChDSEFOTkVMX1BBVEgxKTsKKyAgc2hhcmVkX3B0cjxVbml4U3RyZWFtQ2hhbm5lbD4gY2hhbm5lbDFhID0gZmFjdG9yeS5jcmVhdGVDaGFubmVsKENIQU5ORUxfUEFUSDEpOworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMSwgY2hhbm5lbDFhKTsKKyAgc3RkOjpzdHJpbmcgY2hhbm5lbDF1cmkgPSBjaGFubmVsMS0+Z2V0VXJpKCkudG9TdHJpbmcoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDF1cmkuZmluZCgidW5peDovLy8iKSwgMCk7IC8vIHRoaXJkICcvJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDF1cmkucmZpbmQoQ0hBTk5FTF9QQVRIMSksCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwxdXJpLnNpemUoKSAtIHN0ZDo6c3RyaW5nKENIQU5ORUxfUEFUSDEpLnNpemUoKSk7CisKKyAgc2hhcmVkX3B0cjxVbml4U3RyZWFtQ2hhbm5lbD4gY2hhbm5lbDIgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoQ0hBTk5FTF9QQVRIMik7CisgIEJPT1NUX0NIRUNLX05FKGNoYW5uZWwxLCBjaGFubmVsMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEdldENoYW5uZWxzKQoreworICBVbml4U3RyZWFtRmFjdG9yeSBmYWN0b3J5OworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY3RvcnkuZ2V0Q2hhbm5lbHMoKS5lbXB0eSgpLCB0cnVlKTsKKworICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID4gZXhwZWN0ZWRDaGFubmVsczsKKworICBleHBlY3RlZENoYW5uZWxzLnB1c2hfYmFjayhmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoQ0hBTk5FTF9QQVRIMSkpOworICBleHBlY3RlZENoYW5uZWxzLnB1c2hfYmFjayhmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoQ0hBTk5FTF9QQVRIMikpOworCisgIHN0ZDo6bGlzdDxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID4gY2hhbm5lbHMgPSBmYWN0b3J5LmdldENoYW5uZWxzKCk7CisgIGZvciAoc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgaSAhPSBjaGFubmVscy5lbmQoKTsgKytpKQorICAgIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPjo6aXRlcmF0b3IgcG9zID0KKyAgICAgICAgc3RkOjpmaW5kKGV4cGVjdGVkQ2hhbm5lbHMuYmVnaW4oKSwgZXhwZWN0ZWRDaGFubmVscy5lbmQoKSwgKmkpOworCisgICAgICBCT09TVF9SRVFVSVJFKHBvcyAhPSBleHBlY3RlZENoYW5uZWxzLmVuZCgpKTsKKyAgICAgIGV4cGVjdGVkQ2hhbm5lbHMuZXJhc2UocG9zKTsKKyAgICB9CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRDaGFubmVscy5zaXplKCksIDApOworfQorCitjbGFzcyBFbmRUb0VuZEZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgdm9pZAorICBjbGllbnRfb25Db25uZWN0KGNvbnN0IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUmIGVycm9yKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXJyb3IsIGVycm9yLm1lc3NhZ2UoKSk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBjaGFubmVsMV9vbkZhY2VDcmVhdGVkKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIG5ld0ZhY2UpCisgIHsKKyAgICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTEpKTsKKyAgICBmYWNlMSA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8VW5peFN0cmVhbUZhY2U+KG5ld0ZhY2UpOworICAgIGZhY2UxLT5vblJlY2VpdmVJbnRlcmVzdCArPQorICAgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpmYWNlMV9vblJlY2VpdmVJbnRlcmVzdCwgdGhpcywgXzEpOworICAgIGZhY2UxLT5vblJlY2VpdmVEYXRhICs9CisgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UxX29uUmVjZWl2ZURhdGEsIHRoaXMsIF8xKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNoYW5uZWwxX29uQ29ubmVjdEZhaWxlZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShmYWxzZSwgcmVhc29uKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGZhY2UxX29uUmVjZWl2ZUludGVyZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKKyAgeworICAgIGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzLnB1c2hfYmFjayhpbnRlcmVzdCk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBmYWNlMV9vblJlY2VpdmVEYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBmYWNlMV9yZWNlaXZlZERhdGFzLnB1c2hfYmFjayhkYXRhKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGZhY2UyX29uUmVjZWl2ZUludGVyZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKKyAgeworICAgIGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnB1c2hfYmFjayhpbnRlcmVzdCk7CisKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBmYWNlMl9vblJlY2VpdmVEYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBmYWNlMl9yZWNlaXZlZERhdGFzLnB1c2hfYmFjayhkYXRhKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNoYW5uZWxfb25GYWNlQ3JlYXRlZChjb25zdCBzaGFyZWRfcHRyPEZhY2U+JiBuZXdGYWNlKQorICB7CisgICAgZmFjZXMucHVzaF9iYWNrKHN0YXRpY19wb2ludGVyX2Nhc3Q8VW5peFN0cmVhbUZhY2U+KG5ld0ZhY2UpKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNoYW5uZWxfb25Db25uZWN0RmFpbGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCisgIHsKKyAgICBCT09TVF9DSEVDS19NRVNTQUdFKGZhbHNlLCByZWFzb24pOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIExpbWl0ZWRJbyBsaW1pdGVkSW87CisKKyAgc2hhcmVkX3B0cjxVbml4U3RyZWFtRmFjZT4gZmFjZTE7CisgIHN0ZDo6dmVjdG9yPEludGVyZXN0PiBmYWNlMV9yZWNlaXZlZEludGVyZXN0czsKKyAgc3RkOjp2ZWN0b3I8RGF0YT4gZmFjZTFfcmVjZWl2ZWREYXRhczsKKyAgc2hhcmVkX3B0cjxVbml4U3RyZWFtRmFjZT4gZmFjZTI7CisgIHN0ZDo6dmVjdG9yPEludGVyZXN0PiBmYWNlMl9yZWNlaXZlZEludGVyZXN0czsKKyAgc3RkOjp2ZWN0b3I8RGF0YT4gZmFjZTJfcmVjZWl2ZWREYXRhczsKKworICBzdGQ6Omxpc3Q8IHNoYXJlZF9wdHI8VW5peFN0cmVhbUZhY2U+ID4gZmFjZXM7Cit9OworCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEVuZFRvRW5kLCBFbmRUb0VuZEZpeHR1cmUpCit7CisgIFVuaXhTdHJlYW1GYWN0b3J5IGZhY3Rvcnk7CisKKyAgc2hhcmVkX3B0cjxVbml4U3RyZWFtQ2hhbm5lbD4gY2hhbm5lbDEgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoQ0hBTk5FTF9QQVRIMSk7CisgIGNoYW5uZWwxLT5saXN0ZW4oYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkZhY2VDcmVhdGVkLCAgIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uQ29ubmVjdEZhaWxlZCwgdGhpcywgXzEpKTsKKworICBzaGFyZWRfcHRyPHN0cmVhbV9wcm90b2NvbDo6c29ja2V0PiBjbGllbnQgPSBtYWtlX3NoYXJlZDxzdHJlYW1fcHJvdG9jb2w6OnNvY2tldD4ocmVmKGdfaW8pKTsKKyAgY2xpZW50LT5hc3luY19jb25uZWN0KHN0cmVhbV9wcm90b2NvbDo6ZW5kcG9pbnQoQ0hBTk5FTF9QQVRIMSksCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNsaWVudF9vbkNvbm5lY3QsIHRoaXMsIF8xKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDIsIHRpbWU6OnNlY29uZHMoMSkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5peFN0cmVhbUNoYW5uZWwgZXJyb3I6IGNhbm5vdCBjb25uZWN0IG9yIGNhbm5vdCBhY2NlcHQgY29ubmVjdGlvbiIpOworCisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTEpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+Z2V0UmVtb3RlVXJpKCkuZ2V0U2NoZW1lKCksICJmZCIpOworICBCT09TVF9DSEVDS19OT19USFJPVyhib29zdDo6bGV4aWNhbF9jYXN0PGludD4oZmFjZTEtPmdldFJlbW90ZVVyaSgpLmdldEhvc3QoKSkpOworICBzdGQ6OnN0cmluZyBmYWNlMWxvY2FsVXJpID0gZmFjZTEtPmdldExvY2FsVXJpKCkudG9TdHJpbmcoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFsb2NhbFVyaS5maW5kKCJ1bml4Oi8vLyIpLCAwKTsgLy8gdGhpcmQgJy8nIGlzIHRoZSBwYXRoIHNlcGFyYXRvcgorICBCT09TVF9DSEVDS19FUVVBTChmYWNlMWxvY2FsVXJpLnJmaW5kKENIQU5ORUxfUEFUSDEpLAorICAgICAgICAgICAgICAgICAgICBmYWNlMWxvY2FsVXJpLnNpemUoKSAtIHN0ZDo6c3RyaW5nKENIQU5ORUxfUEFUSDEpLnNpemUoKSk7CisKKyAgZmFjZTIgPSBtYWtlX3NoYXJlZDxVbml4U3RyZWFtRmFjZT4oY2xpZW50KTsKKyAgZmFjZTItPm9uUmVjZWl2ZUludGVyZXN0ICs9CisgICAgYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpmYWNlMl9vblJlY2VpdmVJbnRlcmVzdCwgdGhpcywgXzEpOworICBmYWNlMi0+b25SZWNlaXZlRGF0YSArPQorICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTJfb25SZWNlaXZlRGF0YSwgdGhpcywgXzEpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MSA9IG1ha2VJbnRlcmVzdCgibmRuOi9UcG56R3ZXOVIiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiAgICAgZGF0YTEgICAgID0gbWFrZURhdGEoIm5kbjovS2ZjemhVcVZpeCIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDIgPSBtYWtlSW50ZXJlc3QoIm5kbjovUVdpSU1majVzTCIpOworICBzaGFyZWRfcHRyPERhdGE+ICAgICBkYXRhMiAgICAgPSBtYWtlRGF0YSgibmRuOi9YTkJWNzk2ZiIpOworCisgIGZhY2UxLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0MSk7CisgIGZhY2UxLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0MSk7CisgIGZhY2UxLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0MSk7CisgIGZhY2UxLT5zZW5kRGF0YSAgICAoKmRhdGExICAgICk7CisgIHNpemVfdCBuQnl0ZXNTZW50MSA9IGludGVyZXN0MS0+d2lyZUVuY29kZSgpLnNpemUoKSAqIDMgKyBkYXRhMS0+d2lyZUVuY29kZSgpLnNpemUoKTsKKyAgZmFjZTItPnNlbmRJbnRlcmVzdCgqaW50ZXJlc3QyKTsKKyAgZmFjZTItPnNlbmREYXRhICAgICgqZGF0YTIgICAgKTsKKyAgZmFjZTItPnNlbmREYXRhICAgICgqZGF0YTIgICAgKTsKKyAgZmFjZTItPnNlbmREYXRhICAgICgqZGF0YTIgICAgKTsKKyAgc2l6ZV90IG5CeXRlc1NlbnQyID0gaW50ZXJlc3QyLT53aXJlRW5jb2RlKCkuc2l6ZSgpICsgZGF0YTItPndpcmVFbmNvZGUoKS5zaXplKCkgKiAzOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UobGltaXRlZElvLnJ1big4LCB0aW1lOjpzZWNvbmRzKDEpKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIlVuaXhTdHJlYW1DaGFubmVsIGVycm9yOiBjYW5ub3Qgc2VuZCBvciByZWNlaXZlIEludGVyZXN0L0RhdGEgcGFja2V0cyIpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDMpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMyk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTJfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0Mi0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICBbMF0uZ2V0TmFtZSgpLCBkYXRhMi0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTJfcmVjZWl2ZWRJbnRlcmVzdHNbMF0uZ2V0TmFtZSgpLCBpbnRlcmVzdDEtPmdldE5hbWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkRGF0YXMgICAgWzBdLmdldE5hbWUoKSwgZGF0YTEtPmdldE5hbWUoKSk7CisKKyAgLy8gbmVlZGVkIHRvIGVuc3VyZSBOT3V0Qnl0ZXMgY291bnRlcnMgYXJlIGFjY3VyYXRlCisgIGxpbWl0ZWRJby5ydW4oTGltaXRlZElvOjpVTkxJTUlURURfT1BTLCB0aW1lOjpzZWNvbmRzKDEpKTsKKworICBjb25zdCBGYWNlQ291bnRlcnMmIGNvdW50ZXJzMSA9IGZhY2UxLT5nZXRDb3VudGVycygpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0TkluSW50ZXJlc3RzKCkgLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5JbkRhdGFzKCkgICAgICwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMS5nZXROT3V0SW50ZXJlc3RzKCksIDMpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0Tk91dERhdGFzKCkgICAgLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5JbkJ5dGVzKCksIG5CeXRlc1NlbnQyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5PdXRCeXRlcygpLCBuQnl0ZXNTZW50MSk7CisKKyAgY29uc3QgRmFjZUNvdW50ZXJzJiBjb3VudGVyczIgPSBmYWNlMi0+Z2V0Q291bnRlcnMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMyLmdldE5JbkludGVyZXN0cygpICwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMi5nZXROSW5EYXRhcygpICAgICAsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczIuZ2V0Tk91dEludGVyZXN0cygpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMyLmdldE5PdXREYXRhcygpICAgICwgMyk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKE11bHRpcGxlQWNjZXB0cywgRW5kVG9FbmRGaXh0dXJlKQoreworICBVbml4U3RyZWFtRmFjdG9yeSBmYWN0b3J5OworCisgIHNoYXJlZF9wdHI8VW5peFN0cmVhbUNoYW5uZWw+IGNoYW5uZWwgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoQ0hBTk5FTF9QQVRIMSk7CisgIGNoYW5uZWwtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWxfb25GYWNlQ3JlYXRlZCwgICB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWxfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisgIHNoYXJlZF9wdHI8c3RyZWFtX3Byb3RvY29sOjpzb2NrZXQ+IGNsaWVudDEgPSBtYWtlX3NoYXJlZDxzdHJlYW1fcHJvdG9jb2w6OnNvY2tldD4ocmVmKGdfaW8pKTsKKyAgY2xpZW50MS0+YXN5bmNfY29ubmVjdChzdHJlYW1fcHJvdG9jb2w6OmVuZHBvaW50KENIQU5ORUxfUEFUSDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2xpZW50X29uQ29ubmVjdCwgdGhpcywgXzEpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVbml4U3RyZWFtQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZXMuc2l6ZSgpLCAxKTsKKworICBzaGFyZWRfcHRyPHN0cmVhbV9wcm90b2NvbDo6c29ja2V0PiBjbGllbnQyID0gbWFrZV9zaGFyZWQ8c3RyZWFtX3Byb3RvY29sOjpzb2NrZXQ+KHJlZihnX2lvKSk7CisgIGNsaWVudDItPmFzeW5jX2Nvbm5lY3Qoc3RyZWFtX3Byb3RvY29sOjplbmRwb2ludChDSEFOTkVMX1BBVEgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNsaWVudF9vbkNvbm5lY3QsIHRoaXMsIF8xKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDIsIHRpbWU6OnNlY29uZHMoMSkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5peFN0cmVhbUNoYW5uZWwgZXJyb3I6IGNhbm5vdCBhY2NlcHQgbXVsdGlwbGUgY29ubmVjdGlvbnMiKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlcy5zaXplKCksIDIpOworCisgIC8vIG5vdyBjbG9zZSBvbmUgb2YgdGhlIGZhY2VzCisgIGZhY2VzLmZyb250KCktPmNsb3NlKCk7CisKKyAgLy8gd2Ugc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gc2VuZC9yZWNlaXZlIHdpdGggdGhlIG90aGVyIG9uZQorICBmYWNlMSA9IGZhY2VzLmJhY2soKTsKKyAgZmFjZTEtPm9uUmVjZWl2ZUludGVyZXN0ICs9IGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTFfb25SZWNlaXZlSW50ZXJlc3QsIHRoaXMsIF8xKTsKKyAgZmFjZTEtPm9uUmVjZWl2ZURhdGEgKz0gYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpmYWNlMV9vblJlY2VpdmVEYXRhLCB0aGlzLCBfMSk7CisKKyAgZmFjZTIgPSBtYWtlX3NoYXJlZDxVbml4U3RyZWFtRmFjZT4oY2xpZW50Mik7CisgIGZhY2UyLT5vblJlY2VpdmVJbnRlcmVzdCArPSBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UyX29uUmVjZWl2ZUludGVyZXN0LCB0aGlzLCBfMSk7CisgIGZhY2UyLT5vblJlY2VpdmVEYXRhICs9IGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTJfb25SZWNlaXZlRGF0YSwgdGhpcywgXzEpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MSA9IG1ha2VJbnRlcmVzdCgibmRuOi9UcG56R3ZXOVIiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiAgICAgZGF0YTEgICAgID0gbWFrZURhdGEoIm5kbjovS2ZjemhVcVZpeCIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDIgPSBtYWtlSW50ZXJlc3QoIm5kbjovUVdpSU1majVzTCIpOworICBzaGFyZWRfcHRyPERhdGE+ICAgICBkYXRhMiAgICAgPSBtYWtlRGF0YSgibmRuOi9YTkJWNzk2ZiIpOworCisgIGZhY2UxLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0MSk7CisgIGZhY2UxLT5zZW5kRGF0YSAgICAoKmRhdGExICAgICk7CisgIGZhY2UyLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0Mik7CisgIGZhY2UyLT5zZW5kRGF0YSAgICAoKmRhdGEyICAgICk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDQsIHRpbWU6OnNlY29uZHMoMSkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5peFN0cmVhbUNoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIik7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDEpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UxX3JlY2VpdmVkRGF0YXMgICAgLnNpemUoKSwgMSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTJfcmVjZWl2ZWRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMl9yZWNlaXZlZERhdGFzICAgIC5zaXplKCksIDEpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzWzBdLmdldE5hbWUoKSwgaW50ZXJlc3QyLT5nZXROYW1lKCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzICAgIFswXS5nZXROYW1lKCksIGRhdGEyLT5nZXROYW1lKCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMl9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0MS0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTJfcmVjZWl2ZWREYXRhcyAgICBbMF0uZ2V0TmFtZSgpLCBkYXRhMS0+Z2V0TmFtZSgpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitub09wKCkKK3sKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVW5peFN0cmVhbUZhY2VMb2NhbENvbnRyb2xIZWFkZXIsIEVuZFRvRW5kRml4dHVyZSkKK3sKKyAgVW5peFN0cmVhbUZhY3RvcnkgZmFjdG9yeTsKKworICBzaGFyZWRfcHRyPFVuaXhTdHJlYW1DaGFubmVsPiBjaGFubmVsMSA9IGZhY3RvcnkuY3JlYXRlQ2hhbm5lbChDSEFOTkVMX1BBVEgxKTsKKyAgY2hhbm5lbDEtPmxpc3RlbihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNoYW5uZWwxX29uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2hhbm5lbDFfb25Db25uZWN0RmFpbGVkLCB0aGlzLCBfMSkpOworCisgIHNoYXJlZF9wdHI8c3RyZWFtX3Byb3RvY29sOjpzb2NrZXQ+IGNsaWVudCA9IG1ha2Vfc2hhcmVkPHN0cmVhbV9wcm90b2NvbDo6c29ja2V0PihyZWYoZ19pbykpOworICBjbGllbnQtPmFzeW5jX2Nvbm5lY3Qoc3RyZWFtX3Byb3RvY29sOjplbmRwb2ludChDSEFOTkVMX1BBVEgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2xpZW50X29uQ29ubmVjdCwgdGhpcywgXzEpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVbml4U3RyZWFtQ2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWNlMSkpOworCisgIGZhY2UyID0gbWFrZV9zaGFyZWQ8VW5peFN0cmVhbUZhY2U+KGNsaWVudCk7CisgIGZhY2UyLT5vblJlY2VpdmVJbnRlcmVzdCArPQorICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTJfb25SZWNlaXZlSW50ZXJlc3QsIHRoaXMsIF8xKTsKKyAgZmFjZTItPm9uUmVjZWl2ZURhdGEgKz0KKyAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UyX29uUmVjZWl2ZURhdGEsIHRoaXMsIF8xKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDEgPSBtYWtlSW50ZXJlc3QoIm5kbjovVHBuekd2VzlSIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gICAgIGRhdGExICAgICA9IG1ha2VEYXRhKCJuZG46L0tmY3poVXFWaXgiKTsKKworICBmYWNlMS0+c2V0TG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZShMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCk7CisgIGZhY2UxLT5zZXRMb2NhbENvbnRyb2xIZWFkZXJGZWF0dXJlKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9ORVhUX0hPUF9GQUNFX0lEKTsKKworICBCT09TVF9DSEVDSyhmYWNlMS0+aXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lEKSk7CisgIEJPT1NUX0NIRUNLKGZhY2UxLT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpKTsKKworICBmYWNlMi0+c2V0TG9jYWxDb250cm9sSGVhZGVyRmVhdHVyZShMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCk7CisgIGZhY2UyLT5zZXRMb2NhbENvbnRyb2xIZWFkZXJGZWF0dXJlKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9ORVhUX0hPUF9GQUNFX0lEKTsKKworICBCT09TVF9DSEVDSyhmYWNlMi0+aXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lEKSk7CisgIEJPT1NUX0NIRUNLKGZhY2UyLT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpKTsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIGludGVyZXN0MS0+c2V0SW5jb21pbmdGYWNlSWQoMTEpOworICBpbnRlcmVzdDEtPnNldE5leHRIb3BGYWNlSWQoMTExKTsKKworICBmYWNlMS0+c2VuZEludGVyZXN0KCppbnRlcmVzdDEpOworCisgIGRhdGExLT5zZXRJbmNvbWluZ0ZhY2VJZCgyMik7CisgIGRhdGExLT5nZXRMb2NhbENvbnRyb2xIZWFkZXIoKS5zZXROZXh0SG9wRmFjZUlkKDIyMik7CisKKyAgZmFjZTEtPnNlbmREYXRhKCpkYXRhMSk7CisKKyAgLy8KKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVbml4U3RyZWFtQ2hhbm5lbCBlcnJvcjogY2Fubm90IHNlbmQgb3IgcmVjZWl2ZSBJbnRlcmVzdC9EYXRhIHBhY2tldHMiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTJfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKworICAvLyBzZW5kaW5nIGFsbG93cyBvbmx5IEluY29taW5nRmFjZUlkLCByZWNlaXZpbmcgYWxsb3dzIG9ubHkgTmV4dEhvcEZhY2VJZAorICBCT09TVF9DSEVDS19FUVVBTChmYWNlMl9yZWNlaXZlZEludGVyZXN0c1swXS5nZXRMb2NhbENvbnRyb2xIZWFkZXIoKS5oYXNJbmNvbWluZ0ZhY2VJZCgpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkSW50ZXJlc3RzWzBdLmdldExvY2FsQ29udHJvbEhlYWRlcigpLmhhc05leHRIb3BGYWNlSWQoKSwgZmFsc2UpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyX3JlY2VpdmVkRGF0YXNbMF0uZ2V0TG9jYWxDb250cm9sSGVhZGVyKCkuaGFzSW5jb21pbmdGYWNlSWQoKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMl9yZWNlaXZlZERhdGFzWzBdLmdldExvY2FsQ29udHJvbEhlYWRlcigpLmhhc05leHRIb3BGYWNlSWQoKSwgZmFsc2UpOworCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojphc2lvOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0X2J1ZmZlcj4gaW50ZXJlc3RXaXRoSGVhZGVyOworICBCbG9jayBpSGVhZGVyICA9IGludGVyZXN0MS0+Z2V0TG9jYWxDb250cm9sSGVhZGVyKCkud2lyZUVuY29kZSgqaW50ZXJlc3QxLCB0cnVlLCB0cnVlKTsKKyAgQmxvY2sgaVBheWxvYWQgPSBpbnRlcmVzdDEtPndpcmVFbmNvZGUoKTsKKyAgaW50ZXJlc3RXaXRoSGVhZGVyLnB1c2hfYmFjayhidWZmZXIoaUhlYWRlci53aXJlKCksICBpSGVhZGVyLnNpemUoKSkpOworICBpbnRlcmVzdFdpdGhIZWFkZXIucHVzaF9iYWNrKGJ1ZmZlcihpUGF5bG9hZC53aXJlKCksIGlQYXlsb2FkLnNpemUoKSkpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0X2J1ZmZlcj4gZGF0YVdpdGhIZWFkZXI7CisgIEJsb2NrIGRIZWFkZXIgID0gZGF0YTEtPmdldExvY2FsQ29udHJvbEhlYWRlcigpLndpcmVFbmNvZGUoKmRhdGExLCB0cnVlLCB0cnVlKTsKKyAgQmxvY2sgZFBheWxvYWQgPSBkYXRhMS0+d2lyZUVuY29kZSgpOworICBkYXRhV2l0aEhlYWRlci5wdXNoX2JhY2soYnVmZmVyKGRIZWFkZXIud2lyZSgpLCAgZEhlYWRlci5zaXplKCkpKTsKKyAgZGF0YVdpdGhIZWFkZXIucHVzaF9iYWNrKGJ1ZmZlcihkUGF5bG9hZC53aXJlKCksIGRQYXlsb2FkLnNpemUoKSkpOworCisgIC8vCisKKyAgY2xpZW50LT5hc3luY19zZW5kKGludGVyZXN0V2l0aEhlYWRlciwgYmluZCgmbm9PcCkpOworICBjbGllbnQtPmFzeW5jX3NlbmQoZGF0YVdpdGhIZWFkZXIsIGJpbmQoJm5vT3ApKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICJVbml4U3RyZWFtQ2hhbm5lbCBlcnJvcjogY2Fubm90IHNlbmQgb3IgcmVjZWl2ZSBJbnRlcmVzdC9EYXRhIHBhY2tldHMiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzLnNpemUoKSwgMSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXRMb2NhbENvbnRyb2xIZWFkZXIoKS5oYXNJbmNvbWluZ0ZhY2VJZCgpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzWzBdLmdldExvY2FsQ29udHJvbEhlYWRlcigpLmhhc05leHRIb3BGYWNlSWQoKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzWzBdLmdldE5leHRIb3BGYWNlSWQoKSwgMTExKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZERhdGFzWzBdLmdldExvY2FsQ29udHJvbEhlYWRlcigpLmhhc0luY29taW5nRmFjZUlkKCksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhc1swXS5nZXRMb2NhbENvbnRyb2xIZWFkZXIoKS5oYXNOZXh0SG9wRmFjZUlkKCksIGZhbHNlKTsKK30KKworCitjbGFzcyBTaW1wbGVFbmRUb0VuZEZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgdm9pZAorICBvbkZhY2VDcmVhdGVkKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIGZhY2UpCisgIHsKKyAgICBmYWNlLT5vblJlY2VpdmVJbnRlcmVzdCArPQorICAgICAgYmluZCgmU2ltcGxlRW5kVG9FbmRGaXh0dXJlOjpvblJlY2VpdmVJbnRlcmVzdCwgdGhpcywgXzEpOworICAgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0KKyAgICAgIGJpbmQoJlNpbXBsZUVuZFRvRW5kRml4dHVyZTo6b25SZWNlaXZlRGF0YSwgdGhpcywgXzEpOworICAgIGZhY2UtPm9uRmFpbCArPQorICAgICAgYmluZCgmU2ltcGxlRW5kVG9FbmRGaXh0dXJlOjpvbkZhaWwsIHRoaXMsIGZhY2UpOworCisgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGR5bmFtaWNfcG9pbnRlcl9jYXN0PExvY2FsRmFjZT4oZmFjZSkpKSB7CisgICAgICBzdGF0aWNfcG9pbnRlcl9jYXN0PExvY2FsRmFjZT4oZmFjZSktPnNldExvY2FsQ29udHJvbEhlYWRlckZlYXR1cmUoCisgICAgICAgIExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lEKTsKKworICAgICAgc3RhdGljX3BvaW50ZXJfY2FzdDxMb2NhbEZhY2U+KGZhY2UpLT5zZXRMb2NhbENvbnRyb2xIZWFkZXJGZWF0dXJlKAorICAgICAgICBMT0NBTF9DT05UUk9MX0ZFQVRVUkVfTkVYVF9IT1BfRkFDRV9JRCk7CisgICAgfQorCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgb25Db25uZWN0RmFpbGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCisgIHsKKyAgICBCT09TVF9DSEVDS19NRVNTQUdFKGZhbHNlLCByZWFzb24pOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgb25SZWNlaXZlSW50ZXJlc3QoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQorICB7CisgICAgcmVjZWl2ZWRJbnRlcmVzdHMucHVzaF9iYWNrKGludGVyZXN0KTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIG9uUmVjZWl2ZURhdGEoY29uc3QgRGF0YSYgZGF0YSkKKyAgeworICAgIHJlY2VpdmVkRGF0YXMucHVzaF9iYWNrKGRhdGEpOworCisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgb25GYWlsKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIGZhY2UpCisgIHsKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKK3B1YmxpYzoKKyAgTGltaXRlZElvIGxpbWl0ZWRJbzsKKworICBzdGQ6OnZlY3RvcjxJbnRlcmVzdD4gcmVjZWl2ZWRJbnRlcmVzdHM7CisgIHN0ZDo6dmVjdG9yPERhdGE+IHJlY2VpdmVkRGF0YXM7Cit9OworCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFX1RFTVBMQVRFKENvcnJ1cHRlZElucHV0LCBEYXRhc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ycnVwdGVkUGFja2V0cywgU2ltcGxlRW5kVG9FbmRGaXh0dXJlKQoreworICBVbml4U3RyZWFtRmFjdG9yeSBmYWN0b3J5OworCisgIHNoYXJlZF9wdHI8VW5peFN0cmVhbUNoYW5uZWw+IGNoYW5uZWwgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoQ0hBTk5FTF9QQVRIMSk7CisgIGNoYW5uZWwtPmxpc3RlbihiaW5kKCZTaW1wbGVFbmRUb0VuZEZpeHR1cmU6Om9uRmFjZUNyZWF0ZWQsICAgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgYmluZCgmU2ltcGxlRW5kVG9FbmRGaXh0dXJlOjpvbkNvbm5lY3RGYWlsZWQsIHRoaXMsIF8xKSk7CisKKyAgRHVtbXlTdHJlYW1TZW5kZXI8c3RyZWFtX3Byb3RvY29sLCBEYXRhc2V0PiBzZW5kZXI7CisgIHNlbmRlci5zdGFydChzdHJlYW1fcHJvdG9jb2w6OmVuZHBvaW50KENIQU5ORUxfUEFUSDEpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oTGltaXRlZElvOjpVTkxJTUlURURfT1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTo6c2Vjb25kcygxKSkgPT0gTGltaXRlZElvOjpFWENFRURfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biBmb3IgIiArIERhdGFzZXQ6OmdldE5hbWUoKSk7Cit9CisKKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vZmFjZS93ZWJzb2NrZXQuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9mYWNlL3dlYnNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5M2I2YQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZmFjZS93ZWJzb2NrZXQuY3BwCkBAIC0wLDAgKzEsMjkzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZmFjZS93ZWJzb2NrZXQtZmFjdG9yeS5ocHAiCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2xpbWl0ZWQtaW8uaHBwIgorCisjaW5jbHVkZSA8d2Vic29ja2V0cHAvY29uZmlnL2FzaW9fbm9fdGxzX2NsaWVudC5ocHA+CisjaW5jbHVkZSA8d2Vic29ja2V0cHAvY2xpZW50LmhwcD4KKwordHlwZWRlZiB3ZWJzb2NrZXRwcDo6Y2xpZW50PHdlYnNvY2tldHBwOjpjb25maWc6OmFzaW9fY2xpZW50PiBDbGllbnQ7CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEZhY2VXZWJTb2NrZXQsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShHZXRDaGFubmVscykKK3sKKyAgV2ViU29ja2V0RmFjdG9yeSBmYWN0b3J5KCIxOTU5NiIpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY3RvcnkuZ2V0Q2hhbm5lbHMoKS5lbXB0eSgpLCB0cnVlKTsKKworICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID4gZXhwZWN0ZWRDaGFubmVsczsKKworICBleHBlY3RlZENoYW5uZWxzLnB1c2hfYmFjayhmYWN0b3J5LmNyZWF0ZUNoYW5uZWwoIjEyNy4wLjAuMSIsICIyMDA3MCIpKTsKKyAgZXhwZWN0ZWRDaGFubmVscy5wdXNoX2JhY2soZmFjdG9yeS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzEiKSk7CisgIGV4cGVjdGVkQ2hhbm5lbHMucHVzaF9iYWNrKGZhY3RvcnkuY3JlYXRlQ2hhbm5lbCgiOjoxIiwgIjIwMDcxIikpOworCisgIHN0ZDo6bGlzdDxzaGFyZWRfcHRyPGNvbnN0IENoYW5uZWw+ID4gY2hhbm5lbHMgPSBmYWN0b3J5LmdldENoYW5uZWxzKCk7CisgIGZvciAoc3RkOjpsaXN0PHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgaSAhPSBjaGFubmVscy5lbmQoKTsgKytpKQorICAgIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Y29uc3QgQ2hhbm5lbD4gPjo6aXRlcmF0b3IgcG9zID0KKyAgICAgICAgc3RkOjpmaW5kKGV4cGVjdGVkQ2hhbm5lbHMuYmVnaW4oKSwgZXhwZWN0ZWRDaGFubmVscy5lbmQoKSwgKmkpOworCisgICAgICBCT09TVF9SRVFVSVJFKHBvcyAhPSBleHBlY3RlZENoYW5uZWxzLmVuZCgpKTsKKyAgICAgIGV4cGVjdGVkQ2hhbm5lbHMuZXJhc2UocG9zKTsKKyAgICB9CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRDaGFubmVscy5zaXplKCksIDApOworfQorCitjbGFzcyBFbmRUb0VuZEZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgdm9pZAorICBjaGFubmVsMV9vbkZhY2VDcmVhdGVkKGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIG5ld0ZhY2UpCisgIHsKKyAgICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4oZmFjZTEpKTsKKyAgICBmYWNlMSA9IG5ld0ZhY2U7CisgICAgZmFjZTEtPm9uUmVjZWl2ZUludGVyZXN0ICs9CisgICAgICBiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmZhY2UxX29uUmVjZWl2ZUludGVyZXN0LCB0aGlzLCBfMSk7CisgICAgZmFjZTEtPm9uUmVjZWl2ZURhdGEgKz0KKyAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTFfb25SZWNlaXZlRGF0YSwgdGhpcywgXzEpOworICAgIGZhY2UxLT5vbkZhaWwgKz0KKyAgICAgIGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6ZmFjZTFfb25GYWlsLCB0aGlzKTsKKworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGZhY2UxX29uUmVjZWl2ZUludGVyZXN0KGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKKyAgeworICAgIGZhY2UxX3JlY2VpdmVkSW50ZXJlc3RzLnB1c2hfYmFjayhpbnRlcmVzdCk7CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgZmFjZTFfb25SZWNlaXZlRGF0YShjb25zdCBEYXRhJiBkYXRhKQorICB7CisgICAgZmFjZTFfcmVjZWl2ZWREYXRhcy5wdXNoX2JhY2soZGF0YSk7CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgZmFjZTFfb25GYWlsKCkKKyAgeworICAgIGZhY2UxLnJlc2V0KCk7CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2xpZW50MV9vbk9wZW4od2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCkKKyAgeworICAgIGhhbmRsZSA9IGhkbDsKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgdm9pZAorICBjbGllbnQxX29uQ2xvc2Uod2Vic29ja2V0cHA6OmNvbm5lY3Rpb25faGRsIGhkbCkKKyAgeworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworICB2b2lkCisgIGNsaWVudDFfb25GYWlsKHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbCBoZGwpCisgIHsKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICB9CisKKyAgYm9vbAorICBjbGllbnQxX29uUGluZyh3ZWJzb2NrZXRwcDo6Y29ubmVjdGlvbl9oZGwgaGRsLCBzdGQ6OnN0cmluZyBtc2cpCisgIHsKKyAgICBsaW1pdGVkSW8uYWZ0ZXJPcCgpOworICAgIC8vIFJldHVybiBmYWxzZSB0byBzdXBwcmVzcyB0aGUgcG9uZyByZXNwb25zZSwKKyAgICAvLyB3aGljaCB3aWxsIGNhdXNlIHRpbWVvdXQgaW4gdGhlIHdlYnNvY2tldCBjaGFubmVsCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZAorICBjbGllbnQxX3NlbmRJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCisgIHsKKyAgICBjb25zdCBCbG9jayYgcGF5bG9hZCA9IGludGVyZXN0LndpcmVFbmNvZGUoKTsKKyAgICBjbGllbnQxLnNlbmQoaGFuZGxlLCBwYXlsb2FkLndpcmUoKSwgcGF5bG9hZC5zaXplKCksIHdlYnNvY2tldHBwOjpmcmFtZTo6b3Bjb2RlOjpiaW5hcnkpOworICB9CisKKyAgdm9pZAorICBjbGllbnQxX3NlbmREYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBjb25zdCBCbG9jayYgcGF5bG9hZCA9IGRhdGEud2lyZUVuY29kZSgpOworICAgIGNsaWVudDEuc2VuZChoYW5kbGUsIHBheWxvYWQud2lyZSgpLCBwYXlsb2FkLnNpemUoKSwgd2Vic29ja2V0cHA6OmZyYW1lOjpvcGNvZGU6OmJpbmFyeSk7CisgIH0KKworICB2b2lkCisgIGNsaWVudDFfb25NZXNzYWdlKHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbCBoZGwsCisgICAgICAgICAgICAgICAgICAgIHdlYnNvY2tldHBwOjpjb25maWc6OmFzaW9fY2xpZW50OjptZXNzYWdlX3R5cGU6OnB0ciBtc2cpCisgIHsKKyAgICBib29sIGlzT2sgPSB0cnVlOworICAgIEJsb2NrIGVsZW1lbnQ7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBheWxvYWQgPSBtc2ctPmdldF9wYXlsb2FkKCk7CisgICAgaXNPayA9IEJsb2NrOjpmcm9tQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBheWxvYWQuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuc2l6ZSgpLCBlbGVtZW50KTsKKyAgICBpZiAoaXNPaykKKyAgICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoZWxlbWVudC50eXBlKCkgPT0gdGx2OjpJbnRlcmVzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaSA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigpOworICAgICAgICAgICAgICBpLT53aXJlRGVjb2RlKGVsZW1lbnQpOworICAgICAgICAgICAgICBjbGllbnQxX29uUmVjZWl2ZUludGVyZXN0KCppKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LnR5cGUoKSA9PSB0bHY6OkRhdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNoYXJlZF9wdHI8RGF0YT4gZCA9IG1ha2Vfc2hhcmVkPERhdGE+KCk7CisgICAgICAgICAgICAgIGQtPndpcmVEZWNvZGUoZWxlbWVudCk7CisgICAgICAgICAgICAgIGNsaWVudDFfb25SZWNlaXZlRGF0YSgqZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKHRsdjo6RXJyb3ImKSB7CisgICAgICAgICAgLy8gRG8gc29tZXRoaW5nPworICAgICAgICB9CisgICAgICB9CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2xpZW50MV9vblJlY2VpdmVJbnRlcmVzdChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCisgIHsKKyAgICBjbGllbnQxX3JlY2VpdmVkSW50ZXJlc3RzLnB1c2hfYmFjayhpbnRlcmVzdCk7CisgICAgbGltaXRlZElvLmFmdGVyT3AoKTsKKyAgfQorCisgIHZvaWQKKyAgY2xpZW50MV9vblJlY2VpdmVEYXRhKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBjbGllbnQxX3JlY2VpdmVkRGF0YXMucHVzaF9iYWNrKGRhdGEpOworICAgIGxpbWl0ZWRJby5hZnRlck9wKCk7CisgIH0KKworcHVibGljOgorICBMaW1pdGVkSW8gbGltaXRlZElvOworCisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTE7CisgIHN0ZDo6dmVjdG9yPEludGVyZXN0PiBmYWNlMV9yZWNlaXZlZEludGVyZXN0czsKKyAgc3RkOjp2ZWN0b3I8RGF0YT4gZmFjZTFfcmVjZWl2ZWREYXRhczsKKyAgQ2xpZW50IGNsaWVudDE7CisgIHdlYnNvY2tldHBwOjpjb25uZWN0aW9uX2hkbCBoYW5kbGU7CisgIHN0ZDo6dmVjdG9yPEludGVyZXN0PiBjbGllbnQxX3JlY2VpdmVkSW50ZXJlc3RzOworICBzdGQ6OnZlY3RvcjxEYXRhPiBjbGllbnQxX3JlY2VpdmVkRGF0YXM7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShFbmRUb0VuZDQsIEVuZFRvRW5kRml4dHVyZSkKK3sKKyAgV2ViU29ja2V0RmFjdG9yeSBmYWN0b3J5MSgiOTY5NiIpOworCisgIHNoYXJlZF9wdHI8V2ViU29ja2V0Q2hhbm5lbD4gY2hhbm5lbDEgPSBmYWN0b3J5MS5jcmVhdGVDaGFubmVsKCIxMjcuMC4wLjEiLCAiMjAwNzAiKTsKKyAgY2hhbm5lbDEtPnNldFBpbmdJbnRlcnZhbCh0aW1lOjptaWxsaXNlY29uZHMoMzAwMCkpOworICBjaGFubmVsMS0+c2V0UG9uZ1RpbWVvdXQodGltZTo6bWlsbGlzZWNvbmRzKDEwMDApKTsKKworICBCT09TVF9DSEVDS19FUVVBTChjaGFubmVsMS0+aXNMaXN0ZW5pbmcoKSwgZmFsc2UpOworCisgIGNoYW5uZWwxLT5saXN0ZW4oYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjaGFubmVsMV9vbkZhY2VDcmVhdGVkLCAgIHRoaXMsIF8xKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPmlzTGlzdGVuaW5nKCksIHRydWUpOworCisgIC8vIENsZWFyIGFsbCBsb2dnaW5nIGluZm8gZnJvbSB3ZWJzb2NrZXRwcCBsaWJyYXJ5CisgIGNsaWVudDEuY2xlYXJfYWNjZXNzX2NoYW5uZWxzKHdlYnNvY2tldHBwOjpsb2c6OmFsZXZlbDo6YWxsKTsKKworICBjbGllbnQxLmluaXRfYXNpbygmZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpOworICBjbGllbnQxLnNldF9vcGVuX2hhbmRsZXIoYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjbGllbnQxX29uT3BlbiwgICB0aGlzLCBfMSkpOworICBjbGllbnQxLnNldF9jbG9zZV9oYW5kbGVyKGJpbmQoJkVuZFRvRW5kRml4dHVyZTo6Y2xpZW50MV9vbkNsb3NlLCB0aGlzLCBfMSkpOworICBjbGllbnQxLnNldF9mYWlsX2hhbmRsZXIoYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjbGllbnQxX29uRmFpbCwgICB0aGlzLCBfMSkpOworICBjbGllbnQxLnNldF9tZXNzYWdlX2hhbmRsZXIoYmluZCgmRW5kVG9FbmRGaXh0dXJlOjpjbGllbnQxX29uTWVzc2FnZSwgdGhpcywgXzEsIF8yKSk7CisgIGNsaWVudDEuc2V0X3BpbmdfaGFuZGxlcihiaW5kKCZFbmRUb0VuZEZpeHR1cmU6OmNsaWVudDFfb25QaW5nLCB0aGlzLCBfMSwgXzIpKTsKKworICB3ZWJzb2NrZXRwcDo6bGliOjplcnJvcl9jb2RlIGVjOworICBDbGllbnQ6OmNvbm5lY3Rpb25fcHRyIGNvbiA9IGNsaWVudDEuZ2V0X2Nvbm5lY3Rpb24oIndzOi8vMTI3LjAuMC4xOjIwMDcwIiwgZWMpOworICBjbGllbnQxLmNvbm5lY3QoY29uKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKGxpbWl0ZWRJby5ydW4oMiwgdGltZTo6c2Vjb25kcygxMCkpID09IExpbWl0ZWRJbzo6RVhDRUVEX09QUywKKyAgICAgICAgICAgICAgICAgICAgICAiV2ViU29ja2V0Q2hhbm5lbCBlcnJvcjogY2Fubm90IGNvbm5lY3Qgb3IgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPnNpemUoKSwgMSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldExvY2FsVXJpKCkudG9TdHJpbmcoKSwgIndzOi8vMTI3LjAuMC4xOjIwMDcwIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLT5pc09uRGVtYW5kKCksIHRydWUpOworCisgIC8vQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmlzTG9jYWwoKSwgdHJ1ZSk7CisKKyAgLy9CT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihkeW5hbWljX3BvaW50ZXJfY2FzdDxMb2NhbEZhY2U+KGZhY2UxKSksIGZhbHNlKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDEgPSBtYWtlSW50ZXJlc3QoIm5kbjovVHBuekd2VzlSIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gICAgIGRhdGExICAgICA9IG1ha2VEYXRhKCJuZG46L0tmY3poVXFWaXgiKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QyID0gbWFrZUludGVyZXN0KCJuZG46L1FXaUlNZmo1c0wiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiAgICAgZGF0YTIgICAgID0gbWFrZURhdGEoIm5kbjovWE5CVjc5NmYiKTsKKworICBzdGQ6OnN0cmluZyBiaWdOYW1lKCJuZG46LyIpOworICBiaWdOYW1lLmFwcGVuZCg5MDAwLCAnYScpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBiaWdJbnRlcmVzdCA9IG1ha2VJbnRlcmVzdChiaWdOYW1lKTsKKworICBjbGllbnQxX3NlbmRJbnRlcmVzdCgqaW50ZXJlc3QxKTsKKyAgY2xpZW50MV9zZW5kSW50ZXJlc3QoKmludGVyZXN0MSk7CisgIGNsaWVudDFfc2VuZEludGVyZXN0KCppbnRlcmVzdDEpOworICBjbGllbnQxX3NlbmRJbnRlcmVzdCgqYmlnSW50ZXJlc3QpOyAgLy8gVGhpcyBvbmUgc2hvdWxkIGJlIGlnbm9yZWQgYnkgZmFjZTEKKyAgZmFjZTEtPnNlbmREYXRhICAgICAoKmRhdGExKTsKKyAgZmFjZTEtPnNlbmRJbnRlcmVzdCAoKmludGVyZXN0Mik7CisgIGNsaWVudDFfc2VuZERhdGEgICAgKCpkYXRhMik7CisgIGNsaWVudDFfc2VuZERhdGEgICAgKCpkYXRhMik7CisgIGNsaWVudDFfc2VuZERhdGEgICAgKCpkYXRhMik7CisgIHNpemVfdCBuQnl0ZXNTZW50ID0gZGF0YTEtPndpcmVFbmNvZGUoKS5zaXplKCkgKyBpbnRlcmVzdDItPndpcmVFbmNvZGUoKS5zaXplKCk7CisgIHNpemVfdCBuQnl0ZXNSZWNlaXZlZCA9IGludGVyZXN0MS0+d2lyZUVuY29kZSgpLnNpemUoKSAqIDMgKyBkYXRhMi0+d2lyZUVuY29kZSgpLnNpemUoKSAqIDM7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShsaW1pdGVkSW8ucnVuKDgsIHRpbWU6OnNlY29uZHMoMTApKSA9PSBMaW1pdGVkSW86OkVYQ0VFRF9PUFMsCisgICAgICAgICAgICAgICAgICAgICAgIldlYlNvY2tldENoYW5uZWwgZXJyb3I6IGNhbm5vdCBzZW5kIG9yIHJlY2VpdmUgSW50ZXJlc3QvRGF0YSBwYWNrZXRzIik7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDMpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UxX3JlY2VpdmVkRGF0YXMgICAgLnNpemUoKSwgMyk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoY2xpZW50MV9yZWNlaXZlZEludGVyZXN0cy5zaXplKCksIDEpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGNsaWVudDFfcmVjZWl2ZWREYXRhcyAgICAuc2l6ZSgpLCAxKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0MS0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTFfcmVjZWl2ZWREYXRhcyAgICBbMF0uZ2V0TmFtZSgpLCBkYXRhMi0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2xpZW50MV9yZWNlaXZlZEludGVyZXN0c1swXS5nZXROYW1lKCksIGludGVyZXN0Mi0+Z2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2xpZW50MV9yZWNlaXZlZERhdGFzICAgIFswXS5nZXROYW1lKCksIGRhdGExLT5nZXROYW1lKCkpOworCisgIGNvbnN0IEZhY2VDb3VudGVycyYgY291bnRlcnMxID0gZmFjZTEtPmdldENvdW50ZXJzKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMS5nZXROSW5JbnRlcmVzdHMoKSAsIDMpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0TkluRGF0YXMoKSAgICAgLCAzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlcnMxLmdldE5PdXRJbnRlcmVzdHMoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvdW50ZXJzMS5nZXROT3V0RGF0YXMoKSAgICAsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0TkluQnl0ZXMoKSwgbkJ5dGVzUmVjZWl2ZWQpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyczEuZ2V0Tk91dEJ5dGVzKCksIG5CeXRlc1NlbnQpOworCisgIGxpbWl0ZWRJby5ydW4oTGltaXRlZElvOjpVTkxJTUlURURfT1BTLCB0aW1lOjpzZWNvbmRzKDgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hhbm5lbDEtPnNpemUoKSwgMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kyLmNwcCBiL05GRC90ZXN0cy9kYWVtb24vZncvYmVzdC1yb3V0ZS1zdHJhdGVneTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTZlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kyLmNwcApAQCAtMCwwICsxLDEzMiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZ3L2Jlc3Qtcm91dGUtc3RyYXRlZ3kyLmhwcCIKKyNpbmNsdWRlICJzdHJhdGVneS10ZXN0ZXIuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2RhZW1vbi9mYWNlL2R1bW15LWZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGd0Jlc3RSb3V0ZVN0cmF0ZWd5MiwgVW5pdFRlc3RUaW1lRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoRm9yd2FyZCkKK3sKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgdHlwZWRlZiBTdHJhdGVneVRlc3Rlcjxmdzo6QmVzdFJvdXRlU3RyYXRlZ3kyPiBCZXN0Um91dGVTdHJhdGVneTJUZXN0ZXI7CisgIEJlc3RSb3V0ZVN0cmF0ZWd5MlRlc3RlciBzdHJhdGVneShmb3J3YXJkZXIpOworCisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTMgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlNCA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2U1ID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTMpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlNCk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2U1KTsKKworICBGaWImIGZpYiA9IGZvcndhcmRlci5nZXRGaWIoKTsKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSA9IGZpYi5pbnNlcnQoTmFtZSgpKS5maXJzdDsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTEsIDEwKTsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTIsIDIwKTsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTMsIDMwKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2VJbnRlcmVzdCgibmRuOi9CemdGQmNocUEiKTsKKyAgUGl0JiBwaXQgPSBmb3J3YXJkZXIuZ2V0UGl0KCk7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdCkuZmlyc3Q7CisKKyAgY29uc3QgdGltZTo6bmFub3NlY29uZHMgVElDSyA9IHRpbWU6OmR1cmF0aW9uX2Nhc3Q8dGltZTo6bmFub3NlY29uZHM+KAorICAgIGZ3OjpCZXN0Um91dGVTdHJhdGVneTI6Ok1JTl9SRVRSQU5TTUlTU0lPTl9JTlRFUlZBTCAqIDAuMDEpOworICBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBSRVRSQU5TTUlTU0lPTl8xMFAgPSB0aW1lOjpkdXJhdGlvbl9jYXN0PHRpbWU6Om5hbm9zZWNvbmRzPigKKyAgICBmdzo6QmVzdFJvdXRlU3RyYXRlZ3kyOjpNSU5fUkVUUkFOU01JU1NJT05fSU5URVJWQUwgKiAwLjEpOyAvLyAxMCUKKyAgY29uc3QgdGltZTo6bmFub3NlY29uZHMgUkVUUkFOU01JU1NJT05fNzBQID0gdGltZTo6ZHVyYXRpb25fY2FzdDx0aW1lOjpuYW5vc2Vjb25kcz4oCisgICAgZnc6OkJlc3RSb3V0ZVN0cmF0ZWd5Mjo6TUlOX1JFVFJBTlNNSVNTSU9OX0lOVEVSVkFMICogMC43KTsgLy8gNzAlCisgIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzIFJFVFJBTlNNSVNTSU9OXzIgPSB0aW1lOjpkdXJhdGlvbl9jYXN0PHRpbWU6Om5hbm9zZWNvbmRzPigKKyAgICBmdzo6QmVzdFJvdXRlU3RyYXRlZ3kyOjpNSU5fUkVUUkFOU01JU1NJT05fSU5URVJWQUwgKiAyLjApOyAvLyB4MgorCisgIC8vIGZpcnN0IEludGVyZXN0IGdvZXMgdG8gbmV4dGhvcCB3aXRoIGxvd2VzdCBGSUIgY29zdCwKKyAgLy8gaG93ZXZlciBmYWNlMSBpcyBkb3duc3RyZWFtIHNvIGl0IGNhbm5vdCBiZSB1c2VkCisgIHBpdEVudHJ5LT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UxLCAqaW50ZXJlc3QpOworICBzdHJhdGVneS5hZnRlclJlY2VpdmVJbnRlcmVzdCgqZmFjZTEsICppbnRlcmVzdCwgZmliRW50cnksIHBpdEVudHJ5KTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzdHJhdGVneS5tX3NlbmRJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LmJhY2soKS5nZXQ8MT4oKSwgZmFjZTIpOworCisgIC8vIGRvd25zdHJlYW0gcmV0cmFuc21pdHMgZnJlcXVlbnRseSwgYnV0IHRoZSBzdHJhdGVneSBzaG91bGQgbm90IHNlbmQgSW50ZXJlc3RzCisgIC8vIG1vcmUgb2Z0ZW4gdGhhbiBNSU5fUkVUUkFOU01JU1NJT05fSU5URVJWQUwKKyAgc2NoZWR1bGVyOjpFdmVudElkIHJldHhGcm9tNEV2dDsKKyAgc2l6ZV90IG5TZW50TGFzdCA9IHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeS5zaXplKCk7CisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IHRpbWVTZW50TGFzdCA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgIGZ1bmN0aW9uPHZvaWQoKT4gcGVyaW9kaWNhbFJldHhGcm9tNDsgLy8gbGV0IHBlcmlvZGljYWxSZXR4RnJvbTQgbGFtYmRhIGNhcHR1cmUgaXRzZWxmCisgIHBlcmlvZGljYWxSZXR4RnJvbTQgPSBbJl0geworICAgIHBpdEVudHJ5LT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2U0LCAqaW50ZXJlc3QpOworICAgIHN0cmF0ZWd5LmFmdGVyUmVjZWl2ZUludGVyZXN0KCpmYWNlNCwgKmludGVyZXN0LCBmaWJFbnRyeSwgcGl0RW50cnkpOworCisgICAgc2l6ZV90IG5TZW50ID0gc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKTsKKyAgICBpZiAoblNlbnQgPiBuU2VudExhc3QpIHsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKG5TZW50IC0gblNlbnRMYXN0LCAxKTsKKyAgICAgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IHRpbWVTZW50ID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgIEJPT1NUX0NIRUNLX0dFKHRpbWVTZW50IC0gdGltZVNlbnRMYXN0LCBSRVRSQU5TTUlTU0lPTl83MFApOworICAgICAgblNlbnRMYXN0ID0gblNlbnQ7CisgICAgICB0aW1lU2VudExhc3QgPSB0aW1lU2VudDsKKyAgICB9CisKKyAgICByZXR4RnJvbTRFdnQgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKFJFVFJBTlNNSVNTSU9OXzEwUCwgcGVyaW9kaWNhbFJldHhGcm9tNCk7CisgIH07CisgIHBlcmlvZGljYWxSZXR4RnJvbTQoKTsKKyAgdGhpcy0+YWR2YW5jZUNsb2NrcyhUSUNLLCBmdzo6QmVzdFJvdXRlU3RyYXRlZ3kyOjpNSU5fUkVUUkFOU01JU1NJT05fSU5URVJWQUwgKiAxNik7CisgIHNjaGVkdWxlcjo6Y2FuY2VsKHJldHhGcm9tNEV2dCk7CisKKyAgLy8gbmV4dGhvcHMgZm9yIGFjY2VwdGVkIHJldHJhbnNtaXNzaW9uczogZm9sbG93IEZJQiBjb3N0LAorICAvLyBsYXRlciBmb3J3YXJkIHRvIGFuIGVsaWdpYmxlIHVwc3RyZWFtIHdpdGggZWFybGllc3QgT3V0UmVjb3JkCisgIEJPT1NUX1JFUVVJUkVfR0Uoc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgNik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeVsxXS5nZXQ8MT4oKSwgZmFjZTEpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneS5tX3NlbmRJbnRlcmVzdEhpc3RvcnlbMl0uZ2V0PDE+KCksIGZhY2UzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5WzNdLmdldDwxPigpLCBmYWNlMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeVs0XS5nZXQ8MT4oKSwgZmFjZTEpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneS5tX3NlbmRJbnRlcmVzdEhpc3RvcnlbNV0uZ2V0PDE+KCksIGZhY2UzKTsKKworICBmaWJFbnRyeS0+cmVtb3ZlTmV4dEhvcChmYWNlMSk7CisKKyAgc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LmNsZWFyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgdGhpcy0+YWR2YW5jZUNsb2NrcyhUSUNLLCBSRVRSQU5TTUlTU0lPTl8yKTsKKyAgICBwaXRFbnRyeS0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlNSwgKmludGVyZXN0KTsKKyAgICBzdHJhdGVneS5hZnRlclJlY2VpdmVJbnRlcmVzdCgqZmFjZTUsICppbnRlcmVzdCwgZmliRW50cnksIHBpdEVudHJ5KTsKKyAgfQorICBCT09TVF9SRVFVSVJFX0VRVUFMKHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeS5zaXplKCksIDMpOworICBCT09TVF9DSEVDS19ORShzdHJhdGVneS5tX3NlbmRJbnRlcmVzdEhpc3RvcnlbMF0uZ2V0PDE+KCksIGZhY2UxKTsKKyAgQk9PU1RfQ0hFQ0tfTkUoc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5WzFdLmdldDwxPigpLCBmYWNlMSk7CisgIEJPT1NUX0NIRUNLX05FKHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeVsyXS5nZXQ8MT4oKSwgZmFjZTEpOworICAvLyBmYWNlMSBjYW5ub3QgYmUgdXNlZCBiZWNhdXNlIGl0J3MgZ29uZSBmcm9tIEZJQiBlbnRyeQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mdy9icm9hZGNhc3Qtc3RyYXRlZ3kuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9mdy9icm9hZGNhc3Qtc3RyYXRlZ3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTliNDQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L2Jyb2FkY2FzdC1zdHJhdGVneS5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJmdy9icm9hZGNhc3Qtc3RyYXRlZ3kuaHBwIgorI2luY2x1ZGUgInN0cmF0ZWd5LXRlc3Rlci5ocHAiCisjaW5jbHVkZSAidGVzdHMvZGFlbW9uL2ZhY2UvZHVtbXktZmFjZS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEZ3QnJvYWRjYXN0U3RyYXRlZ3ksIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShGb3J3YXJkMikKK3sKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgdHlwZWRlZiBTdHJhdGVneVRlc3Rlcjxmdzo6QnJvYWRjYXN0U3RyYXRlZ3k+IEJyb2FkY2FzdFN0cmF0ZWd5VGVzdGVyOworICBCcm9hZGNhc3RTdHJhdGVneVRlc3RlciBzdHJhdGVneShmb3J3YXJkZXIpOworCisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTMgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UxKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTIpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMyk7CisKKyAgRmliJiBmaWIgPSBmb3J3YXJkZXIuZ2V0RmliKCk7CisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnkgPSBmaWIuaW5zZXJ0KE5hbWUoKSkuZmlyc3Q7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UxLCAwKTsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTIsIDApOworICBmaWJFbnRyeS0+YWRkTmV4dEhvcChmYWNlMywgMCk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QgPSBtYWtlSW50ZXJlc3QoIm5kbjovSDBENmk1ZmMiKTsKKyAgUGl0JiBwaXQgPSBmb3J3YXJkZXIuZ2V0UGl0KCk7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdCkuZmlyc3Q7CisgIHBpdEVudHJ5LT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UzLCAqaW50ZXJlc3QpOworCisgIHN0cmF0ZWd5LmFmdGVyUmVjZWl2ZUludGVyZXN0KCpmYWNlMywgKmludGVyZXN0LCBmaWJFbnRyeSwgcGl0RW50cnkpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneS5tX3JlamVjdFBlbmRpbmdJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgMik7CisgIGJvb2wgaGFzRmFjZTEgPSBmYWxzZTsKKyAgYm9vbCBoYXNGYWNlMiA9IGZhbHNlOworICBmb3IgKHN0ZDo6dmVjdG9yPEJyb2FkY2FzdFN0cmF0ZWd5VGVzdGVyOjpTZW5kSW50ZXJlc3RBcmdzPjo6aXRlcmF0b3IgaXQgPQorICAgICAgIHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeS5iZWdpbigpOworICAgICAgIGl0ICE9IHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeS5lbmQoKTsgKytpdCkgeworICAgIGlmIChpdC0+Z2V0PDE+KCkgPT0gZmFjZTEpIHsKKyAgICAgIGhhc0ZhY2UxID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGl0LT5nZXQ8MT4oKSA9PSBmYWNlMikgeworICAgICAgaGFzRmFjZTIgPSB0cnVlOworICAgIH0KKyAgfQorICBCT09TVF9DSEVDSyhoYXNGYWNlMSAmJiBoYXNGYWNlMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFJlamVjdFNjb3BlKQoreworICBGb3J3YXJkZXIgZm9yd2FyZGVyOworICB0eXBlZGVmIFN0cmF0ZWd5VGVzdGVyPGZ3OjpCcm9hZGNhc3RTdHJhdGVneT4gQnJvYWRjYXN0U3RyYXRlZ3lUZXN0ZXI7CisgIEJyb2FkY2FzdFN0cmF0ZWd5VGVzdGVyIHN0cmF0ZWd5KGZvcndhcmRlcik7CisKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTIgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UxKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTIpOworCisgIEZpYiYgZmliID0gZm9yd2FyZGVyLmdldEZpYigpOworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5ID0gZmliLmluc2VydCgibmRuOi9sb2NhbGhvcC91UzA5YnViNnRtIikuZmlyc3Q7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UyLCAwKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2VJbnRlcmVzdCgibmRuOi9sb2NhbGhvcC91UzA5YnViNnRtL2VHM01Nb1A2eiIpOworICBQaXQmIHBpdCA9IGZvcndhcmRlci5nZXRQaXQoKTsKKyAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSA9IHBpdC5pbnNlcnQoKmludGVyZXN0KS5maXJzdDsKKyAgcGl0RW50cnktPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTEsICppbnRlcmVzdCk7CisKKyAgc3RyYXRlZ3kuYWZ0ZXJSZWNlaXZlSW50ZXJlc3QoKmZhY2UxLCAqaW50ZXJlc3QsIGZpYkVudHJ5LCBwaXRFbnRyeSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5Lm1fcmVqZWN0UGVuZGluZ0ludGVyZXN0SGlzdG9yeS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneS5tX3NlbmRJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmVqZWN0TG9vcGJhY2spCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIHR5cGVkZWYgU3RyYXRlZ3lUZXN0ZXI8Znc6OkJyb2FkY2FzdFN0cmF0ZWd5PiBCcm9hZGNhc3RTdHJhdGVneVRlc3RlcjsKKyAgQnJvYWRjYXN0U3RyYXRlZ3lUZXN0ZXIgc3RyYXRlZ3koZm9yd2FyZGVyKTsKKworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTEgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UxKTsKKworICBGaWImIGZpYiA9IGZvcndhcmRlci5nZXRGaWIoKTsKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSA9IGZpYi5pbnNlcnQoTmFtZSgpKS5maXJzdDsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTEsIDApOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZUludGVyZXN0KCJuZG46L0gwRDZpNWZjIik7CisgIFBpdCYgcGl0ID0gZm9yd2FyZGVyLmdldFBpdCgpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5ID0gcGl0Lmluc2VydCgqaW50ZXJlc3QpLmZpcnN0OworICBwaXRFbnRyeS0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMSwgKmludGVyZXN0KTsKKworICBzdHJhdGVneS5hZnRlclJlY2VpdmVJbnRlcmVzdCgqZmFjZTEsICppbnRlcmVzdCwgZmliRW50cnksIHBpdEVudHJ5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3kubV9yZWplY3RQZW5kaW5nSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeS5zaXplKCksIDApOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mdy9jbGllbnQtY29udHJvbC1zdHJhdGVneS5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L2NsaWVudC1jb250cm9sLXN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzZmYjUyCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mdy9jbGllbnQtY29udHJvbC1zdHJhdGVneS5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImZ3L2NsaWVudC1jb250cm9sLXN0cmF0ZWd5LmhwcCIKKyNpbmNsdWRlICJzdHJhdGVneS10ZXN0ZXIuaHBwIgorI2luY2x1ZGUgInRlc3RzL2RhZW1vbi9mYWNlL2R1bW15LWZhY2UuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGd0NsaWVudENvbnRyb2xTdHJhdGVneSwgQmFzZUZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEZvcndhcmQzKQoreworICBGb3J3YXJkZXIgZm9yd2FyZGVyOworICB0eXBlZGVmIFN0cmF0ZWd5VGVzdGVyPGZ3OjpDbGllbnRDb250cm9sU3RyYXRlZ3k+IENsaWVudENvbnRyb2xTdHJhdGVneVRlc3RlcjsKKyAgQ2xpZW50Q29udHJvbFN0cmF0ZWd5VGVzdGVyIHN0cmF0ZWd5KGZvcndhcmRlcik7CisKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTIgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMyA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUxvY2FsRmFjZT4gZmFjZTQgPSBtYWtlX3NoYXJlZDxEdW1teUxvY2FsRmFjZT4oKTsKKyAgZmFjZTQtPnNldExvY2FsQ29udHJvbEhlYWRlckZlYXR1cmUoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTMpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlNCk7CisKKyAgRmliJiBmaWIgPSBmb3J3YXJkZXIuZ2V0RmliKCk7CisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnkgPSBmaWIuaW5zZXJ0KE5hbWUoKSkuZmlyc3Q7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UyLCAwKTsKKworICBQaXQmIHBpdCA9IGZvcndhcmRlci5nZXRQaXQoKTsKKworICAvLyBJbnRlcmVzdCB3aXRoIHZhbGlkIE5leHRIb3BGYWNlSWQKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QxID0gbWFrZUludGVyZXN0KCJuZG46LzB6OHI2eUREZSIpOworICBpbnRlcmVzdDEtPnNldE5leHRIb3BGYWNlSWQoZmFjZTEtPmdldElkKCkpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5MSA9IHBpdC5pbnNlcnQoKmludGVyZXN0MSkuZmlyc3Q7CisgIHBpdEVudHJ5MS0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlNCwgKmludGVyZXN0MSk7CisKKyAgc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LmNsZWFyKCk7CisgIHN0cmF0ZWd5LmFmdGVyUmVjZWl2ZUludGVyZXN0KCpmYWNlNCwgKmludGVyZXN0MSwgZmliRW50cnksIHBpdEVudHJ5MSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeVswXS5nZXQ8MT4oKSwgZmFjZTEpOworCisgIC8vIEludGVyZXN0IHdpdGhvdXQgTmV4dEhvcEZhY2VJZAorICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDIgPSBtYWtlSW50ZXJlc3QoIm5kbjoveTZKUUFER1Z6Iik7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkyID0gcGl0Lmluc2VydCgqaW50ZXJlc3QyKS5maXJzdDsKKyAgcGl0RW50cnkyLT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2U0LCAqaW50ZXJlc3QyKTsKKworICBzdHJhdGVneS5tX3NlbmRJbnRlcmVzdEhpc3RvcnkuY2xlYXIoKTsKKyAgc3RyYXRlZ3kuYWZ0ZXJSZWNlaXZlSW50ZXJlc3QoKmZhY2U0LCAqaW50ZXJlc3QyLCBmaWJFbnRyeSwgcGl0RW50cnkyKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzdHJhdGVneS5tX3NlbmRJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5WzBdLmdldDwxPigpLCBmYWNlMik7CisKKyAgLy8gSW50ZXJlc3Qgd2l0aCBpbnZhbGlkIE5leHRIb3BGYWNlSWQKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QzID0gbWFrZUludGVyZXN0KCJuZG46LzB6OHI2eUREZSIpOworICBpbnRlcmVzdDMtPnNldE5leHRIb3BGYWNlSWQoZmFjZTMtPmdldElkKCkpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5MyA9IHBpdC5pbnNlcnQoKmludGVyZXN0MykuZmlyc3Q7CisgIHBpdEVudHJ5My0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlNCwgKmludGVyZXN0Myk7CisKKyAgZmFjZTMtPmNsb3NlKCk7IC8vIGZhY2UzIGlzIGNsb3NlZCBhbmQgaXRzIEZhY2VJZCBiZWNvbWVzIGludmFsaWQKKyAgc3RyYXRlZ3kubV9zZW5kSW50ZXJlc3RIaXN0b3J5LmNsZWFyKCk7CisgIHN0cmF0ZWd5Lm1fcmVqZWN0UGVuZGluZ0ludGVyZXN0SGlzdG9yeS5jbGVhcigpOworICBzdHJhdGVneS5hZnRlclJlY2VpdmVJbnRlcmVzdCgqZmFjZTQsICppbnRlcmVzdDMsIGZpYkVudHJ5LCBwaXRFbnRyeTMpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHN0cmF0ZWd5Lm1fc2VuZEludGVyZXN0SGlzdG9yeS5zaXplKCksIDApOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHN0cmF0ZWd5Lm1fcmVqZWN0UGVuZGluZ0ludGVyZXN0SGlzdG9yeS5zaXplKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mdy9kdW1teS1zdHJhdGVneS5ocHAgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L2R1bW15LXN0cmF0ZWd5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRlOTNlCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mdy9kdW1teS1zdHJhdGVneS5ocHAKQEAgLTAsMCArMSw4NyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfVEVTVFNfREFFTU9OX0ZXX0RVTU1ZX1NUUkFURUdZX0hQUAorI2RlZmluZSBORkRfVEVTVFNfREFFTU9OX0ZXX0RVTU1ZX1NUUkFURUdZX0hQUAorCisjaW5jbHVkZSAiZncvc3RyYXRlZ3kuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKKy8qKiBcYnJpZWYgc3RyYXRlZ3kgZm9yIHVuaXQgdGVzdGluZworICoKKyAqICBUcmlnZ2VycyBvbiBEdW1teVN0cmF0ZWd5IGFyZSByZWNvcmRlZCBidXQgZG9lcyBub3RoaW5nCisgKi8KK2NsYXNzIER1bW15U3RyYXRlZ3kgOiBwdWJsaWMgZnc6OlN0cmF0ZWd5Cit7CitwdWJsaWM6CisgIER1bW15U3RyYXRlZ3koRm9yd2FyZGVyJiBmb3J3YXJkZXIsIGNvbnN0IE5hbWUmIG5hbWUpCisgICAgOiBTdHJhdGVneShmb3J3YXJkZXIsIG5hbWUpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgdm9pZAorICBhZnRlclJlY2VpdmVJbnRlcmVzdChjb25zdCBGYWNlJiBpbkZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkgREVDTF9PVkVSUklERQorICB7CisgICAgKyttX2FmdGVyUmVjZWl2ZUludGVyZXN0X2NvdW50OworCisgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KG1faW50ZXJlc3RPdXRGYWNlKSkgeworICAgICAgdGhpcy0+c2VuZEludGVyZXN0KHBpdEVudHJ5LCBtX2ludGVyZXN0T3V0RmFjZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhpcy0+cmVqZWN0UGVuZGluZ0ludGVyZXN0KHBpdEVudHJ5KTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQKKyAgYmVmb3JlU2F0aXNmeUludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGYWNlJiBpbkZhY2UsIGNvbnN0IERhdGEmIGRhdGEpIERFQ0xfT1ZFUlJJREUKKyAgeworICAgICsrbV9iZWZvcmVTYXRpc2Z5SW50ZXJlc3RfY291bnQ7CisgIH0KKworICB2aXJ0dWFsIHZvaWQKKyAgYmVmb3JlRXhwaXJlUGVuZGluZ0ludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpIERFQ0xfT1ZFUlJJREUKKyAgeworICAgICsrbV9iZWZvcmVFeHBpcmVQZW5kaW5nSW50ZXJlc3RfY291bnQ7CisgIH0KKworcHVibGljOgorICBpbnQgbV9hZnRlclJlY2VpdmVJbnRlcmVzdF9jb3VudDsKKyAgaW50IG1fYmVmb3JlU2F0aXNmeUludGVyZXN0X2NvdW50OworICBpbnQgbV9iZWZvcmVFeHBpcmVQZW5kaW5nSW50ZXJlc3RfY291bnQ7CisKKyAgLy8vIG91dEZhY2UgdG8gdXNlIGluIGFmdGVyUmVjZWl2ZUludGVyZXN0LCBudWxscHRyIHRvIHJlamVjdAorICBzaGFyZWRfcHRyPEZhY2U+IG1faW50ZXJlc3RPdXRGYWNlOworfTsKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1RFU1RTX0RBRU1PTl9GV19EVU1NWV9TVFJBVEVHWV9IUFAKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vZncvZmFjZS10YWJsZS5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L2ZhY2UtdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYmZhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L2ZhY2UtdGFibGUuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZncvZmFjZS10YWJsZS5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1mYWNlLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoRndGYWNlVGFibGUsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShBZGRSZW1vdmUpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisKKyAgRmFjZVRhYmxlJiBmYWNlVGFibGUgPSBmb3J3YXJkZXIuZ2V0RmFjZVRhYmxlKCk7CisgIHN0ZDo6dmVjdG9yPEZhY2VJZD4gb25BZGRIaXN0b3J5OworICBzdGQ6OnZlY3RvcjxGYWNlSWQ+IG9uUmVtb3ZlSGlzdG9yeTsKKyAgZmFjZVRhYmxlLm9uQWRkLmNvbm5lY3QoWyZdIChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpIHsKKyAgICBvbkFkZEhpc3RvcnkucHVzaF9iYWNrKGZhY2UtPmdldElkKCkpOworICB9KTsKKyAgZmFjZVRhYmxlLm9uUmVtb3ZlLmNvbm5lY3QoWyZdIChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpIHsKKyAgICBvblJlbW92ZUhpc3RvcnkucHVzaF9iYWNrKGZhY2UtPmdldElkKCkpOworICB9KTsKKworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLT5nZXRJZCgpLCBJTlZBTElEX0ZBQ0VJRCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLT5nZXRJZCgpLCBJTlZBTElEX0ZBQ0VJRCk7CisKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTEpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMik7CisKKyAgQk9PU1RfQ0hFQ0tfTkUoZmFjZTEtPmdldElkKCksIElOVkFMSURfRkFDRUlEKTsKKyAgQk9PU1RfQ0hFQ0tfTkUoZmFjZTItPmdldElkKCksIElOVkFMSURfRkFDRUlEKTsKKyAgQk9PU1RfQ0hFQ0tfTkUoZmFjZTEtPmdldElkKCksIGZhY2UyLT5nZXRJZCgpKTsKKyAgQk9PU1RfQ0hFQ0tfR1QoZmFjZTEtPmdldElkKCksIEZBQ0VJRF9SRVNFUlZFRF9NQVgpOworICBCT09TVF9DSEVDS19HVChmYWNlMi0+Z2V0SWQoKSwgRkFDRUlEX1JFU0VSVkVEX01BWCk7CisKKyAgRmFjZUlkIG9sZElkMSA9IGZhY2UxLT5nZXRJZCgpOworICBmYWNlVGFibGUuYWRkKGZhY2UxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldElkKCksIG9sZElkMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VUYWJsZS5zaXplKCksIDIpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwob25BZGRIaXN0b3J5LnNpemUoKSwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG9uQWRkSGlzdG9yeVswXSwgZmFjZTEtPmdldElkKCkpOworICBCT09TVF9DSEVDS19FUVVBTChvbkFkZEhpc3RvcnlbMV0sIGZhY2UyLT5nZXRJZCgpKTsKKworICBmYWNlMS0+Y2xvc2UoKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+Z2V0SWQoKSwgSU5WQUxJRF9GQUNFSUQpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwob25SZW1vdmVIaXN0b3J5LnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG9uUmVtb3ZlSGlzdG9yeVswXSwgb25BZGRIaXN0b3J5WzBdKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQWRkUmVzZXJ2ZWQpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIEZhY2VUYWJsZSYgZmFjZVRhYmxlID0gZm9yd2FyZGVyLmdldEZhY2VUYWJsZSgpOworCisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTEgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLT5nZXRJZCgpLCBJTlZBTElEX0ZBQ0VJRCk7CisKKyAgZmFjZVRhYmxlLmFkZFJlc2VydmVkKGZhY2UxLCA1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPmdldElkKCksIDUpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbnVtZXJhdGUpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIEZhY2VUYWJsZSYgZmFjZVRhYmxlID0gZm9yd2FyZGVyLmdldEZhY2VUYWJsZSgpOworCisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTEgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTIgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIGJvb2wgaGFzRmFjZTEgPSBmYWxzZSwgaGFzRmFjZTIgPSBmYWxzZTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlVGFibGUuc2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RkOjpkaXN0YW5jZShmYWNlVGFibGUuYmVnaW4oKSwgZmFjZVRhYmxlLmVuZCgpKSwgZmFjZVRhYmxlLnNpemUoKSk7CisKKyAgZmFjZVRhYmxlLmFkZChmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VUYWJsZS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChzdGQ6OmRpc3RhbmNlKGZhY2VUYWJsZS5iZWdpbigpLCBmYWNlVGFibGUuZW5kKCkpLCBmYWNlVGFibGUuc2l6ZSgpKTsKKyAgaGFzRmFjZTEgPSBoYXNGYWNlMiA9IGZhbHNlOworICBmb3IgKEZhY2VUYWJsZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmYWNlVGFibGUuYmVnaW4oKTsgaXQgIT0gZmFjZVRhYmxlLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKCppdCA9PSBmYWNlMSkgeworICAgICAgaGFzRmFjZTEgPSB0cnVlOworICAgIH0KKyAgfQorICBCT09TVF9DSEVDSyhoYXNGYWNlMSk7CisKKyAgZmFjZVRhYmxlLmFkZChmYWNlMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VUYWJsZS5zaXplKCksIDIpOworICBCT09TVF9DSEVDS19FUVVBTChzdGQ6OmRpc3RhbmNlKGZhY2VUYWJsZS5iZWdpbigpLCBmYWNlVGFibGUuZW5kKCkpLCBmYWNlVGFibGUuc2l6ZSgpKTsKKyAgaGFzRmFjZTEgPSBoYXNGYWNlMiA9IGZhbHNlOworICBmb3IgKEZhY2VUYWJsZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmYWNlVGFibGUuYmVnaW4oKTsgaXQgIT0gZmFjZVRhYmxlLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKCppdCA9PSBmYWNlMSkgeworICAgICAgaGFzRmFjZTEgPSB0cnVlOworICAgIH0KKyAgICBpZiAoKml0ID09IGZhY2UyKSB7CisgICAgICBoYXNGYWNlMiA9IHRydWU7CisgICAgfQorICB9CisgIEJPT1NUX0NIRUNLKGhhc0ZhY2UxKTsKKyAgQk9PU1RfQ0hFQ0soaGFzRmFjZTIpOworCisgIGZhY2UxLT5jbG9zZSgpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlVGFibGUuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RkOjpkaXN0YW5jZShmYWNlVGFibGUuYmVnaW4oKSwgZmFjZVRhYmxlLmVuZCgpKSwgZmFjZVRhYmxlLnNpemUoKSk7CisgIGhhc0ZhY2UxID0gaGFzRmFjZTIgPSBmYWxzZTsKKyAgZm9yIChGYWNlVGFibGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZmFjZVRhYmxlLmJlZ2luKCk7IGl0ICE9IGZhY2VUYWJsZS5lbmQoKTsgKytpdCkgeworICAgIGlmICgqaXQgPT0gZmFjZTEpIHsKKyAgICAgIGhhc0ZhY2UxID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCppdCA9PSBmYWNlMikgeworICAgICAgaGFzRmFjZTIgPSB0cnVlOworICAgIH0KKyAgfQorICBCT09TVF9DSEVDSyghaGFzRmFjZTEpOworICBCT09TVF9DSEVDSyhoYXNGYWNlMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2Z3L2ZvcndhcmRlci5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L2ZvcndhcmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3NGYzNwotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZncvZm9yd2FyZGVyLmNwcApAQCAtMCwwICsxLDQ2NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZ3L2ZvcndhcmRlci5ocHAiCisjaW5jbHVkZSAidGVzdHMvZGFlbW9uL2ZhY2UvZHVtbXktZmFjZS5ocHAiCisjaW5jbHVkZSAiZHVtbXktc3RyYXRlZ3kuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2xpbWl0ZWQtaW8uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGd0ZvcndhcmRlciwgQmFzZUZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNpbXBsZUV4Y2hhbmdlKQoreworICBMaW1pdGVkSW8gbGltaXRlZElvOworICBhdXRvIGFmdGVyT3AgPSBiaW5kKCZMaW1pdGVkSW86OmFmdGVyT3AsICZsaW1pdGVkSW8pOzsKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKworICBOYW1lIG5hbWVBICAoIm5kbjovQSIpOworICBOYW1lIG5hbWVBQiAoIm5kbjovQS9CIik7CisgIE5hbWUgbmFtZUFCQygibmRuOi9BL0IvQyIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEFCID0gbWFrZUludGVyZXN0KG5hbWVBQik7CisgIGludGVyZXN0QUItPnNldEludGVyZXN0TGlmZXRpbWUodGltZTo6c2Vjb25kcyg0KSk7CisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YUFCQyA9IG1ha2VEYXRhKG5hbWVBQkMpOworCisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBmYWNlMS0+YWZ0ZXJTZW5kICs9IGFmdGVyT3A7CisgIGZhY2UyLT5hZnRlclNlbmQgKz0gYWZ0ZXJPcDsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTEpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMik7CisKKyAgRmliJiBmaWIgPSBmb3J3YXJkZXIuZ2V0RmliKCk7CisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnkgPSBmaWIuaW5zZXJ0KE5hbWUoIm5kbjovQSIpKS5maXJzdDsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTIsIDApOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvcndhcmRlci5nZXRDb3VudGVycygpLmdldE5JbkludGVyZXN0cyAoKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvcndhcmRlci5nZXRDb3VudGVycygpLmdldE5PdXRJbnRlcmVzdHMoKSwgMCk7CisgIGdfaW8ucG9zdChbJl0geyBmYWNlMS0+cmVjZWl2ZUludGVyZXN0KCppbnRlcmVzdEFCKTsgfSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGxpbWl0ZWRJby5ydW4oMSwgdGltZTo6c2Vjb25kcygxKSksIExpbWl0ZWRJbzo6RVhDRUVEX09QUyk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZTItPm1fc2VudEludGVyZXN0cy5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMi0+bV9zZW50SW50ZXJlc3RzWzBdLmdldE5hbWUoKSwgbmFtZUFCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTItPm1fc2VudEludGVyZXN0c1swXS5nZXRJbmNvbWluZ0ZhY2VJZCgpLCBmYWNlMS0+Z2V0SWQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvcndhcmRlci5nZXRDb3VudGVycygpLmdldE5JbkludGVyZXN0cyAoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvcndhcmRlci5nZXRDb3VudGVycygpLmdldE5PdXRJbnRlcmVzdHMoKSwgMSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm9yd2FyZGVyLmdldENvdW50ZXJzKCkuZ2V0TkluRGF0YXMgKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTChmb3J3YXJkZXIuZ2V0Q291bnRlcnMoKS5nZXROT3V0RGF0YXMoKSwgMCk7CisgIGdfaW8ucG9zdChbJl0geyBmYWNlMi0+cmVjZWl2ZURhdGEoKmRhdGFBQkMpOyB9KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobGltaXRlZElvLnJ1bigxLCB0aW1lOjpzZWNvbmRzKDEpKSwgTGltaXRlZElvOjpFWENFRURfT1BTKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlMS0+bV9zZW50RGF0YXMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPm1fc2VudERhdGFzWzBdLmdldE5hbWUoKSwgbmFtZUFCQyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLT5tX3NlbnREYXRhc1swXS5nZXRJbmNvbWluZ0ZhY2VJZCgpLCBmYWNlMi0+Z2V0SWQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvcndhcmRlci5nZXRDb3VudGVycygpLmdldE5JbkRhdGFzICgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm9yd2FyZGVyLmdldENvdW50ZXJzKCkuZ2V0Tk91dERhdGFzKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDc01hdGNoZWQpCit7CisgIExpbWl0ZWRJbyBsaW1pdGVkSW87CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTIgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMyA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTEpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMik7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEEgPSBtYWtlSW50ZXJlc3QoIm5kbjovQSIpOworICBpbnRlcmVzdEEtPnNldEludGVyZXN0TGlmZXRpbWUodGltZTo6c2Vjb25kcyg0KSk7CisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YUEgPSBtYWtlRGF0YSgibmRuOi9BIik7CisgIGRhdGFBLT5zZXRJbmNvbWluZ0ZhY2VJZChmYWNlMy0+Z2V0SWQoKSk7CisKKyAgRmliJiBmaWIgPSBmb3J3YXJkZXIuZ2V0RmliKCk7CisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnkgPSBmaWIuaW5zZXJ0KE5hbWUoIm5kbjovQSIpKS5maXJzdDsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTIsIDApOworCisgIFBpdCYgcGl0ID0gZm9yd2FyZGVyLmdldFBpdCgpOworICBCT09TVF9DSEVDS19FUVVBTChwaXQuc2l6ZSgpLCAwKTsKKworICBDcyYgY3MgPSBmb3J3YXJkZXIuZ2V0Q3MoKTsKKyAgQk9PU1RfUkVRVUlSRShjcy5pbnNlcnQoKmRhdGFBKSk7CisKKyAgZmFjZTEtPnJlY2VpdmVJbnRlcmVzdCgqaW50ZXJlc3RBKTsKKyAgbGltaXRlZElvLnJ1bihMaW1pdGVkSW86OlVOTElNSVRFRF9PUFMsIHRpbWU6Om1pbGxpc2Vjb25kcyg1KSk7CisgIC8vIEludGVyZXN0IG1hdGNoaW5nIENvbnRlbnRTdG9yZSBzaG91bGQgbm90IGJlIGZvcndhcmRlZAorICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UyLT5tX3NlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UxLT5tX3NlbnREYXRhcy5zaXplKCksIDEpOworICAvLyBJbmNvbWluZ0ZhY2VJZCBmaWVsZCBzaG91bGQgYmUgcmVzZXQgdG8gcmVwcmVzZW50IENTCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLT5tX3NlbnREYXRhc1swXS5nZXRJbmNvbWluZ0ZhY2VJZCgpLCBGQUNFSURfQ09OVEVOVF9TVE9SRSk7CisKKyAgbGltaXRlZElvLnJ1bihMaW1pdGVkSW86OlVOTElNSVRFRF9PUFMsIHRpbWU6Om1pbGxpc2Vjb25kcyg1MDApKTsKKyAgLy8gUElUIGVudHJ5IHNob3VsZCBub3QgYmUgbGVmdCBiZWhpbmQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGl0LnNpemUoKSwgMCk7Cit9CisKK2NsYXNzIFNjb3BlTG9jYWxob3N0SW5jb21pbmdUZXN0Rm9yd2FyZGVyIDogcHVibGljIEZvcndhcmRlcgoreworcHVibGljOgorICBTY29wZUxvY2FsaG9zdEluY29taW5nVGVzdEZvcndhcmRlcigpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgdm9pZAorICBvbkRhdGFVbnNvbGljaXRlZChGYWNlJiBpbkZhY2UsIGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICArK21fb25EYXRhVW5zb2xpY2l0ZWRfY291bnQ7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQKKyAgZGlzcGF0Y2hUb1N0cmF0ZWd5KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksIGZ1bmN0aW9uPHZvaWQoZnc6OlN0cmF0ZWd5Kik+IGYpCisgIHsKKyAgICArK21fZGlzcGF0Y2hUb1N0cmF0ZWd5X2NvdW50OworICB9CisKK3B1YmxpYzoKKyAgaW50IG1fZGlzcGF0Y2hUb1N0cmF0ZWd5X2NvdW50OworICBpbnQgbV9vbkRhdGFVbnNvbGljaXRlZF9jb3VudDsKK307CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNjb3BlTG9jYWxob3N0SW5jb21pbmcpCit7CisgIFNjb3BlTG9jYWxob3N0SW5jb21pbmdUZXN0Rm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15TG9jYWxGYWNlPigpOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKworICAvLyBsb2NhbCBmYWNlLCAvbG9jYWxob3N0OiBPSworICBmb3J3YXJkZXIubV9kaXNwYXRjaFRvU3RyYXRlZ3lfY291bnQgPSAwOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpMSA9IG1ha2VJbnRlcmVzdCgiL2xvY2FsaG9zdC9BMSIpOworICBmb3J3YXJkZXIub25JbmNvbWluZ0ludGVyZXN0KCpmYWNlMSwgKmkxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm9yd2FyZGVyLm1fZGlzcGF0Y2hUb1N0cmF0ZWd5X2NvdW50LCAxKTsKKworICAvLyBub24tbG9jYWwgZmFjZSwgL2xvY2FsaG9zdDogdmlvbGF0ZQorICBmb3J3YXJkZXIubV9kaXNwYXRjaFRvU3RyYXRlZ3lfY291bnQgPSAwOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpMiA9IG1ha2VJbnRlcmVzdCgiL2xvY2FsaG9zdC9BMiIpOworICBmb3J3YXJkZXIub25JbmNvbWluZ0ludGVyZXN0KCpmYWNlMiwgKmkyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm9yd2FyZGVyLm1fZGlzcGF0Y2hUb1N0cmF0ZWd5X2NvdW50LCAwKTsKKworICAvLyBsb2NhbCBmYWNlLCBub24tL2xvY2FsaG9zdDogT0sKKyAgZm9yd2FyZGVyLm1fZGlzcGF0Y2hUb1N0cmF0ZWd5X2NvdW50ID0gMDsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaTMgPSBtYWtlSW50ZXJlc3QoIi9BMyIpOworICBmb3J3YXJkZXIub25JbmNvbWluZ0ludGVyZXN0KCpmYWNlMSwgKmkzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm9yd2FyZGVyLm1fZGlzcGF0Y2hUb1N0cmF0ZWd5X2NvdW50LCAxKTsKKworICAvLyBub24tbG9jYWwgZmFjZSwgbm9uLS9sb2NhbGhvc3Q6IE9LCisgIGZvcndhcmRlci5tX2Rpc3BhdGNoVG9TdHJhdGVneV9jb3VudCA9IDA7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGk0ID0gbWFrZUludGVyZXN0KCIvQTQiKTsKKyAgZm9yd2FyZGVyLm9uSW5jb21pbmdJbnRlcmVzdCgqZmFjZTIsICppNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvcndhcmRlci5tX2Rpc3BhdGNoVG9TdHJhdGVneV9jb3VudCwgMSk7CisKKyAgLy8gbG9jYWwgZmFjZSwgL2xvY2FsaG9zdDogT0sKKyAgZm9yd2FyZGVyLm1fb25EYXRhVW5zb2xpY2l0ZWRfY291bnQgPSAwOworICBzaGFyZWRfcHRyPERhdGE+IGQxID0gbWFrZURhdGEoIi9sb2NhbGhvc3QvQjEiKTsKKyAgZm9yd2FyZGVyLm9uSW5jb21pbmdEYXRhKCpmYWNlMSwgKmQxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm9yd2FyZGVyLm1fb25EYXRhVW5zb2xpY2l0ZWRfY291bnQsIDEpOworCisgIC8vIG5vbi1sb2NhbCBmYWNlLCAvbG9jYWxob3N0OiBPSworICBmb3J3YXJkZXIubV9vbkRhdGFVbnNvbGljaXRlZF9jb3VudCA9IDA7CisgIHNoYXJlZF9wdHI8RGF0YT4gZDIgPSBtYWtlRGF0YSgiL2xvY2FsaG9zdC9CMiIpOworICBmb3J3YXJkZXIub25JbmNvbWluZ0RhdGEoKmZhY2UyLCAqZDIpOworICBCT09TVF9DSEVDS19FUVVBTChmb3J3YXJkZXIubV9vbkRhdGFVbnNvbGljaXRlZF9jb3VudCwgMCk7CisKKyAgLy8gbG9jYWwgZmFjZSwgbm9uLS9sb2NhbGhvc3Q6IE9LCisgIGZvcndhcmRlci5tX29uRGF0YVVuc29saWNpdGVkX2NvdW50ID0gMDsKKyAgc2hhcmVkX3B0cjxEYXRhPiBkMyA9IG1ha2VEYXRhKCIvQjMiKTsKKyAgZm9yd2FyZGVyLm9uSW5jb21pbmdEYXRhKCpmYWNlMSwgKmQzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm9yd2FyZGVyLm1fb25EYXRhVW5zb2xpY2l0ZWRfY291bnQsIDEpOworCisgIC8vIG5vbi1sb2NhbCBmYWNlLCBub24tL2xvY2FsaG9zdDogT0sKKyAgZm9yd2FyZGVyLm1fb25EYXRhVW5zb2xpY2l0ZWRfY291bnQgPSAwOworICBzaGFyZWRfcHRyPERhdGE+IGQ0ID0gbWFrZURhdGEoIi9CNCIpOworICBmb3J3YXJkZXIub25JbmNvbWluZ0RhdGEoKmZhY2UyLCAqZDQpOworICBCT09TVF9DSEVDS19FUVVBTChmb3J3YXJkZXIubV9vbkRhdGFVbnNvbGljaXRlZF9jb3VudCwgMSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNjb3BlTG9jYWxob3N0T3V0Z29pbmcpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIHNoYXJlZF9wdHI8RHVtbXlMb2NhbEZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlMb2NhbEZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiAgICAgIGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPEZhY2U+ICAgICAgICAgICBmYWNlMyA9IG1ha2Vfc2hhcmVkPER1bW15TG9jYWxGYWNlPigpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTMpOworICBQaXQmIHBpdCA9IGZvcndhcmRlci5nZXRQaXQoKTsKKworICAvLyBsb2NhbCBmYWNlLCAvbG9jYWxob3N0OiBPSworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEExID0gbWFrZUludGVyZXN0KCIvbG9jYWxob3N0L0ExIik7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0QTEgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdEExKS5maXJzdDsKKyAgcGl0QTEtPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTMsICppbnRlcmVzdEExKTsKKyAgZmFjZTEtPm1fc2VudEludGVyZXN0cy5jbGVhcigpOworICBmb3J3YXJkZXIub25PdXRnb2luZ0ludGVyZXN0KHBpdEExLCAqZmFjZTEpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+bV9zZW50SW50ZXJlc3RzLnNpemUoKSwgMSk7CisKKyAgLy8gbm9uLWxvY2FsIGZhY2UsIC9sb2NhbGhvc3Q6IHZpb2xhdGUKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RBMiA9IG1ha2VJbnRlcmVzdCgiL2xvY2FsaG9zdC9BMiIpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEEyID0gcGl0Lmluc2VydCgqaW50ZXJlc3RBMikuZmlyc3Q7CisgIHBpdEEyLT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UzLCAqaW50ZXJlc3RBMik7CisgIGZhY2UyLT5tX3NlbnRJbnRlcmVzdHMuY2xlYXIoKTsKKyAgZm9yd2FyZGVyLm9uT3V0Z29pbmdJbnRlcmVzdChwaXRBMiwgKmZhY2UyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTItPm1fc2VudEludGVyZXN0cy5zaXplKCksIDApOworCisgIC8vIGxvY2FsIGZhY2UsIG5vbi0vbG9jYWxob3N0OiBPSworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEEzID0gbWFrZUludGVyZXN0KCIvQTMiKTsKKyAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRBMyA9IHBpdC5pbnNlcnQoKmludGVyZXN0QTMpLmZpcnN0OworICBwaXRBMy0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMywgKmludGVyZXN0QTMpOworICBmYWNlMS0+bV9zZW50SW50ZXJlc3RzLmNsZWFyKCk7CisgIGZvcndhcmRlci5vbk91dGdvaW5nSW50ZXJlc3QocGl0QTMsICpmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UxLT5tX3NlbnRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKworICAvLyBub24tbG9jYWwgZmFjZSwgbm9uLS9sb2NhbGhvc3Q6IE9LCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0QTQgPSBtYWtlSW50ZXJlc3QoIi9BNCIpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEE0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RBNCkuZmlyc3Q7CisgIHBpdEE0LT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UzLCAqaW50ZXJlc3RBNCk7CisgIGZhY2UyLT5tX3NlbnRJbnRlcmVzdHMuY2xlYXIoKTsKKyAgZm9yd2FyZGVyLm9uT3V0Z29pbmdJbnRlcmVzdChwaXRBNCwgKmZhY2UyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTItPm1fc2VudEludGVyZXN0cy5zaXplKCksIDEpOworCisgIC8vIGxvY2FsIGZhY2UsIC9sb2NhbGhvc3Q6IE9LCisgIGZhY2UxLT5tX3NlbnREYXRhcy5jbGVhcigpOworICBmb3J3YXJkZXIub25PdXRnb2luZ0RhdGEoRGF0YSgiL2xvY2FsaG9zdC9CMSIpLCAqZmFjZTEpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+bV9zZW50RGF0YXMuc2l6ZSgpLCAxKTsKKworICAvLyBub24tbG9jYWwgZmFjZSwgL2xvY2FsaG9zdDogT0sKKyAgZmFjZTItPm1fc2VudERhdGFzLmNsZWFyKCk7CisgIGZvcndhcmRlci5vbk91dGdvaW5nRGF0YShEYXRhKCIvbG9jYWxob3N0L0IyIiksICpmYWNlMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLT5tX3NlbnREYXRhcy5zaXplKCksIDApOworCisgIC8vIGxvY2FsIGZhY2UsIG5vbi0vbG9jYWxob3N0OiBPSworICBmYWNlMS0+bV9zZW50RGF0YXMuY2xlYXIoKTsKKyAgZm9yd2FyZGVyLm9uT3V0Z29pbmdEYXRhKERhdGEoIi9CMyIpLCAqZmFjZTEpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMS0+bV9zZW50RGF0YXMuc2l6ZSgpLCAxKTsKKworICAvLyBub24tbG9jYWwgZmFjZSwgbm9uLS9sb2NhbGhvc3Q6IE9LCisgIGZhY2UyLT5tX3NlbnREYXRhcy5jbGVhcigpOworICBmb3J3YXJkZXIub25PdXRnb2luZ0RhdGEoRGF0YSgiL0I0IiksICpmYWNlMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLT5tX3NlbnREYXRhcy5zaXplKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTY29wZUxvY2FsaG9wT3V0Z29pbmcpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIHNoYXJlZF9wdHI8RHVtbXlMb2NhbEZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlMb2NhbEZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiAgICAgIGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15TG9jYWxGYWNlPiBmYWNlMyA9IG1ha2Vfc2hhcmVkPER1bW15TG9jYWxGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gICAgICBmYWNlNCA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTEpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMik7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UzKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTQpOworICBQaXQmIHBpdCA9IGZvcndhcmRlci5nZXRQaXQoKTsKKworICAvLyBmcm9tIGxvY2FsIGZhY2UsIHRvIGxvY2FsIGZhY2U6IE9LCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MSA9IG1ha2VJbnRlcmVzdCgiL2xvY2FsaG9wLzEiKTsKKyAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXQxID0gcGl0Lmluc2VydCgqaW50ZXJlc3QxKS5maXJzdDsKKyAgcGl0MS0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMSwgKmludGVyZXN0MSk7CisgIGZhY2UzLT5tX3NlbnRJbnRlcmVzdHMuY2xlYXIoKTsKKyAgZm9yd2FyZGVyLm9uT3V0Z29pbmdJbnRlcmVzdChwaXQxLCAqZmFjZTMpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMy0+bV9zZW50SW50ZXJlc3RzLnNpemUoKSwgMSk7CisKKyAgLy8gZnJvbSBub24tbG9jYWwgZmFjZSwgdG8gbG9jYWwgZmFjZTogT0sKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QyID0gbWFrZUludGVyZXN0KCIvbG9jYWxob3AvMiIpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdDIgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdDIpLmZpcnN0OworICBwaXQyLT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UyLCAqaW50ZXJlc3QyKTsKKyAgZmFjZTMtPm1fc2VudEludGVyZXN0cy5jbGVhcigpOworICBmb3J3YXJkZXIub25PdXRnb2luZ0ludGVyZXN0KHBpdDIsICpmYWNlMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UzLT5tX3NlbnRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKworICAvLyBmcm9tIGxvY2FsIGZhY2UsIHRvIG5vbi1sb2NhbCBmYWNlOiBPSworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDMgPSBtYWtlSW50ZXJlc3QoIi9sb2NhbGhvcC8zIik7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0MyA9IHBpdC5pbnNlcnQoKmludGVyZXN0MykuZmlyc3Q7CisgIHBpdDMtPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTEsICppbnRlcmVzdDMpOworICBmYWNlNC0+bV9zZW50SW50ZXJlc3RzLmNsZWFyKCk7CisgIGZvcndhcmRlci5vbk91dGdvaW5nSW50ZXJlc3QocGl0MywgKmZhY2U0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTQtPm1fc2VudEludGVyZXN0cy5zaXplKCksIDEpOworCisgIC8vIGZyb20gbm9uLWxvY2FsIGZhY2UsIHRvIG5vbi1sb2NhbCBmYWNlOiB2aW9sYXRlCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0NCA9IG1ha2VJbnRlcmVzdCgiL2xvY2FsaG9wLzQiKTsKKyAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXQ0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3Q0KS5maXJzdDsKKyAgcGl0NC0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMiwgKmludGVyZXN0NCk7CisgIGZhY2U0LT5tX3NlbnRJbnRlcmVzdHMuY2xlYXIoKTsKKyAgZm9yd2FyZGVyLm9uT3V0Z29pbmdJbnRlcmVzdChwaXQ0LCAqZmFjZTQpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlNC0+bV9zZW50SW50ZXJlc3RzLnNpemUoKSwgMCk7CisKKyAgLy8gZnJvbSBsb2NhbCBmYWNlIGFuZCBub24tbG9jYWwgZmFjZSwgdG8gbG9jYWwgZmFjZTogT0sKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3Q1ID0gbWFrZUludGVyZXN0KCIvbG9jYWxob3AvNSIpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdDUgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdDUpLmZpcnN0OworICBwaXQ1LT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UxLCAqaW50ZXJlc3Q1KTsKKyAgcGl0NS0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMiwgKmludGVyZXN0NSk7CisgIGZhY2UzLT5tX3NlbnRJbnRlcmVzdHMuY2xlYXIoKTsKKyAgZm9yd2FyZGVyLm9uT3V0Z29pbmdJbnRlcmVzdChwaXQ1LCAqZmFjZTMpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMy0+bV9zZW50SW50ZXJlc3RzLnNpemUoKSwgMSk7CisKKyAgLy8gZnJvbSBsb2NhbCBmYWNlIGFuZCBub24tbG9jYWwgZmFjZSwgdG8gbm9uLWxvY2FsIGZhY2U6IE9LCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0NiA9IG1ha2VJbnRlcmVzdCgiL2xvY2FsaG9wLzYiKTsKKyAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXQ2ID0gcGl0Lmluc2VydCgqaW50ZXJlc3Q2KS5maXJzdDsKKyAgcGl0Ni0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMSwgKmludGVyZXN0Nik7CisgIHBpdDYtPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTIsICppbnRlcmVzdDYpOworICBmYWNlNC0+bV9zZW50SW50ZXJlc3RzLmNsZWFyKCk7CisgIGZvcndhcmRlci5vbk91dGdvaW5nSW50ZXJlc3QocGl0NiwgKmZhY2U0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTQtPm1fc2VudEludGVyZXN0cy5zaXplKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTdHJhdGVneURpc3BhdGNoKQoreworICBMaW1pdGVkSW8gbGltaXRlZElvOworICBGb3J3YXJkZXIgZm9yd2FyZGVyOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKworICBTdHJhdGVneUNob2ljZSYgc3RyYXRlZ3lDaG9pY2UgPSBmb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKyAgc2hhcmVkX3B0cjxEdW1teVN0cmF0ZWd5PiBzdHJhdGVneVAgPSBtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYoZm9yd2FyZGVyKSwgIm5kbjovc3RyYXRlZ3lQIik7CisgIHNoYXJlZF9wdHI8RHVtbXlTdHJhdGVneT4gc3RyYXRlZ3lRID0gbWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmKGZvcndhcmRlciksICJuZG46L3N0cmF0ZWd5USIpOworICBzdHJhdGVneUNob2ljZS5pbnN0YWxsKHN0cmF0ZWd5UCk7CisgIHN0cmF0ZWd5Q2hvaWNlLmluc3RhbGwoc3RyYXRlZ3lRKTsKKyAgc3RyYXRlZ3lDaG9pY2UuaW5zZXJ0KCJuZG46LyIgLCBzdHJhdGVneVAtPmdldE5hbWUoKSk7CisgIHN0cmF0ZWd5Q2hvaWNlLmluc2VydCgibmRuOi9CIiwgc3RyYXRlZ3lRLT5nZXROYW1lKCkpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MSA9IG1ha2VJbnRlcmVzdCgibmRuOi9BLzEiKTsKKyAgc3RyYXRlZ3lQLT5tX2FmdGVyUmVjZWl2ZUludGVyZXN0X2NvdW50ID0gMDsKKyAgc3RyYXRlZ3lQLT5tX2ludGVyZXN0T3V0RmFjZSA9IGZhY2UyOworICBmb3J3YXJkZXIub25JbnRlcmVzdCgqZmFjZTEsICppbnRlcmVzdDEpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneVAtPm1fYWZ0ZXJSZWNlaXZlSW50ZXJlc3RfY291bnQsIDEpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MiA9IG1ha2VJbnRlcmVzdCgibmRuOi9CLzIiKTsKKyAgc3RyYXRlZ3lRLT5tX2FmdGVyUmVjZWl2ZUludGVyZXN0X2NvdW50ID0gMDsKKyAgc3RyYXRlZ3lRLT5tX2ludGVyZXN0T3V0RmFjZSA9IGZhY2UyOworICBmb3J3YXJkZXIub25JbnRlcmVzdCgqZmFjZTEsICppbnRlcmVzdDIpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneVEtPm1fYWZ0ZXJSZWNlaXZlSW50ZXJlc3RfY291bnQsIDEpOworCisgIGxpbWl0ZWRJby5ydW4oTGltaXRlZElvOjpVTkxJTUlURURfT1BTLCB0aW1lOjptaWxsaXNlY29uZHMoNSkpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTEgPSBtYWtlRGF0YSgibmRuOi9BLzEvYSIpOworICBzdHJhdGVneVAtPm1fYmVmb3JlU2F0aXNmeUludGVyZXN0X2NvdW50ID0gMDsKKyAgZm9yd2FyZGVyLm9uRGF0YSgqZmFjZTIsICpkYXRhMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5UC0+bV9iZWZvcmVTYXRpc2Z5SW50ZXJlc3RfY291bnQsIDEpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTIgPSBtYWtlRGF0YSgibmRuOi9CLzIvYiIpOworICBzdHJhdGVneVEtPm1fYmVmb3JlU2F0aXNmeUludGVyZXN0X2NvdW50ID0gMDsKKyAgZm9yd2FyZGVyLm9uRGF0YSgqZmFjZTIsICpkYXRhMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5US0+bV9iZWZvcmVTYXRpc2Z5SW50ZXJlc3RfY291bnQsIDEpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MyA9IG1ha2VJbnRlcmVzdCgibmRuOi9BLzMiKTsKKyAgaW50ZXJlc3QzLT5zZXRJbnRlcmVzdExpZmV0aW1lKHRpbWU6Om1pbGxpc2Vjb25kcygzMCkpOworICBmb3J3YXJkZXIub25JbnRlcmVzdCgqZmFjZTEsICppbnRlcmVzdDMpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDQgPSBtYWtlSW50ZXJlc3QoIm5kbjovQi80Iik7CisgIGludGVyZXN0NC0+c2V0SW50ZXJlc3RMaWZldGltZSh0aW1lOjptaWxsaXNlY29uZHMoNTAwMCkpOworICBmb3J3YXJkZXIub25JbnRlcmVzdCgqZmFjZTEsICppbnRlcmVzdDQpOworCisgIHN0cmF0ZWd5UC0+bV9iZWZvcmVFeHBpcmVQZW5kaW5nSW50ZXJlc3RfY291bnQgPSAwOworICBzdHJhdGVneVEtPm1fYmVmb3JlRXhwaXJlUGVuZGluZ0ludGVyZXN0X2NvdW50ID0gMDsKKyAgbGltaXRlZElvLnJ1bihMaW1pdGVkSW86OlVOTElNSVRFRF9PUFMsIHRpbWU6Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3lQLT5tX2JlZm9yZUV4cGlyZVBlbmRpbmdJbnRlcmVzdF9jb3VudCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5US0+bV9iZWZvcmVFeHBpcmVQZW5kaW5nSW50ZXJlc3RfY291bnQsIDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJbmNvbWluZ0RhdGEpCit7CisgIExpbWl0ZWRJbyBsaW1pdGVkSW87CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTMgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlNCA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTEpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMik7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UzKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTQpOworCisgIFBpdCYgcGl0ID0gZm9yd2FyZGVyLmdldFBpdCgpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDAgPSBtYWtlSW50ZXJlc3QoIm5kbjovIik7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0MCA9IHBpdC5pbnNlcnQoKmludGVyZXN0MCkuZmlyc3Q7CisgIHBpdDAtPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTEsICppbnRlcmVzdDApOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEEgPSBtYWtlSW50ZXJlc3QoIm5kbjovQSIpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEEgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdEEpLmZpcnN0OworICBwaXRBLT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UxLCAqaW50ZXJlc3RBKTsKKyAgcGl0QS0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMiwgKmludGVyZXN0QSk7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0QyA9IG1ha2VJbnRlcmVzdCgibmRuOi9BL0IvQyIpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEMgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdEMpLmZpcnN0OworICBwaXRDLT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UzLCAqaW50ZXJlc3RDKTsKKyAgcGl0Qy0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlNCwgKmludGVyZXN0Qyk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhRCA9IG1ha2VEYXRhKCJuZG46L0EvQi9DL0QiKTsKKyAgZm9yd2FyZGVyLm9uSW5jb21pbmdEYXRhKCpmYWNlMywgKmRhdGFEKTsKKyAgbGltaXRlZElvLnJ1bihMaW1pdGVkSW86OlVOTElNSVRFRF9PUFMsIHRpbWU6Om1pbGxpc2Vjb25kcyg1KSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTEtPm1fc2VudERhdGFzLnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLT5tX3NlbnREYXRhcy5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlMy0+bV9zZW50RGF0YXMuc2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTQtPm1fc2VudERhdGFzLnNpemUoKSwgMSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEludGVyZXN0TG9vcFdpdGhTaG9ydExpZmV0aW1lLCBVbml0VGVzdFRpbWVGaXh0dXJlKSAvLyBCdWcgMTk1MworeworICBGb3J3YXJkZXIgZm9yd2FyZGVyOworICBhdXRvIGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBhdXRvIGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKworICAvLyBjYXVzZSBhbiBJbnRlcmVzdCBzZW50IG91dCBvZiBmYWNlMiB0byBsb29wIGJhY2sgaW50byBmYWNlMSBhZnRlciBhIGRlbGF5CisgIGZhY2UyLT5vblNlbmRJbnRlcmVzdCArPSBbJmZhY2UxXSAoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KSB7CisgICAgc2NoZWR1bGVyOjpzY2hlZHVsZSh0aW1lOjptaWxsaXNlY29uZHMoMTcwKSwgWyZdIHsgZmFjZTEtPnJlY2VpdmVJbnRlcmVzdChpbnRlcmVzdCk7IH0pOworICB9OworCisgIEZpYiYgZmliID0gZm9yd2FyZGVyLmdldEZpYigpOworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGZpYkVudHJ5ID0gZmliLmluc2VydChOYW1lKCJuZG46L0EiKSkuZmlyc3Q7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UyLCAwKTsKKworICAvLyByZWNlaXZlIGFuIEludGVyZXN0CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZUludGVyZXN0KCJuZG46L0EvMSIpOworICBpbnRlcmVzdC0+c2V0Tm9uY2UoODIxMDExODMpOworICBpbnRlcmVzdC0+c2V0SW50ZXJlc3RMaWZldGltZSh0aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgZmFjZTEtPnJlY2VpdmVJbnRlcmVzdCgqaW50ZXJlc3QpOworCisgIC8vIGludGVyZXN0IHNob3VsZCBiZSBmb3J3YXJkZWQgb25seSBvbmNlLCBhcyBsb25nIGFzIE5vbmNlIGlzIGluIERlYWQgTm9uY2UgTGlzdAorICBCT09TVF9BU1NFUlQodGltZTo6bWlsbGlzZWNvbmRzKDI1KSAqIDQwIDwgZm9yd2FyZGVyLmdldERlYWROb25jZUxpc3QoKS5nZXRMaWZldGltZSgpKTsKKyAgdGhpcy0+YWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMjUpLCA0MCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTItPm1fc2VudEludGVyZXN0cy5zaXplKCksIDEpOworCisgIC8vIEl0J3MgdW5uZWNlc3NhcnkgdG8gY2hlY2sgdGhhdCBJbnRlcmVzdCB3aXRoIGR1cGxpY2F0ZSBOb25jZSBjYW4gYmUgZm9yd2FyZGVkIGFnYWluCisgIC8vIGFmdGVyIGl0J3MgZ29uZSBmcm9tIERlYWQgTm9uY2UgTGlzdCwgYmVjYXVzZSB0aGUgZW50cnkgbGlmZXRpbWUgb2YgRGVhZCBOb25jZSBMaXN0CisgIC8vIGlzIGFuIGltcGxlbWVudGF0aW9uIGRlY2lzaW9uLiBORE4gcHJvdG9jb2wgcmVxdWlyZXMgTmFtZStOb25jZSB0byBiZSB1bmlxdWUsCisgIC8vIHdpdGhvdXQgc3BlY2lmeWluZyB3aGVuIE5hbWUrTm9uY2UgY291bGQgcmVwZWF0LiBGb3J3YXJkZXIgaXMgcGVybWl0dGVkIHRvIHN1cHByZXNzCisgIC8vIGFuIEludGVyZXN0IGlmIGl0cyBOYW1lK05vbmNlIGhhcyBhcHBlYXJlZCBhbnkgcG9pbnQgaW4gdGhlIHBhc3QuCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL2Z3L25jYy1zdHJhdGVneS5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L25jYy1zdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzZjY0MQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZncvbmNjLXN0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDI3OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZ3L25jYy1zdHJhdGVneS5ocHAiCisjaW5jbHVkZSAic3RyYXRlZ3ktdGVzdGVyLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1mYWNlLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9saW1pdGVkLWlvLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoRndOY2NTdHJhdGVneSwgVW5pdFRlc3RUaW1lRml4dHVyZSkKKworLy8gTmNjU3RyYXRlZ3kgaXMgZmFpcmx5IGNvbXBsZXguCisvLyBUaGUgbW9zdCBpbXBvcnRhbnQgcHJvcGVydHkgaXM6CisvLyBpdCByZW1lbWJlcnMgd2hpY2ggdXBzdHJlYW0gaXMgdGhlIGZhc3Rlc3QgdG8gcmV0dXJuIERhdGEsCisvLyBhbmQgZmF2b3JzIHRoaXMgdXBzdHJlYW0gaW4gc3Vic2VxdWVudCBJbnRlcmVzdHMuCitCT09TVF9BVVRPX1RFU1RfQ0FTRShGYXZvclJlc3BvbmRpbmdVcHN0cmVhbSkKK3sKKyAgTGltaXRlZElvIGxpbWl0ZWRJbyh0aGlzKTsKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgdHlwZWRlZiBTdHJhdGVneVRlc3Rlcjxmdzo6TmNjU3RyYXRlZ3k+IE5jY1N0cmF0ZWd5VGVzdGVyOworICBzaGFyZWRfcHRyPE5jY1N0cmF0ZWd5VGVzdGVyPiBzdHJhdGVneSA9IG1ha2Vfc2hhcmVkPE5jY1N0cmF0ZWd5VGVzdGVyPihyZWYoZm9yd2FyZGVyKSk7CisgIHN0cmF0ZWd5LT5vbkFjdGlvbi5jb25uZWN0KGJpbmQoJkxpbWl0ZWRJbzo6YWZ0ZXJPcCwgJmxpbWl0ZWRJbykpOworCisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTMgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UxKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTIpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMyk7CisKKyAgRmliJiBmaWIgPSBmb3J3YXJkZXIuZ2V0RmliKCk7CisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnkgPSBmaWIuaW5zZXJ0KE5hbWUoKSkuZmlyc3Q7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UxLCAxMCk7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UyLCAyMCk7CisKKyAgU3RyYXRlZ3lDaG9pY2UmIHN0cmF0ZWd5Q2hvaWNlID0gZm9yd2FyZGVyLmdldFN0cmF0ZWd5Q2hvaWNlKCk7CisgIHN0cmF0ZWd5Q2hvaWNlLmluc3RhbGwoc3RyYXRlZ3kpOworICBzdHJhdGVneUNob2ljZS5pbnNlcnQoTmFtZSgpLCBzdHJhdGVneS0+Z2V0TmFtZSgpKTsKKworICBQaXQmIHBpdCA9IGZvcndhcmRlci5nZXRQaXQoKTsKKworICAvLyBmaXJzdCBJbnRlcmVzdDogc3RyYXRlZ3kga25vd3Mgbm90aGluZyBhbmQgZm9sbG93cyByb3V0aW5nCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MXAgPSBtYWtlSW50ZXJlc3QoIm5kbjovMEptMWFqclcvJTAwIik7CisgIEludGVyZXN0JiBpbnRlcmVzdDEgPSAqaW50ZXJlc3QxcDsKKyAgaW50ZXJlc3QxLnNldEludGVyZXN0TGlmZXRpbWUodGltZTo6bWlsbGlzZWNvbmRzKDgwMDApKTsKKyAgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeTEgPSBwaXQuaW5zZXJ0KGludGVyZXN0MSkuZmlyc3Q7CisKKyAgcGl0RW50cnkxLT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UzLCBpbnRlcmVzdDEpOworICBzdHJhdGVneS0+YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoKmZhY2UzLCBpbnRlcmVzdDEsIGZpYkVudHJ5LCBwaXRFbnRyeTEpOworCisgIC8vIGZvcndhcmRzIHRvIGZhY2UxIGJlY2F1c2Ugcm91dGluZyBzYXlzIGl0J3MgYmVzdAorICAvLyAobm8gaW8gcnVuIGhlcmU6IGFmdGVyUmVjZWl2ZUludGVyZXN0IGhhcyBhbHJlYWR5IHNlbnQgdGhlIEludGVyZXN0KQorICBCT09TVF9SRVFVSVJFX0VRVUFMKHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3ktPm1fc2VuZEludGVyZXN0SGlzdG9yeVswXS5nZXQ8MT4oKSwgZmFjZTEpOworCisgIC8vIGZvcndhcmRzIHRvIGZhY2UyIGJlY2F1c2UgZmFjZTEgZG9lc24ndCByZXNwb25kCisgIGxpbWl0ZWRJby5ydW4oMSwgdGltZTo6bWlsbGlzZWNvbmRzKDUwMCksIHRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3ktPm1fc2VuZEludGVyZXN0SGlzdG9yeVsxXS5nZXQ8MT4oKSwgZmFjZTIpOworCisgIC8vIGZhY2UyIHJlc3BvbmRzCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTFwID0gbWFrZURhdGEoIm5kbjovMEptMWFqclcvJTAwIik7CisgIERhdGEmIGRhdGExID0gKmRhdGExcDsKKyAgc3RyYXRlZ3ktPmJlZm9yZVNhdGlzZnlJbnRlcmVzdChwaXRFbnRyeTEsICpmYWNlMiwgZGF0YTEpOworICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxMCksIHRpbWU6Om1pbGxpc2Vjb25kcyg1MDApKTsKKworICAvLyBzZWNvbmQgSW50ZXJlc3Q6IHN0cmF0ZWd5IGtub3dzIGZhY2UyIGlzIGJlc3QKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QycCA9IG1ha2VJbnRlcmVzdCgibmRuOi8wSm0xYWpyVy8lMDAlMDEiKTsKKyAgSW50ZXJlc3QmIGludGVyZXN0MiA9ICppbnRlcmVzdDJwOworICBpbnRlcmVzdDIuc2V0SW50ZXJlc3RMaWZldGltZSh0aW1lOjptaWxsaXNlY29uZHMoODAwMCkpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5MiA9IHBpdC5pbnNlcnQoaW50ZXJlc3QyKS5maXJzdDsKKworICBwaXRFbnRyeTItPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTMsIGludGVyZXN0Mik7CisgIHN0cmF0ZWd5LT5hZnRlclJlY2VpdmVJbnRlcmVzdCgqZmFjZTMsIGludGVyZXN0MiwgZmliRW50cnksIHBpdEVudHJ5Mik7CisKKyAgLy8gZm9yd2FyZHMgdG8gZmFjZTIgYmVjYXVzZSBpdCByZXNwb25kcyBwcmV2aW91c2x5CisgIHRoaXMtPmFkdmFuY2VDbG9ja3ModGltZTo6bWlsbGlzZWNvbmRzKDEpKTsKKyAgQk9PU1RfUkVRVUlSRV9HRShzdHJhdGVneS0+bV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3RvcnlbMl0uZ2V0PDE+KCksIGZhY2UyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQnVnMTg1MykKK3sKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgdHlwZWRlZiBTdHJhdGVneVRlc3Rlcjxmdzo6TmNjU3RyYXRlZ3k+IE5jY1N0cmF0ZWd5VGVzdGVyOworICBzaGFyZWRfcHRyPE5jY1N0cmF0ZWd5VGVzdGVyPiBzdHJhdGVneSA9IG1ha2Vfc2hhcmVkPE5jY1N0cmF0ZWd5VGVzdGVyPihyZWYoZm9yd2FyZGVyKSk7CisKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTIgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMyA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTEpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMik7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UzKTsKKworICBGaWImIGZpYiA9IGZvcndhcmRlci5nZXRGaWIoKTsKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSA9IGZpYi5pbnNlcnQoTmFtZSgpKS5maXJzdDsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTEsIDEwKTsKKworICBTdHJhdGVneUNob2ljZSYgc3RyYXRlZ3lDaG9pY2UgPSBmb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKyAgc3RyYXRlZ3lDaG9pY2UuaW5zdGFsbChzdHJhdGVneSk7CisgIHN0cmF0ZWd5Q2hvaWNlLmluc2VydChOYW1lKCksIHN0cmF0ZWd5LT5nZXROYW1lKCkpOworCisgIFBpdCYgcGl0ID0gZm9yd2FyZGVyLmdldFBpdCgpOworCisgIC8vIGZpcnN0IEludGVyZXN0OiBzdHJhdGVneSBmb2xsb3dzIHJvdXRpbmcgYW5kIGZvcndhcmRzIHRvIGZhY2UxCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MSA9IG1ha2VJbnRlcmVzdCgibmRuOi9uenR3SXZIWC8lMDAiKTsKKyAgaW50ZXJlc3QxLT5zZXRJbnRlcmVzdExpZmV0aW1lKHRpbWU6Om1pbGxpc2Vjb25kcyg4MDAwKSk7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkxID0gcGl0Lmluc2VydCgqaW50ZXJlc3QxKS5maXJzdDsKKworICBwaXRFbnRyeTEtPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTMsICppbnRlcmVzdDEpOworICBzdHJhdGVneS0+YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoKmZhY2UzLCAqaW50ZXJlc3QxLCBmaWJFbnRyeSwgcGl0RW50cnkxKTsKKworICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxKSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc3RyYXRlZ3ktPm1fc2VuZEludGVyZXN0SGlzdG9yeS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneS0+bV9zZW5kSW50ZXJlc3RIaXN0b3J5WzBdLmdldDwxPigpLCBmYWNlMSk7CisKKyAgLy8gZmFjZTEgcmVzcG9uZHMKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhMSA9IG1ha2VEYXRhKCJuZG46L256dHdJdkhYLyUwMCIpOworICBzdHJhdGVneS0+YmVmb3JlU2F0aXNmeUludGVyZXN0KHBpdEVudHJ5MSwgKmZhY2UxLCAqZGF0YTEpOworICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxMCksIHRpbWU6Om1pbGxpc2Vjb25kcyg1MDApKTsKKworICAvLyBzZWNvbmQgSW50ZXJlc3Q6IGJlc3RGYWNlIGlzIGZhY2UxLCBuVXBzdHJlYW1zIGJlY29tZXMgMCwKKyAgLy8gdGhlcmVmb3JlIHBpdEVudHJ5SW5mby0+bWF4SW50ZXJ2YWwgY2Fubm90IGJlIGNhbGN1bGF0ZWQgZnJvbSBkZWZlclJhbmdlIGFuZCBuVXBzdHJlYW1zCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MiA9IG1ha2VJbnRlcmVzdCgibmRuOi9uenR3SXZIWC8lMDEiKTsKKyAgaW50ZXJlc3QyLT5zZXRJbnRlcmVzdExpZmV0aW1lKHRpbWU6Om1pbGxpc2Vjb25kcyg4MDAwKSk7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkyID0gcGl0Lmluc2VydCgqaW50ZXJlc3QyKS5maXJzdDsKKworICBwaXRFbnRyeTItPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTMsICppbnRlcmVzdDIpOworICBzdHJhdGVneS0+YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoKmZhY2UzLCAqaW50ZXJlc3QyLCBmaWJFbnRyeSwgcGl0RW50cnkyKTsKKworICAvLyBGSUIgZW50cnkgaXMgY2hhbmdlZCBiZWZvcmUgZG9Qcm9wYWdhdGUgZXhlY3V0ZXMKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTIsIDIwKTsKKyAgdGhpcy0+YWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMTApLCB0aW1lOjptaWxsaXNlY29uZHMoMTAwMCkpOy8vIHNob3VsZCBub3QgY3Jhc2gKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQnVnMTk2MSkKK3sKKyAgTGltaXRlZElvIGxpbWl0ZWRJbyh0aGlzKTsKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgdHlwZWRlZiBTdHJhdGVneVRlc3Rlcjxmdzo6TmNjU3RyYXRlZ3k+IE5jY1N0cmF0ZWd5VGVzdGVyOworICBzaGFyZWRfcHRyPE5jY1N0cmF0ZWd5VGVzdGVyPiBzdHJhdGVneSA9IG1ha2Vfc2hhcmVkPE5jY1N0cmF0ZWd5VGVzdGVyPihyZWYoZm9yd2FyZGVyKSk7CisgIHN0cmF0ZWd5LT5vbkFjdGlvbi5jb25uZWN0KGJpbmQoJkxpbWl0ZWRJbzo6YWZ0ZXJPcCwgJmxpbWl0ZWRJbykpOworCisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTMgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UxKTsKKyAgZm9yd2FyZGVyLmFkZEZhY2UoZmFjZTIpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMyk7CisKKyAgRmliJiBmaWIgPSBmb3J3YXJkZXIuZ2V0RmliKCk7CisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZmliRW50cnkgPSBmaWIuaW5zZXJ0KE5hbWUoKSkuZmlyc3Q7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UxLCAxMCk7CisgIGZpYkVudHJ5LT5hZGROZXh0SG9wKGZhY2UyLCAyMCk7CisKKyAgU3RyYXRlZ3lDaG9pY2UmIHN0cmF0ZWd5Q2hvaWNlID0gZm9yd2FyZGVyLmdldFN0cmF0ZWd5Q2hvaWNlKCk7CisgIHN0cmF0ZWd5Q2hvaWNlLmluc3RhbGwoc3RyYXRlZ3kpOworICBzdHJhdGVneUNob2ljZS5pbnNlcnQoTmFtZSgpLCBzdHJhdGVneS0+Z2V0TmFtZSgpKTsKKworICBQaXQmIHBpdCA9IGZvcndhcmRlci5nZXRQaXQoKTsKKworICAvLyBmaXJzdCBJbnRlcmVzdDogc3RyYXRlZ3kgZm9yd2FyZHMgdG8gZmFjZTEgYW5kIGZhY2UyCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MSA9IG1ha2VJbnRlcmVzdCgibmRuOi9zZVJNejVhNi8lMDAiKTsKKyAgaW50ZXJlc3QxLT5zZXRJbnRlcmVzdExpZmV0aW1lKHRpbWU6Om1pbGxpc2Vjb25kcygyMDAwKSk7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkxID0gcGl0Lmluc2VydCgqaW50ZXJlc3QxKS5maXJzdDsKKworICBwaXRFbnRyeTEtPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTMsICppbnRlcmVzdDEpOworICBzdHJhdGVneS0+YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoKmZhY2UzLCAqaW50ZXJlc3QxLCBmaWJFbnRyeSwgcGl0RW50cnkxKTsKKyAgbGltaXRlZElvLnJ1bigyIC0gc3RyYXRlZ3ktPm1fc2VuZEludGVyZXN0SGlzdG9yeS5zaXplKCksCisgICAgICAgICAgICAgICAgdGltZTo6bWlsbGlzZWNvbmRzKDIwMDApLCB0aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzdHJhdGVneS0+bV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3RvcnlbMF0uZ2V0PDE+KCksIGZhY2UxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3ktPm1fc2VuZEludGVyZXN0SGlzdG9yeVsxXS5nZXQ8MT4oKSwgZmFjZTIpOworCisgIC8vIGZhY2UxIHJlc3BvbmRzCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTEgPSBtYWtlRGF0YSgibmRuOi9zZVJNejVhNi8lMDAiKTsKKyAgc3RyYXRlZ3ktPmJlZm9yZVNhdGlzZnlJbnRlcmVzdChwaXRFbnRyeTEsICpmYWNlMSwgKmRhdGExKTsKKyAgcGl0RW50cnkxLT5kZWxldGVJblJlY29yZHMoKTsKKyAgdGhpcy0+YWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKyAgLy8gZmFjZTIgYWxzbyByZXNwb25kcworICBzdHJhdGVneS0+YmVmb3JlU2F0aXNmeUludGVyZXN0KHBpdEVudHJ5MSwgKmZhY2UyLCAqZGF0YTEpOworICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworCisgIC8vIHNlY29uZCBJbnRlcmVzdDogYmVzdEZhY2Ugc2hvdWxkIGJlIGZhY2UgMQorICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDIgPSBtYWtlSW50ZXJlc3QoIm5kbjovc2VSTXo1YTYvJTAxIik7CisgIGludGVyZXN0Mi0+c2V0SW50ZXJlc3RMaWZldGltZSh0aW1lOjptaWxsaXNlY29uZHMoMjAwMCkpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5MiA9IHBpdC5pbnNlcnQoKmludGVyZXN0MikuZmlyc3Q7CisKKyAgcGl0RW50cnkyLT5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UzLCAqaW50ZXJlc3QyKTsKKyAgc3RyYXRlZ3ktPmFmdGVyUmVjZWl2ZUludGVyZXN0KCpmYWNlMywgKmludGVyZXN0MiwgZmliRW50cnksIHBpdEVudHJ5Mik7CisgIGxpbWl0ZWRJby5ydW4oMyAtIHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLAorICAgICAgICAgICAgICAgIHRpbWU6Om1pbGxpc2Vjb25kcygyMDAwKSwgdGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisKKyAgQk9PU1RfUkVRVUlSRV9HRShzdHJhdGVneS0+bV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3RvcnlbMl0uZ2V0PDE+KCksIGZhY2UxKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQnVnMTk3MSkKK3sKKyAgTGltaXRlZElvIGxpbWl0ZWRJbyh0aGlzKTsKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgdHlwZWRlZiBTdHJhdGVneVRlc3Rlcjxmdzo6TmNjU3RyYXRlZ3k+IE5jY1N0cmF0ZWd5VGVzdGVyOworICBzaGFyZWRfcHRyPE5jY1N0cmF0ZWd5VGVzdGVyPiBzdHJhdGVneSA9IG1ha2Vfc2hhcmVkPE5jY1N0cmF0ZWd5VGVzdGVyPihyZWYoZm9yd2FyZGVyKSk7CisgIHN0cmF0ZWd5LT5vbkFjdGlvbi5jb25uZWN0KGJpbmQoJkxpbWl0ZWRJbzo6YWZ0ZXJPcCwgJmxpbWl0ZWRJbykpOworCisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKworICBGaWImIGZpYiA9IGZvcndhcmRlci5nZXRGaWIoKTsKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeSA9IGZpYi5pbnNlcnQoTmFtZSgpKS5maXJzdDsKKyAgZmliRW50cnktPmFkZE5leHRIb3AoZmFjZTIsIDEwKTsKKworICBTdHJhdGVneUNob2ljZSYgc3RyYXRlZ3lDaG9pY2UgPSBmb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKyAgc3RyYXRlZ3lDaG9pY2UuaW5zdGFsbChzdHJhdGVneSk7CisgIHN0cmF0ZWd5Q2hvaWNlLmluc2VydChOYW1lKCksIHN0cmF0ZWd5LT5nZXROYW1lKCkpOworCisgIFBpdCYgcGl0ID0gZm9yd2FyZGVyLmdldFBpdCgpOworCisgIC8vIGZpcnN0IEludGVyZXN0OiBzdHJhdGVneSBmb3J3YXJkcyB0byBmYWNlMgorICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDEgPSBtYWtlSW50ZXJlc3QoIm5kbjovTTRtQlhDc2QiKTsKKyAgaW50ZXJlc3QxLT5zZXRJbnRlcmVzdExpZmV0aW1lKHRpbWU6Om1pbGxpc2Vjb25kcygyMDAwKSk7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkxID0gcGl0Lmluc2VydCgqaW50ZXJlc3QxKS5maXJzdDsKKworICBwaXRFbnRyeTEtPmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTEsICppbnRlcmVzdDEpOworICBzdHJhdGVneS0+YWZ0ZXJSZWNlaXZlSW50ZXJlc3QoKmZhY2UxLCAqaW50ZXJlc3QxLCBmaWJFbnRyeSwgcGl0RW50cnkxKTsKKyAgbGltaXRlZElvLnJ1bigxIC0gc3RyYXRlZ3ktPm1fc2VuZEludGVyZXN0SGlzdG9yeS5zaXplKCksCisgICAgICAgICAgICAgICAgdGltZTo6bWlsbGlzZWNvbmRzKDIwMDApLCB0aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzdHJhdGVneS0+bV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3RvcnlbMF0uZ2V0PDE+KCksIGZhY2UyKTsKKworICAvLyBmYWNlMiByZXNwb25kcworICBzaGFyZWRfcHRyPERhdGE+IGRhdGExID0gbWFrZURhdGEoIm5kbjovTTRtQlhDc2QiKTsKKyAgZGF0YTEtPnNldEZyZXNobmVzc1BlcmlvZCh0aW1lOjptaWxsaXNlY29uZHMoNSkpOworICBzdHJhdGVneS0+YmVmb3JlU2F0aXNmeUludGVyZXN0KHBpdEVudHJ5MSwgKmZhY2UyLCAqZGF0YTEpOworICBwaXRFbnRyeTEtPmRlbGV0ZU91dFJlY29yZCgqZmFjZTIpOworICBwaXRFbnRyeTEtPmRlbGV0ZUluUmVjb3JkcygpOworICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworCisgIC8vIHNpbWlsYXIgSW50ZXJlc3Q6IHN0cmF0ZWd5IHNob3VsZCBzdGlsbCBmb3J3YXJkIGl0CisgIHBpdEVudHJ5MS0+aW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMSwgKmludGVyZXN0MSk7CisgIHN0cmF0ZWd5LT5hZnRlclJlY2VpdmVJbnRlcmVzdCgqZmFjZTEsICppbnRlcmVzdDEsIGZpYkVudHJ5LCBwaXRFbnRyeTEpOworICBsaW1pdGVkSW8ucnVuKDIgLSBzdHJhdGVneS0+bV9zZW5kSW50ZXJlc3RIaXN0b3J5LnNpemUoKSwKKyAgICAgICAgICAgICAgICB0aW1lOjptaWxsaXNlY29uZHMoMjAwMCksIHRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHN0cmF0ZWd5LT5tX3NlbmRJbnRlcmVzdEhpc3Rvcnkuc2l6ZSgpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3ktPm1fc2VuZEludGVyZXN0SGlzdG9yeVsxXS5nZXQ8MT4oKSwgZmFjZTIpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mdy9ydHQtZXN0aW1hdG9yLmNwcCBiL05GRC90ZXN0cy9kYWVtb24vZncvcnR0LWVzdGltYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhZjBhYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vZncvcnR0LWVzdGltYXRvci5jcHAKQEAgLTAsMCArMSw4MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImZ3L3J0dC1lc3RpbWF0b3IuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGd1J0dEVzdGltYXRvciwgQmFzZUZpeHR1cmUpCisKK3N0YXRpYyBpbmxpbmUgZG91YmxlCitjb21wdXRlUnRvQXNGbG9hdFNlY29uZHMoUnR0RXN0aW1hdG9yJiBydHQpCit7CisgIHR5cGVkZWYgdGltZTo6ZHVyYXRpb248ZG91YmxlLCB0aW1lOjpzZWNvbmRzOjpwZXJpb2Q+IEZsb2F0U2Vjb25kczsKKworICBSdHRFc3RpbWF0b3I6OkR1cmF0aW9uIHJ0byA9IHJ0dC5jb21wdXRlUnRvKCk7CisgIHJldHVybiB0aW1lOjpkdXJhdGlvbl9jYXN0PEZsb2F0U2Vjb25kcz4ocnRvKS5jb3VudCgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCYXNpYykKK3sKKyAgUnR0RXN0aW1hdG9yIHJ0dDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgcnR0LmFkZE1lYXN1cmVtZW50KHRpbWU6OnNlY29uZHMoNSkpOworICB9CisgIGRvdWJsZSBydG8xID0gY29tcHV0ZVJ0b0FzRmxvYXRTZWNvbmRzKHJ0dCk7CisgIEJPT1NUX0NIRUNLX0NMT1NFKHJ0bzEsIDUuMCwgMC4xKTsKKworICBydHQuZG91YmxlTXVsdGlwbGllcigpOworICBkb3VibGUgcnRvMiA9IGNvbXB1dGVSdG9Bc0Zsb2F0U2Vjb25kcyhydHQpOworICBCT09TVF9DSEVDS19DTE9TRShydG8yLCAxMC4wLCAwLjEpOworCisgIHJ0dC5kb3VibGVNdWx0aXBsaWVyKCk7CisgIGRvdWJsZSBydG8zID0gY29tcHV0ZVJ0b0FzRmxvYXRTZWNvbmRzKHJ0dCk7CisgIEJPT1NUX0NIRUNLX0NMT1NFKHJ0bzMsIDIwLjAsIDAuMSk7CisKKyAgcnR0LmFkZE1lYXN1cmVtZW50KHRpbWU6OnNlY29uZHMoNSkpOyAvLyByZXNldCBtdWx0aXBsaWVyCisgIGRvdWJsZSBydG80ID0gY29tcHV0ZVJ0b0FzRmxvYXRTZWNvbmRzKHJ0dCk7CisgIEJPT1NUX0NIRUNLX0NMT1NFKHJ0bzQsIDUuMCwgMC4xKTsKKworICBydHQuaW5jcmVtZW50TXVsdGlwbGllcigpOworICBkb3VibGUgcnRvNSA9IGNvbXB1dGVSdG9Bc0Zsb2F0U2Vjb25kcyhydHQpOworICBCT09TVF9DSEVDS19DTE9TRShydG81LCAxMC4wLCAwLjEpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgcnR0LmFkZE1lYXN1cmVtZW50KHRpbWU6OnNlY29uZHMoNikpOworICB9IC8vIGluY3JlYXNlZCB2YXJpYW5jZQorICBkb3VibGUgcnRvNiA9IGNvbXB1dGVSdG9Bc0Zsb2F0U2Vjb25kcyhydHQpOworICBCT09TVF9DSEVDS19HVChydG82LCBydG8xKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vZncvc3RyYXRlZ3ktdGVzdGVyLmhwcCBiL05GRC90ZXN0cy9kYWVtb24vZncvc3RyYXRlZ3ktdGVzdGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODAxNDRkCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mdy9zdHJhdGVneS10ZXN0ZXIuaHBwCkBAIC0wLDAgKzEsOTMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX1RFU1RTX05GRF9GV19TVFJBVEVHWV9URVNURVJfSFBQCisjZGVmaW5lIE5GRF9URVNUU19ORkRfRldfU1RSQVRFR1lfVEVTVEVSX0hQUAorCisjaW5jbHVkZSA8Ym9vc3QvdHVwbGUvdHVwbGVfY29tcGFyaXNvbi5ocHA+CisjaW5jbHVkZSAiZncvc3RyYXRlZ3kuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKKy8qKiBcY2xhc3MgU3RyYXRlZ3lUZXN0ZXIKKyAqICBcYnJpZWYgZXh0ZW5kcyBzdHJhdGVneSBTIGZvciB1bml0IHRlc3RpbmcKKyAqCisgKiAgQWN0aW9ucyBpbnZva2VkIGJ5IFMgYXJlIHJlY29yZGVkIGJ1dCBub3QgcGFzc2VkIHRvIGZvcndhcmRlcgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorY2xhc3MgU3RyYXRlZ3lUZXN0ZXIgOiBwdWJsaWMgUworeworcHVibGljOgorICBleHBsaWNpdAorICBTdHJhdGVneVRlc3RlcihGb3J3YXJkZXImIGZvcndhcmRlcikKKyAgICA6IFMoZm9yd2FyZGVyLCBOYW1lKFM6OlNUUkFURUdZX05BTUUpLmFwcGVuZCgidGVzdGVyIikpCisgIHsKKyAgfQorCisgIC8vLyBmaXJlcyBhZnRlciBlYWNoIEFjdGlvbgorICBzaWduYWw6OlNpZ25hbDxTdHJhdGVneVRlc3RlcjxTPj4gb25BY3Rpb247CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkCisgIHNlbmRJbnRlcmVzdChzaGFyZWRfcHRyPHBpdDo6RW50cnk+IHBpdEVudHJ5LAorICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxGYWNlPiBvdXRGYWNlLAorICAgICAgICAgICAgICAgYm9vbCB3YW50TmV3Tm9uY2UgPSBmYWxzZSkgREVDTF9PVkVSUklERTsKKworICB2aXJ0dWFsIHZvaWQKKyAgcmVqZWN0UGVuZGluZ0ludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkpIERFQ0xfT1ZFUlJJREU7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBib29zdDo6dHVwbGU8c2hhcmVkX3B0cjxwaXQ6OkVudHJ5Piwgc2hhcmVkX3B0cjxGYWNlPj4gU2VuZEludGVyZXN0QXJnczsKKyAgc3RkOjp2ZWN0b3I8U2VuZEludGVyZXN0QXJncz4gbV9zZW5kSW50ZXJlc3RIaXN0b3J5OworCisgIHR5cGVkZWYgYm9vc3Q6OnR1cGxlPHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4+IFJlamVjdFBlbmRpbmdJbnRlcmVzdEFyZ3M7CisgIHN0ZDo6dmVjdG9yPFJlamVjdFBlbmRpbmdJbnRlcmVzdEFyZ3M+IG1fcmVqZWN0UGVuZGluZ0ludGVyZXN0SGlzdG9yeTsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgUz4KK2lubGluZSB2b2lkCitTdHJhdGVneVRlc3RlcjxTPjo6c2VuZEludGVyZXN0KHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8RmFjZT4gb3V0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3YW50TmV3Tm9uY2UpCit7CisgIG1fc2VuZEludGVyZXN0SGlzdG9yeS5wdXNoX2JhY2soU2VuZEludGVyZXN0QXJncyhwaXRFbnRyeSwgb3V0RmFjZSkpOworICBwaXRFbnRyeS0+aW5zZXJ0T3JVcGRhdGVPdXRSZWNvcmQob3V0RmFjZSwgcGl0RW50cnktPmdldEludGVyZXN0KCkpOworICBvbkFjdGlvbigpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgoraW5saW5lIHZvaWQKK1N0cmF0ZWd5VGVzdGVyPFM+OjpyZWplY3RQZW5kaW5nSW50ZXJlc3Qoc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiBwaXRFbnRyeSkKK3sKKyAgbV9yZWplY3RQZW5kaW5nSW50ZXJlc3RIaXN0b3J5LnB1c2hfYmFjayhSZWplY3RQZW5kaW5nSW50ZXJlc3RBcmdzKHBpdEVudHJ5KSk7CisgIG9uQWN0aW9uKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9URVNUU19ORkRfRldfU1RSQVRFR1lfVEVTVEVSX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9mdy9zdHJhdGVneS5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL2Z3L3N0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjZiMjgwCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9mdy9zdHJhdGVneS5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImZ3L3N0cmF0ZWd5LmhwcCIKKyNpbmNsdWRlICJkdW1teS1zdHJhdGVneS5ocHAiCisjaW5jbHVkZSAidGVzdHMvZGFlbW9uL2ZhY2UvZHVtbXktZmFjZS5ocHAiCisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9maWx0ZXJlZC5ocHA+CisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEZ3U3RyYXRlZ3ksIEJhc2VGaXh0dXJlKQorCitjbGFzcyBGYWNlVGFibGVBY2Nlc3NUZXN0U3RyYXRlZ3kgOiBwdWJsaWMgRHVtbXlTdHJhdGVneQoreworcHVibGljOgorICBleHBsaWNpdAorICBGYWNlVGFibGVBY2Nlc3NUZXN0U3RyYXRlZ3koRm9yd2FyZGVyJiBmb3J3YXJkZXIpCisgICAgOiBEdW1teVN0cmF0ZWd5KGZvcndhcmRlciwgTmFtZSgibmRuOi9zdHJhdGVneSIpKQorICB7CisgICAgdGhpcy0+YWZ0ZXJBZGRGYWNlLmNvbm5lY3QoW3RoaXNdIChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpIHsKKyAgICAgIHRoaXMtPmFkZGVkRmFjZXMucHVzaF9iYWNrKGZhY2UtPmdldElkKCkpOworICAgIH0pOworICAgIHRoaXMtPmJlZm9yZVJlbW92ZUZhY2UuY29ubmVjdChbdGhpc10gKHNoYXJlZF9wdHI8RmFjZT4gZmFjZSkgeworICAgICAgdGhpcy0+cmVtb3ZlZEZhY2VzLnB1c2hfYmFjayhmYWNlLT5nZXRJZCgpKTsKKyAgICB9KTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEZhY2VJZD4KKyAgZ2V0TG9jYWxGYWNlcygpCisgIHsKKyAgICBhdXRvIGVudW1lcmFibGUgPSB0aGlzLT5nZXRGYWNlVGFibGUoKSB8CisgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmFkYXB0b3JzOjpmaWx0ZXJlZChbXSAoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjZS0+aXNMb2NhbCgpOworICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgc3RkOjp2ZWN0b3I8RmFjZUlkPiByZXN1bHRzOworICAgIGZvciAoc2hhcmVkX3B0cjxGYWNlPiBmYWNlIDogZW51bWVyYWJsZSkgeworICAgICAgcmVzdWx0cy5wdXNoX2JhY2soZmFjZS0+Z2V0SWQoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHRzOworICB9CisKK3B1YmxpYzoKKyAgc3RkOjp2ZWN0b3I8RmFjZUlkPiBhZGRlZEZhY2VzOworICBzdGQ6OnZlY3RvcjxGYWNlSWQ+IHJlbW92ZWRGYWNlczsKK307CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEZhY2VUYWJsZUFjY2VzcykKK3sKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgRmFjZVRhYmxlQWNjZXNzVGVzdFN0cmF0ZWd5IHN0cmF0ZWd5KGZvcndhcmRlcik7CisKKyAgYXV0byBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgYXV0byBmYWNlMiA9IG1ha2Vfc2hhcmVkPER1bW15TG9jYWxGYWNlPigpOworICBmb3J3YXJkZXIuYWRkRmFjZShmYWNlMSk7CisgIGZvcndhcmRlci5hZGRGYWNlKGZhY2UyKTsKKyAgRmFjZUlkIGlkMSA9IGZhY2UxLT5nZXRJZCgpOworICBGYWNlSWQgaWQyID0gZmFjZTItPmdldElkKCk7CisKKyAgQk9PU1RfQ0hFQ0soc3RyYXRlZ3kuZ2V0TG9jYWxGYWNlcygpID09IHN0ZDo6dmVjdG9yPEZhY2VJZD57aWQyfSk7CisKKyAgZmFjZTItPmNsb3NlKCk7CisgIGZhY2UxLT5jbG9zZSgpOworCisgIEJPT1NUX0NIRUNLKChzdHJhdGVneS5hZGRlZEZhY2VzICAgPT0gc3RkOjp2ZWN0b3I8RmFjZUlkPntpZDEsIGlkMn0pKTsKKyAgQk9PU1RfQ0hFQ0soKHN0cmF0ZWd5LnJlbW92ZWRGYWNlcyA9PSBzdGQ6OnZlY3RvcjxGYWNlSWQ+e2lkMiwgaWQxfSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2NoYW5uZWwtc3RhdHVzLWNvbW1vbi5ocHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvY2hhbm5lbC1zdGF0dXMtY29tbW9uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU0Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2NoYW5uZWwtc3RhdHVzLWNvbW1vbi5ocHAKQEAgLTAsMCArMSw5NyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfVEVTVFNfTkZEX01HTVRfQ0hBTk5FTF9TVEFUVVNfQ09NTU9OX0hQUAorI2RlZmluZSBORkRfVEVTVFNfTkZEX01HTVRfQ0hBTk5FTF9TVEFUVVNfQ09NTU9OX0hQUAorCisjaW5jbHVkZSAiZmFjZS9wcm90b2NvbC1mYWN0b3J5LmhwcCIKKyNpbmNsdWRlICJmYWNlL2NoYW5uZWwuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jaGFubmVsLXN0YXR1cy5ocHA+CisKKworCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK2NsYXNzIER1bW15Q2hhbm5lbCA6IHB1YmxpYyBDaGFubmVsCit7CitwdWJsaWM6CisKKyAgRHVtbXlDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmkpCisgIHsKKyAgICBzZXRVcmkoRmFjZVVyaSh1cmkpKTsKKyAgfQorCisgIHZpcnR1YWwKKyAgfkR1bW15Q2hhbm5lbCgpCisgIHsKKyAgfQorfTsKKworY2xhc3MgRHVtbXlQcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgUHJvdG9jb2xGYWN0b3J5Cit7CitwdWJsaWM6CisKKyAgRHVtbXlQcm90b2NvbEZhY3RvcnkoKQorICB7CisKKyAgfQorCisgIHZpcnR1YWwgdm9pZAorICBjcmVhdGVGYWNlKGNvbnN0IEZhY2VVcmkmIHVyaSwKKyAgICAgICAgICAgICBjb25zdCBGYWNlQ3JlYXRlZENhbGxiYWNrJiBvbkNyZWF0ZWQsCisgICAgICAgICAgICAgY29uc3QgRmFjZUNvbm5lY3RGYWlsZWRDYWxsYmFjayYgb25Db25uZWN0RmFpbGVkKQorICB7CisgIH0KKworICB2aXJ0dWFsIHZvaWQKKyAgYWRkQ2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgY2hhbm5lbFVyaSkKKyAgeworICAgIG1fY2hhbm5lbHMucHVzaF9iYWNrKG1ha2Vfc2hhcmVkPER1bW15Q2hhbm5lbD4oY2hhbm5lbFVyaSkpOworICB9CisKKyAgdmlydHVhbCBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+CisgIGdldENoYW5uZWxzKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2NoYW5uZWxzOworICB9CisKKyAgdmlydHVhbCBzaXplX3QKKyAgZ2V0TkNoYW5uZWxzKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2NoYW5uZWxzLnNpemUoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6Omxpc3Q8c2hhcmVkX3B0cjxjb25zdCBDaGFubmVsPiA+IG1fY2hhbm5lbHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfVEVTVFNfTkZEX01HTVRfQ0hBTk5FTF9TVEFUVVNfQ09NTU9OX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2NoYW5uZWwtc3RhdHVzLXB1Ymxpc2hlci5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvY2hhbm5lbC1zdGF0dXMtcHVibGlzaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzBlZmUxCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2NoYW5uZWwtc3RhdHVzLXB1Ymxpc2hlci5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJtZ210L2NoYW5uZWwtc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKworI2luY2x1ZGUgImNoYW5uZWwtc3RhdHVzLWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlICJjb3JlL2xvZ2dlci5ocHAiCitORkRfTE9HX0lOSVQoIlRlc3RDaGFubmVsU3RhdHVzUHVibGlzaGVyIik7CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworY2xhc3MgQ2hhbm5lbFN0YXR1c1B1Ymxpc2hlckZpeHR1cmUgOiBCYXNlRml4dHVyZQoreworcHVibGljOgorICBDaGFubmVsU3RhdHVzUHVibGlzaGVyRml4dHVyZSgpCisgICAgOiBtX2ZhY2UobWFrZV9zaGFyZWQ8SW50ZXJuYWxGYWNlPigpKQorICAgICwgbV9wdWJsaXNoZXIobV9mYWN0b3JpZXMsICptX2ZhY2UsICIvbG9jYWxob3N0L25mZC9mYWNlcy9jaGFubmVscyIsIG1fa2V5Q2hhaW4pCisgICAgLCBtX2ZpbmlzaGVkKGZhbHNlKQorICB7CisgIH0KKworICB2aXJ0dWFsCisgIH5DaGFubmVsU3RhdHVzUHVibGlzaGVyRml4dHVyZSgpCisgIHsKKyAgfQorCisgIC8vIHZpcnR1YWwgc2hhcmVkX3B0cjxEdW1teVByb3RvY29sRmFjdG9yeT4KKyAgLy8gYWRkUHJvdG9jb2xGYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b2NvbCkKKyAgLy8geworICAvLyAgIHNoYXJlZF9wdHI8RHVtbXlQcm90b2NvbEZhY3Rvcnk+IGZhY3RvcnkobWFrZV9zaGFyZWQ8RHVtbXlQcm90b2NvbEZhY3Rvcnk+KCkpOworICAvLyAgIG1fZmFjdG9yaWVzW3Byb3RvY29sXSA9IGZhY3Rvcnk7CisKKyAgLy8gICByZXR1cm4gZmFjdG9yeTsKKyAgLy8gfQorCisgIHZvaWQKKyAgdmFsaWRhdGVQdWJsaXNoKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBCbG9jayBwYXlsb2FkID0gZGF0YS5nZXRDb250ZW50KCk7CisKKyAgICBtX2J1ZmZlci5hcHBlbmRCeXRlQXJyYXkocGF5bG9hZC52YWx1ZSgpLCBwYXlsb2FkLnZhbHVlX3NpemUoKSk7CisKKyAgICBCT09TVF9DSEVDS19OT19USFJPVyhkYXRhLmdldE5hbWUoKVstMV0udG9TZWdtZW50KCkpOworICAgIGlmIChkYXRhLmdldEZpbmFsQmxvY2tJZCgpICE9IGRhdGEuZ2V0TmFtZSgpWy0xXSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgLy8gd3JhcCB0aGUgQ2hhbm5lbCBTdGF0dXMgZW50cmllcyBpbiBhIHNpbmdsZSBDb250ZW50IFRMViBmb3IgZWFzeSBwYXJzaW5nCisgICAgbV9idWZmZXIucHJlcGVuZFZhck51bWJlcihtX2J1ZmZlci5zaXplKCkpOworICAgIG1fYnVmZmVyLnByZXBlbmRWYXJOdW1iZXIodGx2OjpDb250ZW50KTsKKworICAgIG5kbjo6QmxvY2sgcGFyc2VyKG1fYnVmZmVyLmJ1ZigpLCBtX2J1ZmZlci5zaXplKCkpOworICAgIHBhcnNlci5wYXJzZSgpOworCisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChwYXJzZXIuZWxlbWVudHNfc2l6ZSgpLCBtX2V4cGVjdGVkRW50cmllcy5zaXplKCkpOworCisgICAgZm9yIChCbG9jazo6ZWxlbWVudF9jb25zdF9pdGVyYXRvciBpID0gcGFyc2VyLmVsZW1lbnRzX2JlZ2luKCk7CisgICAgICAgICBpICE9IHBhcnNlci5lbGVtZW50c19lbmQoKTsKKyAgICAgICAgICsraSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGktPnR5cGUoKSAhPSBuZG46OnRsdjo6bmZkOjpDaGFubmVsU3RhdHVzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoImV4cGVjdGVkIENoYW5uZWxTdGF0dXMsIGdvdCB0eXBlICMiIDw8IGktPnR5cGUoKSk7CisgICAgICAgICAgfQorCisgICAgICAgIG5kbjo6bmZkOjpDaGFubmVsU3RhdHVzIGVudHJ5KCppKTsKKworICAgICAgICBORkRfTE9HX0RFQlVHKCJsb29raW5nIGZvciBjaGFubmVsc3RhdHVzICIgPDwgZW50cnkuZ2V0TG9jYWxVcmkoKSk7CisKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIG5kbjo6bmZkOjpDaGFubmVsU3RhdHVzPjo6Y29uc3RfaXRlcmF0b3IgZXhwZWN0ZWRFbnRyeVBvcyA9CisgICAgICAgICAgbV9leHBlY3RlZEVudHJpZXMuZmluZChlbnRyeS5nZXRMb2NhbFVyaSgpKTsKKworICAgICAgICBCT09TVF9SRVFVSVJFKGV4cGVjdGVkRW50cnlQb3MgIT0gbV9leHBlY3RlZEVudHJpZXMuZW5kKCkpOworICAgICAgICBjb25zdCBuZG46Om5mZDo6Q2hhbm5lbFN0YXR1cyYgZXhwZWN0ZWRFbnRyeSA9IGV4cGVjdGVkRW50cnlQb3MtPnNlY29uZDsKKworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS5nZXRMb2NhbFVyaSgpLCBleHBlY3RlZEVudHJ5LmdldExvY2FsVXJpKCkpOworCisgICAgICAgIG1fbWF0Y2hlZEVudHJpZXMuaW5zZXJ0KGVudHJ5LmdldExvY2FsVXJpKCkpOworICAgICAgfQorCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9tYXRjaGVkRW50cmllcy5zaXplKCksIG1fZXhwZWN0ZWRFbnRyaWVzLnNpemUoKSk7CisKKyAgICBtX2ZpbmlzaGVkID0gdHJ1ZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIENoYW5uZWxTdGF0dXNQdWJsaXNoZXI6OkZhY3RvcnlNYXAgbV9mYWN0b3JpZXM7CisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBtX2ZhY2U7CisgIENoYW5uZWxTdGF0dXNQdWJsaXNoZXIgbV9wdWJsaXNoZXI7CisKKyAgbmRuOjpFbmNvZGluZ0J1ZmZlciBtX2J1ZmZlcjsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgbmRuOjpuZmQ6OkNoYW5uZWxTdGF0dXM+IG1fZXhwZWN0ZWRFbnRyaWVzOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbV9tYXRjaGVkRW50cmllczsKKworICBib29sIG1fZmluaXNoZWQ7CisKKyAgbmRuOjpLZXlDaGFpbiBtX2tleUNoYWluOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKE1nbXRDaGFubmVsU3RhdHVzUHVibGlzaGVyLCBDaGFubmVsU3RhdHVzUHVibGlzaGVyRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoUHVibGlzaCkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcHJvdG9jb2wgPSAiZHVtbXkiOworCisgIHNoYXJlZF9wdHI8RHVtbXlQcm90b2NvbEZhY3Rvcnk+IGZhY3RvcnkobWFrZV9zaGFyZWQ8RHVtbXlQcm90b2NvbEZhY3Rvcnk+KCkpOworICBtX2ZhY3Rvcmllc1twcm90b2NvbF0gPSBmYWN0b3J5OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyB1cmkgPSBwcm90b2NvbCArICI6Ly9wYXRoIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGkpOworICAgICAgZmFjdG9yeS0+YWRkQ2hhbm5lbCh1cmkpOworCisgICAgICBuZG46Om5mZDo6Q2hhbm5lbFN0YXR1cyBleHBlY3RlZEVudHJ5OworICAgICAgZXhwZWN0ZWRFbnRyeS5zZXRMb2NhbFVyaShEdW1teUNoYW5uZWwodXJpKS5nZXRVcmkoKS50b1N0cmluZygpKTsKKworICAgICAgbV9leHBlY3RlZEVudHJpZXNbZXhwZWN0ZWRFbnRyeS5nZXRMb2NhbFVyaSgpXSA9IGV4cGVjdGVkRW50cnk7CisgICAgfQorCisgIG1fZmFjZS0+b25SZWNlaXZlRGF0YSArPQorICAgIGJpbmQoJkNoYW5uZWxTdGF0dXNQdWJsaXNoZXJGaXh0dXJlOjp2YWxpZGF0ZVB1Ymxpc2gsIHRoaXMsIF8xKTsKKworICBtX3B1Ymxpc2hlci5wdWJsaXNoKCk7CisgIEJPT1NUX1JFUVVJUkUobV9maW5pc2hlZCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKER1cGxpY2F0ZUZhY3RvcmllcykKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcHJvdG9jb2wxID0gImR1bW15MSI7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHByb3RvY29sMiA9ICJkdW1teTIiOworCisgIHNoYXJlZF9wdHI8RHVtbXlQcm90b2NvbEZhY3Rvcnk+IGZhY3RvcnkobWFrZV9zaGFyZWQ8RHVtbXlQcm90b2NvbEZhY3Rvcnk+KCkpOworICBtX2ZhY3Rvcmllc1twcm90b2NvbDFdID0gZmFjdG9yeTsKKyAgbV9mYWN0b3JpZXNbcHJvdG9jb2wyXSA9IGZhY3Rvcnk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQorICAgIHsKKyAgICAgIG5kbjo6bmZkOjpDaGFubmVsU3RhdHVzIGV4cGVjdGVkRW50cnk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyB1cmkgPSBwcm90b2NvbDEgKyAiOi8vcGF0aCIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihpKTsKKworICAgICAgZmFjdG9yeS0+YWRkQ2hhbm5lbCh1cmkpOworCisgICAgICBleHBlY3RlZEVudHJ5LnNldExvY2FsVXJpKER1bW15Q2hhbm5lbCh1cmkpLmdldFVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgbV9leHBlY3RlZEVudHJpZXNbZXhwZWN0ZWRFbnRyeS5nZXRMb2NhbFVyaSgpXSA9IGV4cGVjdGVkRW50cnk7CisgICAgfQorCisgIG1fZmFjZS0+b25SZWNlaXZlRGF0YSArPQorICAgIGJpbmQoJkNoYW5uZWxTdGF0dXNQdWJsaXNoZXJGaXh0dXJlOjp2YWxpZGF0ZVB1Ymxpc2gsIHRoaXMsIF8xKTsKKworICBtX3B1Ymxpc2hlci5wdWJsaXNoKCk7CisgIEJPT1NUX1JFUVVJUkUobV9maW5pc2hlZCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworCisKKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvY29tbWFuZC12YWxpZGF0b3IuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2NvbW1hbmQtdmFsaWRhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzMyYTZlCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2NvbW1hbmQtdmFsaWRhdG9yLmNwcApAQCAtMCwwICsxLDY1NyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgIm1nbXQvY29tbWFuZC12YWxpZGF0b3IuaHBwIgorI2luY2x1ZGUgImNvcmUvY29uZmlnLWZpbGUuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2NvbW1hbmQtaW50ZXJlc3QtZ2VuZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvaW8uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKK25hbWVzcGFjZSBuZmQgeworCituYW1lc3BhY2UgdGVzdHMgeworCitORkRfTE9HX0lOSVQoIkNvbW1hbmRWYWxpZGF0b3JUZXN0Iik7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShNZ210Q29tbWFuZFZhbGlkYXRvciwgQmFzZUZpeHR1cmUpCisKKy8vIGF1dGhvcml6YXRpb25zCisvLyB7CisvLyAgIGF1dGhvcml6ZQorLy8gICB7CisvLyAgICAgY2VydGZpbGUgInRlc3RzL2RhZW1vbi9tZ210L2NlcnQxLm5kbmNlcnQiCisvLyAgICAgcHJpdmlsZWdlcworLy8gICAgIHsKKy8vICAgICAgIGZpYgorLy8gICAgICAgc3RhdHMKKy8vICAgICB9CisvLyAgIH0KKworLy8gICBhdXRob3JpemUKKy8vICAgeworLy8gICAgIGNlcnRmaWxlICJ0ZXN0cy9kYWVtb24vbWdtdC9jZXJ0Mi5uZG5jZXJ0IgorLy8gICAgIHByaXZpbGVnZXMKKy8vICAgICB7CisvLyAgICAgICBmYWNlcworLy8gICAgIH0KKy8vICAgfQorLy8gfQorCitjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorImF1dGhvcml6YXRpb25zXG4iCisie1xuIgorIiAgYXV0aG9yaXplXG4iCisiICB7XG4iCisiICAgIGNlcnRmaWxlIFwidGVzdHMvZGFlbW9uL21nbXQvY2VydDEubmRuY2VydFwiXG4iCisiICAgIHByaXZpbGVnZXNcbiIKKyIgICAge1xuIgorIiAgICAgIGZpYlxuIgorIiAgICAgIHN0YXRzXG4iCisiICAgIH1cbiIKKyIgIH1cbiIKKyIgIGF1dGhvcml6ZVxuIgorIiAge1xuIgorIiAgICBjZXJ0ZmlsZSBcInRlc3RzL2RhZW1vbi9tZ210L2NlcnQyLm5kbmNlcnRcIlxuIgorIiAgICBwcml2aWxlZ2VzXG4iCisiICAgIHtcbiIKKyIgICAgICBmYWNlc1xuIgorIiAgICB9XG4iCisiICB9XG4iCisgICJ9XG4iOworCitjb25zdCBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBDT05GSUdfUEFUSCA9CisgIGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKSAvPSBzdGQ6OnN0cmluZygidW5pdC10ZXN0LW5mZC5jb25mIik7CisKK2NsYXNzIENvbW1hbmRWYWxpZGF0b3JUZXN0ZXIKK3sKK3B1YmxpYzoKKworICBDb21tYW5kVmFsaWRhdG9yVGVzdGVyKCkKKyAgICA6IG1fdmFsaWRhdGVkKGZhbHNlKSwKKyAgICAgIG1fdmFsaWRhdGlvbkZhaWxlZChmYWxzZSkKKyAgeworCisgIH0KKworICB2b2lkCisgIGdlbmVyYXRlSWRlbnRpdHkoY29uc3QgTmFtZSYgcHJlZml4KQorICB7CisgICAgbV9pZGVudGl0eU5hbWUgPSBwcmVmaXg7CisgICAgbV9pZGVudGl0eU5hbWUuYXBwZW5kVmVyc2lvbigpOworCisgICAgY29uc3QgTmFtZSBjZXJ0TmFtZSA9IG1fa2V5cy5jcmVhdGVJZGVudGl0eShtX2lkZW50aXR5TmFtZSk7CisKKyAgICBtX2NlcnRpZmljYXRlID0gbV9rZXlzLmdldENlcnRpZmljYXRlKGNlcnROYW1lKTsKKyAgfQorCisgIHZvaWQKKyAgc2F2ZUlkZW50aXR5VG9GaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKQorICB7CisgICAgc3RkOjpvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZW5hbWUpOworCisgICAgQk9PU1RfUkVRVUlSRShvdXQuaXNfb3BlbigpKTsKKyAgICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KG1fY2VydGlmaWNhdGUpKTsKKworICAgIG5kbjo6aW86OnNhdmU8bmRuOjpJZGVudGl0eUNlcnRpZmljYXRlPigqbV9jZXJ0aWZpY2F0ZSwgb3V0KTsKKworICAgIG91dC5jbG9zZSgpOworICB9CisKKyAgY29uc3QgTmFtZSYKKyAgZ2V0SWRlbnRpdHlOYW1lKCkgY29uc3QKKyAgeworICAgIEJPT1NUX1JFUVVJUkVfTkUobV9pZGVudGl0eU5hbWUsIE5hbWUoKSk7CisgICAgcmV0dXJuIG1faWRlbnRpdHlOYW1lOworICB9CisKKyAgY29uc3QgTmFtZSYKKyAgZ2V0UHVibGljS2V5TmFtZSgpIGNvbnN0CisgIHsKKyAgICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KG1fY2VydGlmaWNhdGUpKTsKKyAgICByZXR1cm4gbV9jZXJ0aWZpY2F0ZS0+Z2V0UHVibGljS2V5TmFtZSgpOworICB9CisKKyAgdm9pZAorICBvblZhbGlkYXRlZChjb25zdCBzaGFyZWRfcHRyPGNvbnN0IEludGVyZXN0PiYgaW50ZXJlc3QpCisgIHsKKyAgICAvLyBORkRfTE9HX0RFQlVHKCJ2YWxpZGF0ZWQgY29tbWFuZCIpOworICAgIG1fdmFsaWRhdGVkID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQKKyAgb25WYWxpZGF0aW9uRmFpbGVkKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgSW50ZXJlc3Q+JiBpbnRlcmVzdCwgY29uc3Qgc3RkOjpzdHJpbmcmIGluZm8pCisgIHsKKyAgICBORkRfTE9HX0RFQlVHKCJ2YWxpZGF0aW9uIGZhaWxlZDogIiA8PCBpbmZvKTsKKyAgICBtX3ZhbGlkYXRpb25GYWlsZWQgPSB0cnVlOworICB9CisKKyAgYm9vbAorICBjb21tYW5kVmFsaWRhdGVkKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX3ZhbGlkYXRlZDsKKyAgfQorCisgIGJvb2wKKyAgY29tbWFuZFZhbGlkYXRpb25GYWlsZWQoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fdmFsaWRhdGlvbkZhaWxlZDsKKyAgfQorCisgIHZvaWQKKyAgcmVzZXRWYWxpZGF0aW9uKCkKKyAgeworICAgIG1fdmFsaWRhdGVkID0gZmFsc2U7CisgICAgbV92YWxpZGF0aW9uRmFpbGVkID0gZmFsc2U7CisgIH0KKworICB+Q29tbWFuZFZhbGlkYXRvclRlc3RlcigpCisgIHsKKyAgICBtX2tleXMuZGVsZXRlSWRlbnRpdHkobV9pZGVudGl0eU5hbWUpOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgbV92YWxpZGF0ZWQ7CisgIGJvb2wgbV92YWxpZGF0aW9uRmFpbGVkOworCisgIG5kbjo6S2V5Q2hhaW4gbV9rZXlzOworICBOYW1lIG1faWRlbnRpdHlOYW1lOworICBzaGFyZWRfcHRyPG5kbjo6SWRlbnRpdHlDZXJ0aWZpY2F0ZT4gbV9jZXJ0aWZpY2F0ZTsKK307CisKK2NsYXNzIFR3b1ZhbGlkYXRvckZpeHR1cmUgOiBwdWJsaWMgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgVHdvVmFsaWRhdG9yRml4dHVyZSgpCisgIHsKKyAgICBtX3Rlc3RlcjEuZ2VuZXJhdGVJZGVudGl0eSgiL3Rlc3QvQ29tbWFuZFZhbGlkYXRvci9Ud29LZXlzL2lkMSIpOworICAgIG1fdGVzdGVyMS5zYXZlSWRlbnRpdHlUb0ZpbGUoInRlc3RzL2RhZW1vbi9tZ210L2NlcnQxLm5kbmNlcnQiKTsKKworICAgIG1fdGVzdGVyMi5nZW5lcmF0ZUlkZW50aXR5KCIvdGVzdC9Db21tYW5kVmFsaWRhdG9yL1R3b0tleXMvaWQyIik7CisgICAgbV90ZXN0ZXIyLnNhdmVJZGVudGl0eVRvRmlsZSgidGVzdHMvZGFlbW9uL21nbXQvY2VydDIubmRuY2VydCIpOworICB9CisKKyAgflR3b1ZhbGlkYXRvckZpeHR1cmUoKQorICB7CisgICAgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlcnJvcjsKKyAgICBib29zdDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKCJ0ZXN0cy9kYWVtb24vbWdtdC9jZXJ0MS5uZG5jZXJ0IiwgZXJyb3IpOworICAgIGJvb3N0OjpmaWxlc3lzdGVtOjpyZW1vdmUoInRlc3RzL2RhZW1vbi9tZ210L2NlcnQyLm5kbmNlcnQiLCBlcnJvcik7CisgIH0KKworcHJvdGVjdGVkOgorICBDb21tYW5kVmFsaWRhdG9yVGVzdGVyIG1fdGVzdGVyMTsKKyAgQ29tbWFuZFZhbGlkYXRvclRlc3RlciBtX3Rlc3RlcjI7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShUd29LZXlzLCBUd29WYWxpZGF0b3JGaXh0dXJlKQoreworICBzaGFyZWRfcHRyPEludGVyZXN0PiBmaWJDb21tYW5kID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvbG9jYWxob3N0L25mZC9maWIvaW5zZXJ0Iik7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IHN0YXRzQ29tbWFuZCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigiL2xvY2FsaG9zdC9uZmQvc3RhdHMvZG9zb21ldGhpbmciKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gZmFjZXNDb21tYW5kID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvbG9jYWxob3N0L25mZC9mYWNlcy9jcmVhdGUiKTsKKworICBuZG46OkNvbW1hbmRJbnRlcmVzdEdlbmVyYXRvciBnZW5lcmF0b3I7CisgIGdlbmVyYXRvci5nZW5lcmF0ZVdpdGhJZGVudGl0eSgqZmliQ29tbWFuZCwgbV90ZXN0ZXIxLmdldElkZW50aXR5TmFtZSgpKTsKKyAgZ2VuZXJhdG9yLmdlbmVyYXRlV2l0aElkZW50aXR5KCpzdGF0c0NvbW1hbmQsIG1fdGVzdGVyMS5nZXRJZGVudGl0eU5hbWUoKSk7CisgIGdlbmVyYXRvci5nZW5lcmF0ZVdpdGhJZGVudGl0eSgqZmFjZXNDb21tYW5kLCBtX3Rlc3RlcjIuZ2V0SWRlbnRpdHlOYW1lKCkpOworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBDb21tYW5kVmFsaWRhdG9yIHZhbGlkYXRvcjsKKyAgdmFsaWRhdG9yLmFkZFN1cHBvcnRlZFByaXZpbGVnZSgiZmFjZXMiKTsKKyAgdmFsaWRhdG9yLmFkZFN1cHBvcnRlZFByaXZpbGVnZSgiZmliIik7CisgIHZhbGlkYXRvci5hZGRTdXBwb3J0ZWRQcml2aWxlZ2UoInN0YXRzIik7CisKKyAgdmFsaWRhdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICBjb25maWcucGFyc2UoQ09ORklHLCBmYWxzZSwgQ09ORklHX1BBVEgubmF0aXZlKCkpOworCisgIHZhbGlkYXRvci52YWxpZGF0ZSgqZmliQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGVkLCAmbV90ZXN0ZXIxLCBfMSksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZDb21tYW5kVmFsaWRhdG9yVGVzdGVyOjpvblZhbGlkYXRpb25GYWlsZWQsICZtX3Rlc3RlcjEsIF8xLCBfMikpOworCisgIEJPT1NUX1JFUVVJUkUobV90ZXN0ZXIxLmNvbW1hbmRWYWxpZGF0ZWQoKSk7CisgIG1fdGVzdGVyMS5yZXNldFZhbGlkYXRpb24oKTsKKworICB2YWxpZGF0b3IudmFsaWRhdGUoKnN0YXRzQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGVkLCAmbV90ZXN0ZXIxLCBfMSksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZDb21tYW5kVmFsaWRhdG9yVGVzdGVyOjpvblZhbGlkYXRpb25GYWlsZWQsICZtX3Rlc3RlcjEsIF8xLCBfMikpOworCisgIEJPT1NUX1JFUVVJUkUobV90ZXN0ZXIxLmNvbW1hbmRWYWxpZGF0ZWQoKSk7CisKKyAgdmFsaWRhdG9yLnZhbGlkYXRlKCpmYWNlc0NvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZDb21tYW5kVmFsaWRhdG9yVGVzdGVyOjpvblZhbGlkYXRlZCwgJm1fdGVzdGVyMiwgXzEpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0aW9uRmFpbGVkLCAmbV90ZXN0ZXIyLCBfMSwgXzIpKTsKKworICBCT09TVF9SRVFVSVJFKG1fdGVzdGVyMi5jb21tYW5kVmFsaWRhdGVkKCkpOworICBtX3Rlc3RlcjIucmVzZXRWYWxpZGF0aW9uKCk7CisKKyAgLy8gdXNlIGNlcnQyIGZvciBmaWIgY29tbWFuZCAoYXV0aG9yaXplZCBmb3IgY2VydDEgb25seSkKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gdW5hdXRob3JpemVkRmliQ29tbWFuZCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigiL2xvY2FsaG9zdC9uZmQvZmliL2luc2VydCIpOworICBnZW5lcmF0b3IuZ2VuZXJhdGVXaXRoSWRlbnRpdHkoKnVuYXV0aG9yaXplZEZpYkNvbW1hbmQsIG1fdGVzdGVyMi5nZXRJZGVudGl0eU5hbWUoKSk7CisKKyAgdmFsaWRhdG9yLnZhbGlkYXRlKCp1bmF1dGhvcml6ZWRGaWJDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0ZWQsICZtX3Rlc3RlcjIsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGlvbkZhaWxlZCwgJm1fdGVzdGVyMiwgXzEsIF8yKSk7CisKKyAgQk9PU1RfUkVRVUlSRShtX3Rlc3RlcjIuY29tbWFuZFZhbGlkYXRpb25GYWlsZWQoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFR3b0tleXNEcnlSdW4sIFR3b1ZhbGlkYXRvckZpeHR1cmUpCit7CisgIENvbW1hbmRWYWxpZGF0b3JUZXN0ZXIgdGVzdGVyMTsKKyAgdGVzdGVyMS5nZW5lcmF0ZUlkZW50aXR5KCIvdGVzdC9Db21tYW5kVmFsaWRhdG9yL1R3b0tleXMvaWQxIik7CisgIHRlc3RlcjEuc2F2ZUlkZW50aXR5VG9GaWxlKCJ0ZXN0cy9kYWVtb24vbWdtdC9jZXJ0MS5uZG5jZXJ0Iik7CisKKyAgQ29tbWFuZFZhbGlkYXRvclRlc3RlciB0ZXN0ZXIyOworICB0ZXN0ZXIyLmdlbmVyYXRlSWRlbnRpdHkoIi90ZXN0L0NvbW1hbmRWYWxpZGF0b3IvVHdvS2V5cy9pZDIiKTsKKyAgdGVzdGVyMi5zYXZlSWRlbnRpdHlUb0ZpbGUoInRlc3RzL2RhZW1vbi9tZ210L2NlcnQyLm5kbmNlcnQiKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBmaWJDb21tYW5kID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvbG9jYWxob3N0L25mZC9maWIvaW5zZXJ0Iik7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IHN0YXRzQ29tbWFuZCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigiL2xvY2FsaG9zdC9uZmQvc3RhdHMvZG9zb21ldGhpbmciKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gZmFjZXNDb21tYW5kID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvbG9jYWxob3N0L25mZC9mYWNlcy9jcmVhdGUiKTsKKworICBuZG46OkNvbW1hbmRJbnRlcmVzdEdlbmVyYXRvciBnZW5lcmF0b3I7CisgIGdlbmVyYXRvci5nZW5lcmF0ZVdpdGhJZGVudGl0eSgqZmliQ29tbWFuZCwgbV90ZXN0ZXIxLmdldElkZW50aXR5TmFtZSgpKTsKKyAgZ2VuZXJhdG9yLmdlbmVyYXRlV2l0aElkZW50aXR5KCpzdGF0c0NvbW1hbmQsIG1fdGVzdGVyMS5nZXRJZGVudGl0eU5hbWUoKSk7CisgIGdlbmVyYXRvci5nZW5lcmF0ZVdpdGhJZGVudGl0eSgqZmFjZXNDb21tYW5kLCBtX3Rlc3RlcjIuZ2V0SWRlbnRpdHlOYW1lKCkpOworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBDb21tYW5kVmFsaWRhdG9yIHZhbGlkYXRvcjsKKyAgdmFsaWRhdG9yLmFkZFN1cHBvcnRlZFByaXZpbGVnZSgiZmFjZXMiKTsKKyAgdmFsaWRhdG9yLmFkZFN1cHBvcnRlZFByaXZpbGVnZSgiZmliIik7CisgIHZhbGlkYXRvci5hZGRTdXBwb3J0ZWRQcml2aWxlZ2UoInN0YXRzIik7CisKKyAgdmFsaWRhdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICBjb25maWcucGFyc2UoQ09ORklHLCB0cnVlLCBDT05GSUdfUEFUSC5uYXRpdmUoKSk7CisKKyAgdmFsaWRhdG9yLnZhbGlkYXRlKCpmaWJDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0ZWQsICZtX3Rlc3RlcjEsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGlvbkZhaWxlZCwgJm1fdGVzdGVyMSwgXzEsIF8yKSk7CisKKyAgQk9PU1RfUkVRVUlSRShtX3Rlc3RlcjEuY29tbWFuZFZhbGlkYXRpb25GYWlsZWQoKSk7CisgIG1fdGVzdGVyMS5yZXNldFZhbGlkYXRpb24oKTsKKworICB2YWxpZGF0b3IudmFsaWRhdGUoKnN0YXRzQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGVkLCAmbV90ZXN0ZXIxLCBfMSksCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZDb21tYW5kVmFsaWRhdG9yVGVzdGVyOjpvblZhbGlkYXRpb25GYWlsZWQsICZtX3Rlc3RlcjEsIF8xLCBfMikpOworCisgIEJPT1NUX1JFUVVJUkUobV90ZXN0ZXIxLmNvbW1hbmRWYWxpZGF0aW9uRmFpbGVkKCkpOworCisgIHZhbGlkYXRvci52YWxpZGF0ZSgqZmFjZXNDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0ZWQsICZtX3Rlc3RlcjIsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGlvbkZhaWxlZCwgJm1fdGVzdGVyMiwgXzEsIF8yKSk7CisKKyAgQk9PU1RfUkVRVUlSRShtX3Rlc3RlcjIuY29tbWFuZFZhbGlkYXRpb25GYWlsZWQoKSk7CisgIG1fdGVzdGVyMi5yZXNldFZhbGlkYXRpb24oKTsKKworICAvLyB1c2UgY2VydDIgZm9yIGZpYiBjb21tYW5kIChhdXRob3JpemVkIGZvciBjZXJ0MSBvbmx5KQorICBzaGFyZWRfcHRyPEludGVyZXN0PiB1bmF1dGhvcml6ZWRGaWJDb21tYW5kID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvbG9jYWxob3N0L25mZC9maWIvaW5zZXJ0Iik7CisgIGdlbmVyYXRvci5nZW5lcmF0ZVdpdGhJZGVudGl0eSgqdW5hdXRob3JpemVkRmliQ29tbWFuZCwgbV90ZXN0ZXIyLmdldElkZW50aXR5TmFtZSgpKTsKKworICB2YWxpZGF0b3IudmFsaWRhdGUoKnVuYXV0aG9yaXplZEZpYkNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZDb21tYW5kVmFsaWRhdG9yVGVzdGVyOjpvblZhbGlkYXRlZCwgJm1fdGVzdGVyMiwgXzEpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0aW9uRmFpbGVkLCAmbV90ZXN0ZXIyLCBfMSwgXzIpKTsKKworICBCT09TVF9SRVFVSVJFKG1fdGVzdGVyMi5jb21tYW5kVmFsaWRhdGlvbkZhaWxlZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9BdXRob3JpemVTZWN0aW9ucykKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgTk9fQVVUSE9SSVpFX0NPTkZJRyA9CisgICAgImF1dGhvcml6YXRpb25zXG4iCisgICAgIntcbiIKKyAgICAifVxuIjsKKworICBDb25maWdGaWxlIGNvbmZpZzsKKyAgQ29tbWFuZFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKyAgdmFsaWRhdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coY29uZmlnLnBhcnNlKE5PX0FVVEhPUklaRV9DT05GSUcsIGZhbHNlLCBDT05GSUdfUEFUSC5uYXRpdmUoKSksIENvbmZpZ0ZpbGU6OkVycm9yKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9Qcml2aWxlZ2VzU2VjdGlvbnMpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIE5PX1BSSVZJTEVHRVNfQ09ORklHID0KKyAgICAiYXV0aG9yaXphdGlvbnNcbiIKKyAgICAie1xuIgorICAgICIgIGF1dGhvcml6ZVxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIGNlcnRmaWxlIFwidGVzdHMvZGFlbW9uL21nbXQvY2VydDEubmRuY2VydFwiXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBDb21tYW5kVmFsaWRhdG9yIHZhbGlkYXRvcjsKKworICB2YWxpZGF0b3Iuc2V0Q29uZmlnRmlsZShjb25maWcpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKGNvbmZpZy5wYXJzZShOT19QUklWSUxFR0VTX0NPTkZJRywgZmFsc2UsIENPTkZJR19QQVRILm5hdGl2ZSgpKSwgQ29uZmlnRmlsZTo6RXJyb3IpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJbnZhbGlkQ2VydGZpbGUpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIElOVkFMSURfQ0VSVF9DT05GSUcgPQorICAgICJhdXRob3JpemF0aW9uc1xuIgorICAgICJ7XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgICAgY2VydGZpbGUgXCJ0ZXN0cy9kYWVtb24vbWdtdC9ub3RhY2VydGZpbGUubmRuY2VydFwiXG4iCisgICAgIiAgICBwcml2aWxlZ2VzXG4iCisgICAgIiAgICB7XG4iCisgICAgIiAgICAgIGZpYlxuIgorICAgICIgICAgICBzdGF0c1xuIgorICAgICIgICAgfVxuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKworICBDb25maWdGaWxlIGNvbmZpZzsKKyAgQ29tbWFuZFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKyAgdmFsaWRhdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coY29uZmlnLnBhcnNlKElOVkFMSURfQ0VSVF9DT05GSUcsIGZhbHNlLCBDT05GSUdfUEFUSC5uYXRpdmUoKSksIENvbmZpZ0ZpbGU6OkVycm9yKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9DZXJ0ZmlsZSkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgTk9fQ0VSVF9DT05GSUcgPQorICAgICJhdXRob3JpemF0aW9uc1xuIgorICAgICJ7XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgICAgcHJpdmlsZWdlc1xuIgorICAgICIgICAge1xuIgorICAgICIgICAgICBmaWJcbiIKKyAgICAiICAgICAgc3RhdHNcbiIKKyAgICAiICAgIH1cbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisKKworICBDb25maWdGaWxlIGNvbmZpZzsKKyAgQ29tbWFuZFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKyAgdmFsaWRhdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coY29uZmlnLnBhcnNlKE5PX0NFUlRfQ09ORklHLCBmYWxzZSwgQ09ORklHX1BBVEgubmF0aXZlKCkpLCBDb25maWdGaWxlOjpFcnJvcik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1hbGZvcm1lZENlcnQpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgTUFMRk9STUVEX0NFUlRfQ09ORklHID0KKyAgICAiYXV0aG9yaXphdGlvbnNcbiIKKyAgICAie1xuIgorICAgICIgIGF1dGhvcml6ZVxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIGNlcnRmaWxlIFwidGVzdHMvZGFlbW9uL21nbXQvbWFsZm9ybWVkLm5kbmNlcnRcIlxuIgorICAgICIgICAgcHJpdmlsZWdlc1xuIgorICAgICIgICAge1xuIgorICAgICIgICAgICBmaWJcbiIKKyAgICAiICAgICAgc3RhdHNcbiIKKyAgICAiICAgIH1cbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisKKworICBDb25maWdGaWxlIGNvbmZpZzsKKyAgQ29tbWFuZFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKyAgdmFsaWRhdG9yLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coY29uZmlnLnBhcnNlKE1BTEZPUk1FRF9DRVJUX0NPTkZJRywgZmFsc2UsIENPTkZJR19QQVRILm5hdGl2ZSgpKSwgQ29uZmlnRmlsZTo6RXJyb3IpOworfQorCitib29sCit2YWxpZGF0ZUVycm9yTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRNZXNzYWdlLCBjb25zdCBDb25maWdGaWxlOjpFcnJvciYgZXJyb3IpCit7CisgIGJvb2wgZ290RXhwZWN0ZWQgPSBlcnJvci53aGF0KCkgPT0gZXhwZWN0ZWRNZXNzYWdlOworICBpZiAoIWdvdEV4cGVjdGVkKQorICAgIHsKKyAgICAgIE5GRF9MT0dfV0FSTigiXG5jYXVnaHQgZXhjZXB0aW9uOiAiIDw8IGVycm9yLndoYXQoKQorICAgICAgICAgICAgICAgICAgICA8PCAiXG5cbmV4cGVjdGVkIGV4Y2VwdGlvbjogIiA8PCBleHBlY3RlZE1lc3NhZ2UpOworICAgIH0KKyAgcmV0dXJuIGdvdEV4cGVjdGVkOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShOb0F1dGhvcml6ZVNlY3Rpb25zRHJ5UnVuKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBOT19BVVRIT1JJWkVfQ09ORklHID0KKyAgICAiYXV0aG9yaXphdGlvbnNcbiIKKyAgICAie1xuIgorICAgICJ9XG4iOworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBDb21tYW5kVmFsaWRhdG9yIHZhbGlkYXRvcjsKKworICB2YWxpZGF0b3Iuc2V0Q29uZmlnRmlsZShjb25maWcpOworICBCT09TVF9DSEVDS19FWENFUFRJT04oY29uZmlnLnBhcnNlKE5PX0FVVEhPUklaRV9DT05GSUcsIHRydWUsIENPTkZJR19QQVRILm5hdGl2ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmdmFsaWRhdGVFcnJvck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBhdXRob3JpemUgc2VjdGlvbnMgZm91bmQiLCBfMSkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShOb1ByaXZpbGVnZXNTZWN0aW9uc0RyeVJ1biwgVHdvVmFsaWRhdG9yRml4dHVyZSkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgTk9fUFJJVklMRUdFU19DT05GSUcgPQorICAgICJhdXRob3JpemF0aW9uc1xuIgorICAgICJ7XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgICAgY2VydGZpbGUgXCJ0ZXN0cy9kYWVtb24vbWdtdC9jZXJ0MS5uZG5jZXJ0XCJcbiIKKyAgICAiICB9XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgICAgY2VydGZpbGUgXCJ0ZXN0cy9kYWVtb24vbWdtdC9jZXJ0Mi5uZG5jZXJ0XCJcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisKKyAgQ29uZmlnRmlsZSBjb25maWc7CisgIENvbW1hbmRWYWxpZGF0b3IgdmFsaWRhdG9yOworCisgIHZhbGlkYXRvci5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gZXhwZWN0ZWRFcnJvcjsKKyAgZXhwZWN0ZWRFcnJvciA8PCAiTm8gcHJpdmlsZWdlcyBzZWN0aW9uIGZvdW5kIGZvciBjZXJ0aWZpY2F0ZSBmaWxlIHRlc3RzL2RhZW1vbi9tZ210L2NlcnQxLm5kbmNlcnQgIgorICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBtX3Rlc3RlcjEuZ2V0UHVibGljS2V5TmFtZSgpLnRvVXJpKCkgPDwgIilcbiIKKyAgICAgICAgICAgICAgICA8PCAiTm8gcHJpdmlsZWdlcyBzZWN0aW9uIGZvdW5kIGZvciBjZXJ0aWZpY2F0ZSBmaWxlIHRlc3RzL2RhZW1vbi9tZ210L2NlcnQyLm5kbmNlcnQgIgorICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBtX3Rlc3RlcjIuZ2V0UHVibGljS2V5TmFtZSgpLnRvVXJpKCkgPDwgIikiOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihjb25maWcucGFyc2UoTk9fUFJJVklMRUdFU19DT05GSUcsIHRydWUsIENPTkZJR19QQVRILm5hdGl2ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmdmFsaWRhdGVFcnJvck1lc3NhZ2UsIGV4cGVjdGVkRXJyb3Iuc3RyKCksIF8xKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEludmFsaWRDZXJ0ZmlsZURyeVJ1bikKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpmaWxlc3lzdGVtOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIElOVkFMSURfS0VZX0NPTkZJRyA9CisgICAgImF1dGhvcml6YXRpb25zXG4iCisgICAgIntcbiIKKyAgICAiICBhdXRob3JpemVcbiIKKyAgICAiICB7XG4iCisgICAgIiAgICBjZXJ0ZmlsZSBcInRlc3RzL2RhZW1vbi9tZ210L25vdGFjZXJ0ZmlsZS5uZG5jZXJ0XCJcbiIKKyAgICAiICAgIHByaXZpbGVnZXNcbiIKKyAgICAiICAgIHtcbiIKKyAgICAiICAgICAgZmliXG4iCisgICAgIiAgICAgIHN0YXRzXG4iCisgICAgIiAgICB9XG4iCisgICAgIiAgfVxuIgorICAgICIgIGF1dGhvcml6ZVxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIGNlcnRmaWxlIFwidGVzdHMvZGFlbW9uL21nbXQvc3RpbGxub3RhY2VydGZpbGUubmRuY2VydFwiXG4iCisgICAgIiAgICBwcml2aWxlZ2VzXG4iCisgICAgIiAgICB7XG4iCisgICAgIiAgICB9XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBDb21tYW5kVmFsaWRhdG9yIHZhbGlkYXRvcjsKKworICB2YWxpZGF0b3Iuc2V0Q29uZmlnRmlsZShjb25maWcpOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yOworICBlcnJvciA8PCAiVW5hYmxlIHRvIG9wZW4gY2VydGlmaWNhdGUgZmlsZSAiCisgICAgICAgIDw8IGFic29sdXRlKCJ0ZXN0cy9kYWVtb24vbWdtdC9ub3RhY2VydGZpbGUubmRuY2VydCIpLm5hdGl2ZSgpIDw8ICJcbiIKKyAgICAgICAgPDwgIlVuYWJsZSB0byBvcGVuIGNlcnRpZmljYXRlIGZpbGUgIgorICAgICAgICA8PCBhYnNvbHV0ZSgidGVzdHMvZGFlbW9uL21nbXQvc3RpbGxub3RhY2VydGZpbGUubmRuY2VydCIpLm5hdGl2ZSgpOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihjb25maWcucGFyc2UoSU5WQUxJRF9LRVlfQ09ORklHLCB0cnVlLCBDT05GSUdfUEFUSC5uYXRpdmUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJnZhbGlkYXRlRXJyb3JNZXNzYWdlLCBlcnJvci5zdHIoKSwgXzEpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9DZXJ0ZmlsZURyeVJ1bikKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgTk9fQ0VSVF9DT05GSUcgPQorICAgICJhdXRob3JpemF0aW9uc1xuIgorICAgICJ7XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgICAgcHJpdmlsZWdlc1xuIgorICAgICIgICAge1xuIgorICAgICIgICAgICBmaWJcbiIKKyAgICAiICAgICAgc3RhdHNcbiIKKyAgICAiICAgIH1cbiIKKyAgICAiICB9XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKworCisgIENvbmZpZ0ZpbGUgY29uZmlnOworICBDb21tYW5kVmFsaWRhdG9yIHZhbGlkYXRvcjsKKworICB2YWxpZGF0b3Iuc2V0Q29uZmlnRmlsZShjb25maWcpOworICBCT09TVF9DSEVDS19FWENFUFRJT04oY29uZmlnLnBhcnNlKE5PX0NFUlRfQ09ORklHLCB0cnVlLCBDT05GSUdfUEFUSC5uYXRpdmUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJnZhbGlkYXRlRXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY2VydGZpbGUgc3BlY2lmaWVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjZXJ0ZmlsZSBzcGVjaWZpZWQiLCBfMSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNYWxmb3JtZWRDZXJ0RHJ5UnVuKQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmZpbGVzeXN0ZW07CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgTUFMRk9STUVEX0NFUlRfQ09ORklHID0KKyAgICAiYXV0aG9yaXphdGlvbnNcbiIKKyAgICAie1xuIgorICAgICIgIGF1dGhvcml6ZVxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIGNlcnRmaWxlIFwidGVzdHMvZGFlbW9uL21nbXQvbWFsZm9ybWVkLm5kbmNlcnRcIlxuIgorICAgICIgICAgcHJpdmlsZWdlc1xuIgorICAgICIgICAge1xuIgorICAgICIgICAgICBmaWJcbiIKKyAgICAiICAgICAgc3RhdHNcbiIKKyAgICAiICAgIH1cbiIKKyAgICAiICB9XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgICAgY2VydGZpbGUgXCJ0ZXN0cy9kYWVtb24vbWdtdC9tYWxmb3JtZWQubmRuY2VydFwiXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworCisKKyAgQ29uZmlnRmlsZSBjb25maWc7CisgIENvbW1hbmRWYWxpZGF0b3IgdmFsaWRhdG9yOworCisgIHZhbGlkYXRvci5zZXRDb25maWdGaWxlKGNvbmZpZyk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3I7CisgIGVycm9yIDw8ICJNYWxmb3JtZWQgY2VydGlmaWNhdGUgZmlsZSAiCisgICAgICAgIDw8IGFic29sdXRlKCJ0ZXN0cy9kYWVtb24vbWdtdC9tYWxmb3JtZWQubmRuY2VydCIpLm5hdGl2ZSgpIDw8ICJcbiIKKyAgICAgICAgPDwgIk1hbGZvcm1lZCBjZXJ0aWZpY2F0ZSBmaWxlICIKKyAgICAgICAgPDwgYWJzb2x1dGUoInRlc3RzL2RhZW1vbi9tZ210L21hbGZvcm1lZC5uZG5jZXJ0IikubmF0aXZlKCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKGNvbmZpZy5wYXJzZShNQUxGT1JNRURfQ0VSVF9DT05GSUcsIHRydWUsIENPTkZJR19QQVRILm5hdGl2ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmdmFsaWRhdGVFcnJvck1lc3NhZ2UsIGVycm9yLnN0cigpLCBfMSkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShXaWxkY2FyZCwgVHdvVmFsaWRhdG9yRml4dHVyZSkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgV0lMRENBUkRfQ0VSVF9DT05GSUcgPQorICAgICJhdXRob3JpemF0aW9uc1xuIgorICAgICJ7XG4iCisgICAgIiAgYXV0aG9yaXplXG4iCisgICAgIiAge1xuIgorICAgICIgICAgY2VydGZpbGUgYW55XG4iCisgICAgIiAgICBwcml2aWxlZ2VzXG4iCisgICAgIiAgICB7XG4iCisgICAgIiAgICAgIGZhY2VzXG4iCisgICAgIiAgICAgIHN0YXRzXG4iCisgICAgIiAgICB9XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGZpYkNvbW1hbmQgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9sb2NhbGhvc3QvbmZkL2ZpYi9pbnNlcnQiKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gc3RhdHNDb21tYW5kID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvbG9jYWxob3N0L25mZC9zdGF0cy9kb3NvbWV0aGluZyIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBmYWNlc0NvbW1hbmQgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL2NyZWF0ZSIpOworCisgIG5kbjo6Q29tbWFuZEludGVyZXN0R2VuZXJhdG9yIGdlbmVyYXRvcjsKKyAgZ2VuZXJhdG9yLmdlbmVyYXRlV2l0aElkZW50aXR5KCpmaWJDb21tYW5kLCBtX3Rlc3RlcjEuZ2V0SWRlbnRpdHlOYW1lKCkpOworICBnZW5lcmF0b3IuZ2VuZXJhdGVXaXRoSWRlbnRpdHkoKnN0YXRzQ29tbWFuZCwgbV90ZXN0ZXIxLmdldElkZW50aXR5TmFtZSgpKTsKKyAgZ2VuZXJhdG9yLmdlbmVyYXRlV2l0aElkZW50aXR5KCpmYWNlc0NvbW1hbmQsIG1fdGVzdGVyMS5nZXRJZGVudGl0eU5hbWUoKSk7CisKKyAgQ29uZmlnRmlsZSBjb25maWc7CisgIENvbW1hbmRWYWxpZGF0b3IgdmFsaWRhdG9yOworICB2YWxpZGF0b3IuYWRkU3VwcG9ydGVkUHJpdmlsZWdlKCJmYWNlcyIpOworICB2YWxpZGF0b3IuYWRkU3VwcG9ydGVkUHJpdmlsZWdlKCJmaWIiKTsKKyAgdmFsaWRhdG9yLmFkZFN1cHBvcnRlZFByaXZpbGVnZSgic3RhdHMiKTsKKworICB2YWxpZGF0b3Iuc2V0Q29uZmlnRmlsZShjb25maWcpOworCisgIGNvbmZpZy5wYXJzZShXSUxEQ0FSRF9DRVJUX0NPTkZJRywgZmFsc2UsIENPTkZJR19QQVRILm5hdGl2ZSgpKTsKKworICB2YWxpZGF0b3IudmFsaWRhdGUoKmZpYkNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICBiaW5kKCZDb21tYW5kVmFsaWRhdG9yVGVzdGVyOjpvblZhbGlkYXRlZCwgJm1fdGVzdGVyMSwgXzEpLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0aW9uRmFpbGVkLCAmbV90ZXN0ZXIxLCBfMSwgXzIpKTsKKworICBCT09TVF9SRVFVSVJFKG1fdGVzdGVyMS5jb21tYW5kVmFsaWRhdGlvbkZhaWxlZCgpKTsKKyAgbV90ZXN0ZXIxLnJlc2V0VmFsaWRhdGlvbigpOworCisgIHZhbGlkYXRvci52YWxpZGF0ZSgqc3RhdHNDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0ZWQsICZtX3Rlc3RlcjEsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGlvbkZhaWxlZCwgJm1fdGVzdGVyMSwgXzEsIF8yKSk7CisKKyAgQk9PU1RfUkVRVUlSRShtX3Rlc3RlcjEuY29tbWFuZFZhbGlkYXRlZCgpKTsKKyAgbV90ZXN0ZXIxLnJlc2V0VmFsaWRhdGlvbigpOworCisgIHZhbGlkYXRvci52YWxpZGF0ZSgqZmFjZXNDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgYmluZCgmQ29tbWFuZFZhbGlkYXRvclRlc3Rlcjo6b25WYWxpZGF0ZWQsICZtX3Rlc3RlcjEsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkNvbW1hbmRWYWxpZGF0b3JUZXN0ZXI6Om9uVmFsaWRhdGlvbkZhaWxlZCwgJm1fdGVzdGVyMSwgXzEsIF8yKSk7CisKKyAgQk9PU1RfUkVRVUlSRShtX3Rlc3RlcjEuY29tbWFuZFZhbGlkYXRlZCgpKTsKKyAgbV90ZXN0ZXIxLnJlc2V0VmFsaWRhdGlvbigpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1tYW5hZ2VyLmNwcCBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9mYWNlLW1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0N2YwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1tYW5hZ2VyLmNwcApAQCAtMCwwICsxLDE4NTkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJtZ210L2ZhY2UtbWFuYWdlci5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJtZ210L2ZhY2Utc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisKKyNpbmNsdWRlICJmYWNlL2ZhY2UuaHBwIgorI2luY2x1ZGUgIi4uL2ZhY2UvZHVtbXktZmFjZS5ocHAiCisjaW5jbHVkZSAiZncvZmFjZS10YWJsZS5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJmYWNlL3VkcC1mYWN0b3J5LmhwcCIKKworI2lmZGVmIEhBVkVfTElCUENBUAorI2luY2x1ZGUgImZhY2UvZXRoZXJuZXQtZmFjdG9yeS5ocHAiCisjZW5kaWYgLy8gSEFWRV9MSUJQQ0FQCisKKyNpbmNsdWRlICJjb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICJ2YWxpZGF0aW9uLWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiZmFjZS1zdGF0dXMtcHVibGlzaGVyLWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiZmFjZS1xdWVyeS1zdGF0dXMtcHVibGlzaGVyLWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiY2hhbm5lbC1zdGF0dXMtY29tbW9uLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvZW5jb2RpbmcvdGx2LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZhY2UtZXZlbnQtbm90aWZpY2F0aW9uLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitORkRfTE9HX0lOSVQoIkZhY2VNYW5hZ2VyVGVzdCIpOworCitjbGFzcyBGYWNlTWFuYWdlclRlc3RGYWNlIDogcHVibGljIER1bW15RmFjZQoreworcHVibGljOgorCisgIEZhY2VNYW5hZ2VyVGVzdEZhY2UoKQorICAgIDogbV9jbG9zZUZpcmVkKGZhbHNlKQorICB7CisKKyAgfQorCisgIHZpcnR1YWwKKyAgfkZhY2VNYW5hZ2VyVGVzdEZhY2UoKQorICB7CisKKyAgfQorCisgIHZpcnR1YWwgdm9pZAorICBjbG9zZSgpCisgIHsKKyAgICBtX2Nsb3NlRmlyZWQgPSB0cnVlOworICB9CisKKyAgYm9vbAorICBkaWRDbG9zZUZpcmUoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fY2xvc2VGaXJlZDsKKyAgfQorCitwcml2YXRlOgorICBib29sIG1fY2xvc2VGaXJlZDsKK307CisKK2NsYXNzIFRlc3RGYWNlVGFibGUgOiBwdWJsaWMgRmFjZVRhYmxlCit7CitwdWJsaWM6CisgIFRlc3RGYWNlVGFibGUoRm9yd2FyZGVyJiBmb3J3YXJkZXIpCisgICAgOiBGYWNlVGFibGUoZm9yd2FyZGVyKSwKKyAgICAgIG1fYWRkRmlyZWQoZmFsc2UpLAorICAgICAgbV9nZXRGaXJlZChmYWxzZSksCisgICAgICBtX2R1bW15KG1ha2Vfc2hhcmVkPEZhY2VNYW5hZ2VyVGVzdEZhY2U+KCkpCisgIHsKKworICB9CisKKyAgdmlydHVhbAorICB+VGVzdEZhY2VUYWJsZSgpCisgIHsKKworICB9CisKKyAgdmlydHVhbCB2b2lkCisgIGFkZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpCisgIHsKKyAgICBtX2FkZEZpcmVkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgc2hhcmVkX3B0cjxGYWNlPgorICBnZXQoRmFjZUlkIGlkKSBjb25zdAorICB7CisgICAgbV9nZXRGaXJlZCA9IHRydWU7CisgICAgcmV0dXJuIG1fZHVtbXk7CisgIH0KKworICBib29sCisgIGRpZEFkZEZpcmUoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYWRkRmlyZWQ7CisgIH0KKworICBib29sCisgIGRpZEdldEZpcmUoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZ2V0RmlyZWQ7CisgIH0KKworICB2b2lkCisgIHJlc2V0KCkKKyAgeworICAgIG1fYWRkRmlyZWQgPSBmYWxzZTsKKyAgICBtX2dldEZpcmVkID0gZmFsc2U7CisgIH0KKworICBzaGFyZWRfcHRyPEZhY2VNYW5hZ2VyVGVzdEZhY2U+JgorICBnZXREdW1teUZhY2UoKQorICB7CisgICAgcmV0dXJuIG1fZHVtbXk7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBtX2FkZEZpcmVkOworICBtdXRhYmxlIGJvb2wgbV9nZXRGaXJlZDsKKyAgc2hhcmVkX3B0cjxGYWNlTWFuYWdlclRlc3RGYWNlPiBtX2R1bW15OworfTsKKworCitjbGFzcyBUZXN0RmFjZVRhYmxlRml4dHVyZSA6IHB1YmxpYyBCYXNlRml4dHVyZQoreworcHVibGljOgorICBUZXN0RmFjZVRhYmxlRml4dHVyZSgpCisgICAgOiBtX2ZhY2VUYWJsZShtX2ZvcndhcmRlcikKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5UZXN0RmFjZVRhYmxlRml4dHVyZSgpCisgIHsKKworICB9CisKK3Byb3RlY3RlZDoKKyAgRm9yd2FyZGVyIG1fZm9yd2FyZGVyOworICBUZXN0RmFjZVRhYmxlIG1fZmFjZVRhYmxlOworfTsKKworY2xhc3MgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uCit7CitwdWJsaWM6CisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbigpCisgICAgOiBtX2ZhY2UobWFrZV9zaGFyZWQ8SW50ZXJuYWxGYWNlPigpKSwKKyAgICAgIG1fY2FsbGJhY2tGaXJlZChmYWxzZSkKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5UZXN0RmFjZU1hbmFnZXJDb21tb24oKQorICB7CisKKyAgfQorCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiYKKyAgZ2V0RmFjZSgpCisgIHsKKyAgICByZXR1cm4gbV9mYWNlOworICB9CisKKyAgdm9pZAorICB2YWxpZGF0ZUNvbnRyb2xSZXNwb25zZUNvbW1vbihjb25zdCBEYXRhJiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZSYgZXhwZWN0ZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZFRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xSZXNwb25zZSYgY29udHJvbCkKKyAgeworICAgIG1fY2FsbGJhY2tGaXJlZCA9IHRydWU7CisgICAgQmxvY2sgY29udHJvbFJhdyA9IHJlc3BvbnNlLmdldENvbnRlbnQoKS5ibG9ja0Zyb21WYWx1ZSgpOworCisgICAgY29udHJvbC53aXJlRGVjb2RlKGNvbnRyb2xSYXcpOworCisgICAgLy8gTkZEX0xPR19ERUJVRygicmVjZWl2ZWQgY29udHJvbCByZXNwb25zZSIKKyAgICAvLyAgICAgICAgICAgICAgIDw8ICIgTmFtZTogIiA8PCByZXNwb25zZS5nZXROYW1lKCkKKyAgICAvLyAgICAgICAgICAgICAgIDw8ICIgY29kZTogIiA8PCBjb250cm9sLmdldENvZGUoKQorICAgIC8vICAgICAgICAgICAgICAgPDwgIiB0ZXh0OiAiIDw8IGNvbnRyb2wuZ2V0VGV4dCgpKTsKKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlLmdldE5hbWUoKSwgZXhwZWN0ZWROYW1lKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjb250cm9sLmdldENvZGUoKSwgZXhwZWN0ZWRDb2RlKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjb250cm9sLmdldFRleHQoKSwgZXhwZWN0ZWRUZXh0KTsKKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2UoY29uc3QgRGF0YSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRUZXh0KQorICB7CisgICAgQ29udHJvbFJlc3BvbnNlIGNvbnRyb2w7CisgICAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2VDb21tb24ocmVzcG9uc2UsIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZENvZGUsIGV4cGVjdGVkVGV4dCwgY29udHJvbCk7CisKKyAgICBpZiAoIWNvbnRyb2wuZ2V0Qm9keSgpLmVtcHR5KCkpCisgICAgICB7CisgICAgICAgIEJPT1NUX0ZBSUwoImZvdW5kIHVuZXhwZWN0ZWQgY29udHJvbCByZXNwb25zZSBib2R5Iik7CisgICAgICB9CisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKGNvbnN0IERhdGEmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBleHBlY3RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2smIGV4cGVjdGVkQm9keSkKKyAgeworICAgIENvbnRyb2xSZXNwb25zZSBjb250cm9sOworICAgIHZhbGlkYXRlQ29udHJvbFJlc3BvbnNlQ29tbW9uKHJlc3BvbnNlLCBleHBlY3RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2RlLCBleHBlY3RlZFRleHQsIGNvbnRyb2wpOworCisgICAgQk9PU1RfUkVRVUlSRSghY29udHJvbC5nZXRCb2R5KCkuZW1wdHkoKSk7CisgICAgQk9PU1RfUkVRVUlSRShjb250cm9sLmdldEJvZHkoKS52YWx1ZV9zaXplKCkgPT0gZXhwZWN0ZWRCb2R5LnZhbHVlX3NpemUoKSk7CisKKyAgICBCT09TVF9DSEVDSyhtZW1jbXAoY29udHJvbC5nZXRCb2R5KCkudmFsdWUoKSwgZXhwZWN0ZWRCb2R5LnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQm9keS52YWx1ZV9zaXplKCkpID09IDApOworCisgIH0KKworICBib29sCisgIGRpZENhbGxiYWNrRmlyZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9jYWxsYmFja0ZpcmVkOworICB9CisKKyAgdm9pZAorICByZXNldENhbGxiYWNrRmlyZWQoKQorICB7CisgICAgbV9jYWxsYmFja0ZpcmVkID0gZmFsc2U7CisgIH0KKworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gbV9mYWNlOworICBib29sIG1fY2FsbGJhY2tGaXJlZDsKKyAgbmRuOjpLZXlDaGFpbiBtX3Rlc3RLZXlDaGFpbjsKK307CisKK2NsYXNzIEZhY2VNYW5hZ2VyRml4dHVyZSA6IHB1YmxpYyBUZXN0RmFjZVRhYmxlRml4dHVyZSwgcHVibGljIFRlc3RGYWNlTWFuYWdlckNvbW1vbgoreworcHVibGljOgorICBGYWNlTWFuYWdlckZpeHR1cmUoKQorICAgIDogbV9tYW5hZ2VyKG1fZmFjZVRhYmxlLCBtX2ZhY2UsIG1fdGVzdEtleUNoYWluKQorICB7CisgICAgbV9tYW5hZ2VyLnNldENvbmZpZ0ZpbGUobV9jb25maWcpOworICB9CisKKyAgdmlydHVhbAorICB+RmFjZU1hbmFnZXJGaXh0dXJlKCkKKyAgeworCisgIH0KKworICB2b2lkCisgIHBhcnNlQ29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nIGNvbmZpZ3VyYXRpb24sIGJvb2wgaXNEcnlSdW4pCisgIHsKKyAgICBtX2NvbmZpZy5wYXJzZShjb25maWd1cmF0aW9uLCBpc0RyeVJ1biwgImR1bW15LWNvbmZpZyIpOworICB9CisKKyAgRmFjZU1hbmFnZXImCisgIGdldE1hbmFnZXIoKQorICB7CisgICAgcmV0dXJuIG1fbWFuYWdlcjsKKyAgfQorCisgIHZvaWQKKyAgYWRkSW50ZXJlc3RSdWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWdleCwKKyAgICAgICAgICAgICAgICAgIG5kbjo6SWRlbnRpdHlDZXJ0aWZpY2F0ZSYgY2VydGlmaWNhdGUpCisgIHsKKyAgICBtX21hbmFnZXIuYWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCBjZXJ0aWZpY2F0ZSk7CisgIH0KKworICBib29sCisgIGRpZEZhY2VUYWJsZUFkZEZpcmUoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZmFjZVRhYmxlLmRpZEFkZEZpcmUoKTsKKyAgfQorCisgIGJvb2wKKyAgZGlkRmFjZVRhYmxlR2V0RmlyZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mYWNlVGFibGUuZGlkR2V0RmlyZSgpOworICB9CisKKyAgdm9pZAorICByZXNldEZhY2VUYWJsZSgpCisgIHsKKyAgICBtX2ZhY2VUYWJsZS5yZXNldCgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgRmFjZU1hbmFnZXIgbV9tYW5hZ2VyOworICBDb25maWdGaWxlIG1fY29uZmlnOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKE1nbXRGYWNlTWFuYWdlciwgRmFjZU1hbmFnZXJGaXh0dXJlKQorCitib29sCitpc0V4cGVjdGVkRXhjZXB0aW9uKGNvbnN0IENvbmZpZ0ZpbGU6OkVycm9yJiBlcnJvciwgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkTWVzc2FnZSkKK3sKKyAgaWYgKGVycm9yLndoYXQoKSAhPSBleHBlY3RlZE1lc3NhZ2UpCisgICAgeworICAgICAgTkZEX0xPR19FUlJPUigiZXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRNZXNzYWdlIDw8ICJcdGdvdDogIiA8PCBlcnJvci53aGF0KCkpOworICAgIH0KKyAgcmV0dXJuIGVycm9yLndoYXQoKSA9PSBleHBlY3RlZE1lc3NhZ2U7Cit9CisKKyNpZmRlZiBIQVZFX1VOSVhfU09DS0VUUworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25Vbml4KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdW5peFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIHBhdGggL3RtcC9uZmQuc29ja1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfVEVTVF9DSEVDS1BPSU5UKCJDYWxsaW5nIHBhcnNlIik7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKHBhcnNlQ29uZmlnKENPTkZJRywgZmFsc2UpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVW5peERyeVJ1bikKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVuaXhcbiIKKyAgICAiICB7XG4iCisgICAgIiAgICBwYXRoIC92YXIvcnVuL25mZC5zb2NrXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKHBhcnNlQ29uZmlnKENPTkZJRywgdHJ1ZSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25Vbml4VW5rbm93bk9wdGlvbikKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVuaXhcbiIKKyAgICAiICB7XG4iCisgICAgIiAgICBoZWxsb1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKHBhcnNlQ29uZmlnKENPTkZJRywgZmFsc2UpLCBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmlzRXhwZWN0ZWRFeGNlcHRpb24sIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIG9wdGlvbiBcImhlbGxvXCIgaW4gXCJ1bml4XCIgc2VjdGlvbiIpKTsKK30KKworI2VuZGlmIC8vIEhBVkVfVU5JWF9TT0NLRVRTCisKKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVGNwKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdGNwXG4iCisgICAgIiAge1xuIgorICAgICIgICAgbGlzdGVuIHllc1xuIgorICAgICIgICAgcG9ydCA2MzYzXG4iCisgICAgIiAgICBlbmFibGVfdjQgeWVzXG4iCisgICAgIiAgICBlbmFibGVfdjYgeWVzXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworICB0cnkKKyAgICB7CisgICAgICBwYXJzZUNvbmZpZyhDT05GSUcsIGZhbHNlKTsKKyAgICB9CisgIGNhdGNoIChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpCisgICAgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmVhc29uID0gZS53aGF0KCk7CisgICAgICBpZiAocmVhc29uLmZpbmQoIkFkZHJlc3MgaW4gdXNlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHsKKyAgICAgICAgICBCT09TVF9GQUlMKHJlYXNvbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFRlc3RQcm9jZXNzU2VjdGlvblRjcERyeVJ1bikKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHRjcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIGxpc3RlbiB5ZXNcbiIKKyAgICAiICAgIHBvcnQgNjM2M1xuIgorICAgICIgICAgZW5hYmxlX3Y0IHllc1xuIgorICAgICIgICAgZW5hYmxlX3Y2IHllc1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1cocGFyc2VDb25maWcoQ09ORklHLCB0cnVlKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFRlc3RQcm9jZXNzU2VjdGlvblRjcEJhZExpc3RlbikKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHRjcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIGxpc3RlbiBoZWxsb1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKHBhcnNlQ29uZmlnKENPTkZJRywgZmFsc2UpLCBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmlzRXhwZWN0ZWRFeGNlcHRpb24sIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFwibGlzdGVuXCIgaW4gXCJ0Y3BcIiBzZWN0aW9uIikpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25UY3BDaGFubmVsc0Rpc2FibGVkKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdGNwXG4iCisgICAgIiAge1xuIgorICAgICIgICAgcG9ydCA2MzYzXG4iCisgICAgIiAgICBlbmFibGVfdjQgbm9cbiIKKyAgICAiICAgIGVuYWJsZV92NiBub1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKHBhcnNlQ29uZmlnKENPTkZJRywgZmFsc2UpLCBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmlzRXhwZWN0ZWRFeGNlcHRpb24sIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVB2NCBhbmQgSVB2NiBjaGFubmVscyBoYXZlIGJlZW4gZGlzYWJsZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJlbW92ZSBcInRjcFwiIHNlY3Rpb24gdG8gZGlzYWJsZSBUQ1AgY2hhbm5lbHMgb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmUtZW5hYmxlIGF0IGxlYXN0IG9uZSBjaGFubmVsIHR5cGUuIikpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25UY3BVbmtub3duT3B0aW9uKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdGNwXG4iCisgICAgIiAge1xuIgorICAgICIgICAgaGVsbG9cbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihwYXJzZUNvbmZpZyhDT05GSUcsIGZhbHNlKSwgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZpc0V4cGVjdGVkRXhjZXB0aW9uLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBvcHRpb24gXCJoZWxsb1wiIGluIFwidGNwXCIgc2VjdGlvbiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVWRwKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdWRwXG4iCisgICAgIiAge1xuIgorICAgICIgICAgcG9ydCA2MzYzXG4iCisgICAgIiAgICBlbmFibGVfdjQgeWVzXG4iCisgICAgIiAgICBlbmFibGVfdjYgeWVzXG4iCisgICAgIiAgICBpZGxlX3RpbWVvdXQgMzBcbiIKKyAgICAiICAgIGtlZXBfYWxpdmVfaW50ZXJ2YWwgMjVcbiIKKyAgICAiICAgIG1jYXN0IHllc1xuIgorICAgICIgICAgbWNhc3RfcG9ydCA1NjM2M1xuIgorICAgICIgICAgbWNhc3RfZ3JvdXAgMjI0LjAuMjMuMTcwXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworICBCT09TVF9DSEVDS19OT19USFJPVyhwYXJzZUNvbmZpZyhDT05GSUcsIGZhbHNlKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFRlc3RQcm9jZXNzU2VjdGlvblVkcERyeVJ1bikKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVkcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIHBvcnQgNjM2M1xuIgorICAgICIgICAgaWRsZV90aW1lb3V0IDMwXG4iCisgICAgIiAgICBrZWVwX2FsaXZlX2ludGVydmFsIDI1XG4iCisgICAgIiAgICBtY2FzdCB5ZXNcbiIKKyAgICAiICAgIG1jYXN0X3BvcnQgNTYzNjNcbiIKKyAgICAiICAgIG1jYXN0X2dyb3VwIDIyNC4wLjIzLjE3MFxuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1cocGFyc2VDb25maWcoQ09ORklHLCB0cnVlKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFRlc3RQcm9jZXNzU2VjdGlvblVkcEJhZElkbGVUaW1lb3V0KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdWRwXG4iCisgICAgIiAge1xuIgorICAgICIgICAgaWRsZV90aW1lb3V0IGhlbGxvXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihwYXJzZUNvbmZpZyhDT05GSUcsIGZhbHNlKSwgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZpc0V4cGVjdGVkRXhjZXB0aW9uLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcImlkbGVfdGltZW91dFwiIGluIFwidWRwXCIgc2VjdGlvbiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVWRwQmFkTWNhc3QpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJRyA9CisgICAgImZhY2Vfc3lzdGVtXG4iCisgICAgIntcbiIKKyAgICAiICB1ZHBcbiIKKyAgICAiICB7XG4iCisgICAgIiAgICBtY2FzdCBoZWxsb1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKworICBCT09TVF9DSEVDS19FWENFUFRJT04ocGFyc2VDb25maWcoQ09ORklHLCBmYWxzZSksIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmaXNFeHBlY3RlZEV4Y2VwdGlvbiwgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJtY2FzdFwiIGluIFwidWRwXCIgc2VjdGlvbiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVWRwQmFkTWNhc3RHcm91cCkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVkcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIG1jYXN0IG5vXG4iCisgICAgIiAgICBtY2FzdF9wb3J0IDUwXG4iCisgICAgIiAgICBtY2FzdF9ncm91cCBoZWxsb1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKworICBCT09TVF9DSEVDS19FWENFUFRJT04ocGFyc2VDb25maWcoQ09ORklHLCBmYWxzZSksIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmaXNFeHBlY3RlZEV4Y2VwdGlvbiwgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJtY2FzdF9ncm91cFwiIGluIFwidWRwXCIgc2VjdGlvbiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVWRwQmFkTWNhc3RHcm91cFY2KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdWRwXG4iCisgICAgIiAge1xuIgorICAgICIgICAgbWNhc3Qgbm9cbiIKKyAgICAiICAgIG1jYXN0X3BvcnQgNTBcbiIKKyAgICAiICAgIG1jYXN0X2dyb3VwIDo6MVxuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKworICBCT09TVF9DSEVDS19FWENFUFRJT04ocGFyc2VDb25maWcoQ09ORklHLCBmYWxzZSksIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmaXNFeHBlY3RlZEV4Y2VwdGlvbiwgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJtY2FzdF9ncm91cFwiIGluIFwidWRwXCIgc2VjdGlvbiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVWRwQ2hhbm5lbHNEaXNhYmxlZCkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVkcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIHBvcnQgNjM2M1xuIgorICAgICIgICAgZW5hYmxlX3Y0IG5vXG4iCisgICAgIiAgICBlbmFibGVfdjYgbm9cbiIKKyAgICAiICAgIGlkbGVfdGltZW91dCAzMFxuIgorICAgICIgICAga2VlcF9hbGl2ZV9pbnRlcnZhbCAyNVxuIgorICAgICIgICAgbWNhc3QgeWVzXG4iCisgICAgIiAgICBtY2FzdF9wb3J0IDU2MzYzXG4iCisgICAgIiAgICBtY2FzdF9ncm91cCAyMjQuMC4yMy4xNzBcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihwYXJzZUNvbmZpZyhDT05GSUcsIGZhbHNlKSwgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZpc0V4cGVjdGVkRXhjZXB0aW9uLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQdjQgYW5kIElQdjYgY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2FibGVkLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZW1vdmUgXCJ1ZHBcIiBzZWN0aW9uIHRvIGRpc2FibGUgVURQIGNoYW5uZWxzIG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlLWVuYWJsZSBhdCBsZWFzdCBvbmUgY2hhbm5lbCB0eXBlLiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uVWRwQ29uZmxpY3RpbmdNY2FzdCkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVkcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIHBvcnQgNjM2M1xuIgorICAgICIgICAgZW5hYmxlX3Y0IG5vXG4iCisgICAgIiAgICBlbmFibGVfdjYgeWVzXG4iCisgICAgIiAgICBpZGxlX3RpbWVvdXQgMzBcbiIKKyAgICAiICAgIGtlZXBfYWxpdmVfaW50ZXJ2YWwgMjVcbiIKKyAgICAiICAgIG1jYXN0IHllc1xuIgorICAgICIgICAgbWNhc3RfcG9ydCA1NjM2M1xuIgorICAgICIgICAgbWNhc3RfZ3JvdXAgMjI0LjAuMjMuMTcwXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworICBCT09TVF9DSEVDS19FWENFUFRJT04ocGFyc2VDb25maWcoQ09ORklHLCBmYWxzZSksIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmaXNFeHBlY3RlZEV4Y2VwdGlvbiwgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJUHY0IG11bHRpY2FzdCByZXF1ZXN0ZWQsIGJ1dCBJUHY0IGNoYW5uZWxzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhhdmUgYmVlbiBkaXNhYmxlZCAoY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIHNldCkiKSk7Cit9CisKKworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25VZHBVbmtub3duT3B0aW9uKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgdWRwXG4iCisgICAgIiAge1xuIgorICAgICIgICAgaGVsbG9cbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihwYXJzZUNvbmZpZyhDT05GSUcsIGZhbHNlKSwgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZpc0V4cGVjdGVkRXhjZXB0aW9uLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBvcHRpb24gXCJoZWxsb1wiIGluIFwidWRwXCIgc2VjdGlvbiIpKTsKK30KKworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25VZHBNdWx0aWNhc3RSZWluaXQpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJR19XSVRIX01DQVNUID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVkcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIG1jYXN0IHllc1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1cocGFyc2VDb25maWcoQ09ORklHX1dJVEhfTUNBU1QsIGZhbHNlKSk7CisKKyAgc2hhcmVkX3B0cjxVZHBGYWN0b3J5PiBmYWN0b3J5ID0gc3RhdGljX3BvaW50ZXJfY2FzdDxVZHBGYWN0b3J5PihnZXRNYW5hZ2VyKCkuZmluZEZhY3RvcnkoInVkcCIpKTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihmYWN0b3J5KSk7CisKKyAgaWYgKGZhY3RvcnktPmdldE11bHRpY2FzdEZhY2VzKCkuc2l6ZSgpID09IDApIHsKKyAgICBCT09TVF9URVNUX01FU1NBR0UoIkRlc3Ryb3lpbmcgbXVsdGljYXN0IGZhY2VzIGlzIG5vdCB0ZXN0ZWQgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJubyBVRFAgbXVsdGljYXN0IGZhY2VzIGFyZSBhdmFpbGFibGUiKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJR19XSVRIT1VUX01DQVNUID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIHVkcFxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIG1jYXN0IG5vXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworICBCT09TVF9DSEVDS19OT19USFJPVyhwYXJzZUNvbmZpZyhDT05GSUdfV0lUSE9VVF9NQ0FTVCwgZmFsc2UpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjdG9yeS0+Z2V0TXVsdGljYXN0RmFjZXMoKS5zaXplKCksIDApOworfQorCisKKyNpZmRlZiBIQVZFX0xJQlBDQVAKKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uRXRoZXIpCit7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZmFjZV9zeXN0ZW1cbiIKKyAgICAie1xuIgorICAgICIgIGV0aGVyXG4iCisgICAgIiAge1xuIgorICAgICIgICAgbWNhc3QgeWVzXG4iCisgICAgIiAgICBtY2FzdF9ncm91cCAwMTowMDo1RTowMDoxNzpBQVxuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKworICBCT09TVF9DSEVDS19OT19USFJPVyhwYXJzZUNvbmZpZyhDT05GSUcsIGZhbHNlKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFRlc3RQcm9jZXNzU2VjdGlvbkV0aGVyRHJ5UnVuKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgZXRoZXJcbiIKKyAgICAiICB7XG4iCisgICAgIiAgICBtY2FzdCB5ZXNcbiIKKyAgICAiICAgIG1jYXN0X2dyb3VwIDAxOjAwOjVFOjAwOjE3OkFBXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKHBhcnNlQ29uZmlnKENPTkZJRywgdHJ1ZSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25FdGhlckJhZE1jYXN0KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgZXRoZXJcbiIKKyAgICAiICB7XG4iCisgICAgIiAgICBtY2FzdCBoZWxsb1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKworICBCT09TVF9DSEVDS19FWENFUFRJT04ocGFyc2VDb25maWcoQ09ORklHLCBmYWxzZSksIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmaXNFeHBlY3RlZEV4Y2VwdGlvbiwgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJtY2FzdFwiIGluIFwiZXRoZXJcIiBzZWN0aW9uIikpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0UHJvY2Vzc1NlY3Rpb25FdGhlckJhZE1jYXN0R3JvdXApCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJRyA9CisgICAgImZhY2Vfc3lzdGVtXG4iCisgICAgIntcbiIKKyAgICAiICBldGhlclxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIG1jYXN0IHllc1xuIgorICAgICIgICAgbWNhc3RfZ3JvdXBcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKHBhcnNlQ29uZmlnKENPTkZJRywgZmFsc2UpLCBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmlzRXhwZWN0ZWRFeGNlcHRpb24sIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFwibWNhc3RfZ3JvdXBcIiBpbiBcImV0aGVyXCIgc2VjdGlvbiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdFByb2Nlc3NTZWN0aW9uRXRoZXJVbmtub3duT3B0aW9uKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJmYWNlX3N5c3RlbVxuIgorICAgICJ7XG4iCisgICAgIiAgZXRoZXJcbiIKKyAgICAiICB7XG4iCisgICAgIiAgICBoZWxsb1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKHBhcnNlQ29uZmlnKENPTkZJRywgZmFsc2UpLCBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmlzRXhwZWN0ZWRFeGNlcHRpb24sIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIG9wdGlvbiBcImhlbGxvXCIgaW4gXCJldGhlclwiIHNlY3Rpb24iKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFRlc3RQcm9jZXNzU2VjdGlvbkV0aGVyTXVsdGljYXN0UmVpbml0KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUdfV0lUSF9NQ0FTVCA9CisgICAgImZhY2Vfc3lzdGVtXG4iCisgICAgIntcbiIKKyAgICAiICBldGhlclxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIG1jYXN0IHllc1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIjsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1cocGFyc2VDb25maWcoQ09ORklHX1dJVEhfTUNBU1QsIGZhbHNlKSk7CisKKyAgc2hhcmVkX3B0cjxFdGhlcm5ldEZhY3Rvcnk+IGZhY3RvcnkgPQorICAgIHN0YXRpY19wb2ludGVyX2Nhc3Q8RXRoZXJuZXRGYWN0b3J5PihnZXRNYW5hZ2VyKCkuZmluZEZhY3RvcnkoImV0aGVyIikpOworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGZhY3RvcnkpKTsKKworICBpZiAoZmFjdG9yeS0+Z2V0TXVsdGljYXN0RmFjZXMoKS5zaXplKCkgPT0gMCkgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiRGVzdHJveWluZyBtdWx0aWNhc3QgZmFjZXMgaXMgbm90IHRlc3RlZCBiZWNhdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vIEV0aGVybmV0IG11bHRpY2FzdCBmYWNlcyBhcmUgYXZhaWxhYmxlIik7CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUdfV0lUSE9VVF9NQ0FTVCA9CisgICAgImZhY2Vfc3lzdGVtXG4iCisgICAgIntcbiIKKyAgICAiICBldGhlclxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIG1jYXN0IG5vXG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iOworICBCT09TVF9DSEVDS19OT19USFJPVyhwYXJzZUNvbmZpZyhDT05GSUdfV0lUSE9VVF9NQ0FTVCwgZmFsc2UpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjdG9yeS0+Z2V0TXVsdGljYXN0RmFjZXMoKS5zaXplKCksIDApOworfQorCisjZW5kaWYgLy8gSEFWRV9MSUJQQ0FQCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNob3J0TmFtZSkKK3sKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9sb2NhbGhvc3QvbmZkL2ZhY2VzIikpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBnZXRGYWNlKCktPnNlbmRJbnRlcmVzdCgqY29tbWFuZCk7CisgIGdfaW8ucnVuX29uZSgpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNYWxmb3JtZWRDb21tbWFuZCkKK3sKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9sb2NhbGhvc3QvbmZkL2ZhY2VzIikpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBnZXRNYW5hZ2VyKCkub25GYWNlUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFVuc2lnbmVkQ29tbWFuZCkKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRVcmkoInRjcDQ6Ly8xMjcuMC4wLjE6NjM2MyIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcyIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImNyZWF0ZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDEsICJTaWduYXR1cmUgcmVxdWlyZWQiKTsKKyAgfTsKKworICBnZXRNYW5hZ2VyKCkub25GYWNlUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVuYXV0aG9yaXplZENvbW1hbmQsIFVuYXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPEZhY2VNYW5hZ2VyRml4dHVyZT4pCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0VXJpKCJ0Y3A0Oi8vMTI3LjAuMC4xOjYzNjMiKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJjcmVhdGUiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAzLCAiVW5hdXRob3JpemVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBnZXRNYW5hZ2VyKCkub25GYWNlUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmUgOiBwdWJsaWMgQ29tbWFuZEZpeHR1cmU8VD4KK3sKK3B1YmxpYzoKKyAgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlKCkKKyAgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlZ2V4ID0gIl48bG9jYWxob3N0PjxuZmQ+PGZhY2VzPiI7CisgICAgVDo6YWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCAqQ29tbWFuZEZpeHR1cmU8VD46Om1fY2VydGlmaWNhdGUpOworICB9CisKKyAgdmlydHVhbAorICB+QXV0aG9yaXplZENvbW1hbmRGaXh0dXJlKCkKKyAgeworCisgIH0KK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVuc3VwcG9ydGVkQ29tbWFuZCwgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPEZhY2VNYW5hZ2VyRml4dHVyZT4pCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgidW5zdXBwb3J0ZWQiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNTAxLCAiVW5zdXBwb3J0ZWQgY29tbWFuZCIpOworICB9OworCisgIGdldE1hbmFnZXIoKS5vbkZhY2VSZXF1ZXN0KCpjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworY2xhc3MgVmFsaWRhdGVkRmFjZVJlcXVlc3RGaXh0dXJlIDogcHVibGljIFRlc3RGYWNlVGFibGVGaXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRlc3RGYWNlTWFuYWdlckNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBGYWNlTWFuYWdlcgoreworcHVibGljOgorCisgIFZhbGlkYXRlZEZhY2VSZXF1ZXN0Rml4dHVyZSgpCisgICAgOiBGYWNlTWFuYWdlcihUZXN0RmFjZVRhYmxlRml4dHVyZTo6bV9mYWNlVGFibGUsIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLCBtX3Rlc3RLZXlDaGFpbiksCisgICAgICBtX2NyZWF0ZUZhY2VGaXJlZChmYWxzZSksCisgICAgICBtX2Rlc3Ryb3lGYWNlRmlyZWQoZmFsc2UpCisgIHsKKworICB9CisKKyAgdmlydHVhbCB2b2lkCisgIGNyZWF0ZUZhY2UoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpCisgIHsKKyAgICBtX2NyZWF0ZUZhY2VGaXJlZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQKKyAgZGVzdHJveUZhY2UoY29uc3QgSW50ZXJlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKQorICB7CisgICAgbV9kZXN0cm95RmFjZUZpcmVkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwKKyAgflZhbGlkYXRlZEZhY2VSZXF1ZXN0Rml4dHVyZSgpCisgIHsKKworICB9CisKKyAgYm9vbAorICBkaWRDcmVhdGVGYWNlRmlyZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9jcmVhdGVGYWNlRmlyZWQ7CisgIH0KKworICBib29sCisgIGRpZERlc3Ryb3lGYWNlRmlyZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9kZXN0cm95RmFjZUZpcmVkOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgbV9jcmVhdGVGYWNlRmlyZWQ7CisgIGJvb2wgbV9kZXN0cm95RmFjZUZpcmVkOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVmFsaWRhdGVkRmFjZVJlcXVlc3RCYWRPcHRpb25QYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6ZWRDb21tYW5kRml4dHVyZTxWYWxpZGF0ZWRGYWNlUmVxdWVzdEZpeHR1cmU+KQoreworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcyIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImNyZWF0ZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoIk5vdFJlYWxseVBhcmFtZXRlcnMiKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBvblZhbGlkYXRlZEZhY2VSZXF1ZXN0KGNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShWYWxpZGF0ZWRGYWNlUmVxdWVzdENyZWF0ZUZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8VmFsaWRhdGVkRmFjZVJlcXVlc3RGaXh0dXJlPikKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRVcmkoInRjcDQ6Ly8xMjcuMC4wLjE6NjM2MyIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcyIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImNyZWF0ZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChjb21tYW5kKTsKKyAgQk9PU1RfQ0hFQ0soZGlkQ3JlYXRlRmFjZUZpcmUoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFZhbGlkYXRlZEZhY2VSZXF1ZXN0RGVzdHJveUZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8VmFsaWRhdGVkRmFjZVJlcXVlc3RGaXh0dXJlPikKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRVcmkoInRjcDQ6Ly8xMjcuMC4wLjE6NjM2MyIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcyIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImRlc3Ryb3kiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIG9uVmFsaWRhdGVkRmFjZVJlcXVlc3QoY29tbWFuZCk7CisgIEJPT1NUX0NIRUNLKGRpZERlc3Ryb3lGYWNlRmlyZSgpKTsKK30KKworY2xhc3MgRmFjZVRhYmxlRml4dHVyZQoreworcHVibGljOgorICBGYWNlVGFibGVGaXh0dXJlKCkKKyAgICA6IG1fZmFjZVRhYmxlKG1fZm9yd2FyZGVyKQorICB7CisgIH0KKworICB2aXJ0dWFsCisgIH5GYWNlVGFibGVGaXh0dXJlKCkKKyAgeworICB9CisKK3Byb3RlY3RlZDoKKyAgRm9yd2FyZGVyIG1fZm9yd2FyZGVyOworICBGYWNlVGFibGUgbV9mYWNlVGFibGU7Cit9OworCitjbGFzcyBMb2NhbENvbnRyb2xGaXh0dXJlIDogcHVibGljIEZhY2VUYWJsZUZpeHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRlc3RGYWNlTWFuYWdlckNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRmFjZU1hbmFnZXIKK3sKK3B1YmxpYzoKKyAgTG9jYWxDb250cm9sRml4dHVyZSgpCisgICAgOiBGYWNlTWFuYWdlcihGYWNlVGFibGVGaXh0dXJlOjptX2ZhY2VUYWJsZSwgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UsIG1fdGVzdEtleUNoYWluKQorICB7CisgIH0KK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKExvY2FsQ29udHJvbEluRmFjZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPExvY2FsQ29udHJvbEZpeHR1cmU+KQoreworICBzaGFyZWRfcHRyPExvY2FsRmFjZT4gZHVtbXkgPSBtYWtlX3NoYXJlZDxEdW1teUxvY2FsRmFjZT4oKTsKKyAgQk9PU1RfUkVRVUlSRShkdW1teS0+aXNMb2NhbCgpKTsKKyAgRmFjZVRhYmxlRml4dHVyZTo6bV9mYWNlVGFibGUuYWRkKGR1bW15KTsKKworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldExvY2FsQ29udHJvbEZlYXR1cmUoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0lOQ09NSU5HX0ZBQ0VfSUQpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGVuYWJsZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZW5hYmxlLWxvY2FsLWNvbnRyb2wiKTsKKyAgZW5hYmxlLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gZW5hYmxlQ29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oZW5hYmxlKSk7CisgIGVuYWJsZUNvbW1hbmQtPnNldEluY29taW5nRmFjZUlkKGR1bW15LT5nZXRJZCgpKTsKKworICBnZW5lcmF0ZUNvbW1hbmQoKmVuYWJsZUNvbW1hbmQpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhICs9CisgIFt0aGlzLCBlbmFibGVDb21tYW5kLCBlbmNvZGVkUGFyYW1ldGVyc10gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGVuYWJsZUNvbW1hbmQtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsICJTdWNjZXNzIiwgZW5jb2RlZFBhcmFtZXRlcnMpOworICB9OworCisgIG9uVmFsaWRhdGVkRmFjZVJlcXVlc3QoZW5hYmxlQ29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCkpOworICBCT09TVF9DSEVDSyghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfTkVYVF9IT1BfRkFDRV9JRCkpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhLmNsZWFyKCk7CisgIHJlc2V0Q2FsbGJhY2tGaXJlZCgpOworCisgIE5hbWUgZGlzYWJsZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZGlzYWJsZS1sb2NhbC1jb250cm9sIik7CisgIGRpc2FibGUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBkaXNhYmxlQ29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oZGlzYWJsZSkpOworICBkaXNhYmxlQ29tbWFuZC0+c2V0SW5jb21pbmdGYWNlSWQoZHVtbXktPmdldElkKCkpOworCisgIGdlbmVyYXRlQ29tbWFuZCgqZGlzYWJsZUNvbW1hbmQpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhICs9CisgIFt0aGlzLCBkaXNhYmxlQ29tbWFuZCwgZW5jb2RlZFBhcmFtZXRlcnNdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBkaXNhYmxlQ29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCBlbmNvZGVkUGFyYW1ldGVycyk7CisgIH07CisKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChkaXNhYmxlQ29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0lOQ09NSU5HX0ZBQ0VfSUQpKTsKKyAgQk9PU1RfQ0hFQ0soIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoTG9jYWxDb250cm9sSW5GYWNlSWRGYWNlTm90Rm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8TG9jYWxDb250cm9sRml4dHVyZT4pCit7CisgIHNoYXJlZF9wdHI8TG9jYWxGYWNlPiBkdW1teSA9IG1ha2Vfc2hhcmVkPER1bW15TG9jYWxGYWNlPigpOworICBCT09TVF9SRVFVSVJFKGR1bW15LT5pc0xvY2FsKCkpOworICBGYWNlVGFibGVGaXh0dXJlOjptX2ZhY2VUYWJsZS5hZGQoZHVtbXkpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TG9jYWxDb250cm9sRmVhdHVyZShMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCk7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgZW5hYmxlKCIvbG9jYWxob3N0L25mZC9mYWNlcy9lbmFibGUtbG9jYWwtY29udHJvbCIpOworICBlbmFibGUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBlbmFibGVDb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0PihlbmFibGUpKTsKKyAgZW5hYmxlQ29tbWFuZC0+c2V0SW5jb21pbmdGYWNlSWQoZHVtbXktPmdldElkKCkgKyAxMDApOworCisgIGdlbmVyYXRlQ29tbWFuZCgqZW5hYmxlQ29tbWFuZCk7CisKKyAgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGVuYWJsZUNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBlbmFibGVDb21tYW5kLT5nZXROYW1lKCksIDQxMCwgIkZhY2Ugbm90IGZvdW5kIik7CisgIH07CisKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChlbmFibGVDb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgQk9PU1RfUkVRVUlSRSghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCkpOworICBCT09TVF9DSEVDSyghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfTkVYVF9IT1BfRkFDRV9JRCkpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhLmNsZWFyKCk7CisgIHJlc2V0Q2FsbGJhY2tGaXJlZCgpOworCisgIE5hbWUgZGlzYWJsZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZGlzYWJsZS1sb2NhbC1jb250cm9sIik7CisgIGRpc2FibGUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBkaXNhYmxlQ29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oZGlzYWJsZSkpOworICBkaXNhYmxlQ29tbWFuZC0+c2V0SW5jb21pbmdGYWNlSWQoZHVtbXktPmdldElkKCkgKyAxMDApOworCisgIGdlbmVyYXRlQ29tbWFuZCgqZGlzYWJsZUNvbW1hbmQpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBkaXNhYmxlQ29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGRpc2FibGVDb21tYW5kLT5nZXROYW1lKCksIDQxMCwgIkZhY2Ugbm90IGZvdW5kIik7CisgIH07CisKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChkaXNhYmxlQ29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0lOQ09NSU5HX0ZBQ0VfSUQpKTsKKyAgQk9PU1RfQ0hFQ0soIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoTG9jYWxDb250cm9sTWlzc2luZ0ZlYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8TG9jYWxDb250cm9sRml4dHVyZT4pCit7CisgIHNoYXJlZF9wdHI8TG9jYWxGYWNlPiBkdW1teSA9IG1ha2Vfc2hhcmVkPER1bW15TG9jYWxGYWNlPigpOworICBCT09TVF9SRVFVSVJFKGR1bW15LT5pc0xvY2FsKCkpOworICBGYWNlVGFibGVGaXh0dXJlOjptX2ZhY2VUYWJsZS5hZGQoZHVtbXkpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgZW5hYmxlKCIvbG9jYWxob3N0L25mZC9mYWNlcy9lbmFibGUtbG9jYWwtY29udHJvbCIpOworICBlbmFibGUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBlbmFibGVDb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0PihlbmFibGUpKTsKKyAgZW5hYmxlQ29tbWFuZC0+c2V0SW5jb21pbmdGYWNlSWQoZHVtbXktPmdldElkKCkpOworCisgIGdlbmVyYXRlQ29tbWFuZCgqZW5hYmxlQ29tbWFuZCk7CisKKyAgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGVuYWJsZUNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBlbmFibGVDb21tYW5kLT5nZXROYW1lKCksIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgIH07CisKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChlbmFibGVDb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgQk9PU1RfUkVRVUlSRSghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCkpOworICBCT09TVF9SRVFVSVJFKCFkdW1teS0+aXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9ORVhUX0hPUF9GQUNFX0lEKSk7CisKKyAgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UtPm9uUmVjZWl2ZURhdGEuY2xlYXIoKTsKKyAgcmVzZXRDYWxsYmFja0ZpcmVkKCk7CisKKyAgTmFtZSBkaXNhYmxlKCIvbG9jYWxob3N0L25mZC9mYWNlcy9kaXNhYmxlLWxvY2FsLWNvbnRyb2wiKTsKKyAgZGlzYWJsZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGRpc2FibGVDb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0PihkaXNhYmxlKSk7CisgIGRpc2FibGVDb21tYW5kLT5zZXRJbmNvbWluZ0ZhY2VJZChkdW1teS0+Z2V0SWQoKSk7CisKKyAgZ2VuZXJhdGVDb21tYW5kKCpkaXNhYmxlQ29tbWFuZCk7CisKKyAgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGRpc2FibGVDb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgZGlzYWJsZUNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBvblZhbGlkYXRlZEZhY2VSZXF1ZXN0KGRpc2FibGVDb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgQk9PU1RfUkVRVUlSRSghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCkpOworICBCT09TVF9SRVFVSVJFKCFkdW1teS0+aXNMb2NhbENvbnRyb2xIZWFkZXJFbmFibGVkKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9ORVhUX0hPUF9GQUNFX0lEKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKExvY2FsQ29udHJvbEluRmFjZUlkTm9uTG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8TG9jYWxDb250cm9sRml4dHVyZT4pCit7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBkdW1teSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgQk9PU1RfUkVRVUlSRSghZHVtbXktPmlzTG9jYWwoKSk7CisgIEZhY2VUYWJsZUZpeHR1cmU6Om1fZmFjZVRhYmxlLmFkZChkdW1teSk7CisKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRMb2NhbENvbnRyb2xGZWF0dXJlKExPQ0FMX0NPTlRST0xfRkVBVFVSRV9JTkNPTUlOR19GQUNFX0lEKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBlbmFibGUoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL2VuYWJsZS1sb2NhbC1jb250cm9sIik7CisgIGVuYWJsZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGVuYWJsZUNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGVuYWJsZSkpOworICBlbmFibGVDb21tYW5kLT5zZXRJbmNvbWluZ0ZhY2VJZChkdW1teS0+Z2V0SWQoKSk7CisKKyAgZ2VuZXJhdGVDb21tYW5kKCplbmFibGVDb21tYW5kKTsKKworICBUZXN0RmFjZU1hbmFnZXJDb21tb246Om1fZmFjZS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgZW5hYmxlQ29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGVuYWJsZUNvbW1hbmQtPmdldE5hbWUoKSwgNDEyLCAiRmFjZSBpcyBub24tbG9jYWwiKTsKKyAgfTsKKworICBvblZhbGlkYXRlZEZhY2VSZXF1ZXN0KGVuYWJsZUNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhLmNsZWFyKCk7CisgIHJlc2V0Q2FsbGJhY2tGaXJlZCgpOworCisgIE5hbWUgZGlzYWJsZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZGlzYWJsZS1sb2NhbC1jb250cm9sIik7CisgIGVuYWJsZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGRpc2FibGVDb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0PihlbmFibGUpKTsKKyAgZGlzYWJsZUNvbW1hbmQtPnNldEluY29taW5nRmFjZUlkKGR1bW15LT5nZXRJZCgpKTsKKworICBnZW5lcmF0ZUNvbW1hbmQoKmRpc2FibGVDb21tYW5kKTsKKworICBUZXN0RmFjZU1hbmFnZXJDb21tb246Om1fZmFjZS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgZGlzYWJsZUNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBkaXNhYmxlQ29tbWFuZC0+Z2V0TmFtZSgpLCA0MTIsICJGYWNlIGlzIG5vbi1sb2NhbCIpOworICB9OworCisgIG9uVmFsaWRhdGVkRmFjZVJlcXVlc3QoZGlzYWJsZUNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShMb2NhbENvbnRyb2xOZXh0SG9wRmFjZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPExvY2FsQ29udHJvbEZpeHR1cmU+KQoreworICBzaGFyZWRfcHRyPExvY2FsRmFjZT4gZHVtbXkgPSBtYWtlX3NoYXJlZDxEdW1teUxvY2FsRmFjZT4oKTsKKyAgQk9PU1RfUkVRVUlSRShkdW1teS0+aXNMb2NhbCgpKTsKKyAgRmFjZVRhYmxlRml4dHVyZTo6bV9mYWNlVGFibGUuYWRkKGR1bW15KTsKKworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldExvY2FsQ29udHJvbEZlYXR1cmUoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGVuYWJsZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZW5hYmxlLWxvY2FsLWNvbnRyb2wiKTsKKyAgZW5hYmxlLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gZW5hYmxlQ29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oZW5hYmxlKSk7CisgIGVuYWJsZUNvbW1hbmQtPnNldEluY29taW5nRmFjZUlkKGR1bW15LT5nZXRJZCgpKTsKKworICBnZW5lcmF0ZUNvbW1hbmQoKmVuYWJsZUNvbW1hbmQpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhICs9CisgIFt0aGlzLCBlbmFibGVDb21tYW5kLCBlbmNvZGVkUGFyYW1ldGVyc10gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGVuYWJsZUNvbW1hbmQtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsICJTdWNjZXNzIiwgZW5jb2RlZFBhcmFtZXRlcnMpOworICB9OworCisgIG9uVmFsaWRhdGVkRmFjZVJlcXVlc3QoZW5hYmxlQ29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfTkVYVF9IT1BfRkFDRV9JRCkpOworICBCT09TVF9DSEVDSyghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCkpOworCisKKyAgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UtPm9uUmVjZWl2ZURhdGEuY2xlYXIoKTsKKyAgcmVzZXRDYWxsYmFja0ZpcmVkKCk7CisKKyAgTmFtZSBkaXNhYmxlKCIvbG9jYWxob3N0L25mZC9mYWNlcy9kaXNhYmxlLWxvY2FsLWNvbnRyb2wiKTsKKyAgZGlzYWJsZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGRpc2FibGVDb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0PihkaXNhYmxlKSk7CisgIGRpc2FibGVDb21tYW5kLT5zZXRJbmNvbWluZ0ZhY2VJZChkdW1teS0+Z2V0SWQoKSk7CisKKyAgZ2VuZXJhdGVDb21tYW5kKCpkaXNhYmxlQ29tbWFuZCk7CisKKyAgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0KKyAgW3RoaXMsIGRpc2FibGVDb21tYW5kLCBlbmNvZGVkUGFyYW1ldGVyc10gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGRpc2FibGVDb21tYW5kLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLCAiU3VjY2VzcyIsIGVuY29kZWRQYXJhbWV0ZXJzKTsKKyAgfTsKKworICBvblZhbGlkYXRlZEZhY2VSZXF1ZXN0KGRpc2FibGVDb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgQk9PU1RfUkVRVUlSRSghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfTkVYVF9IT1BfRkFDRV9JRCkpOworICBCT09TVF9DSEVDSyghZHVtbXktPmlzTG9jYWxDb250cm9sSGVhZGVyRW5hYmxlZChMT0NBTF9DT05UUk9MX0ZFQVRVUkVfSU5DT01JTkdfRkFDRV9JRCkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShMb2NhbENvbnRyb2xOZXh0SG9wRmFjZUlkRmFjZU5vdEZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPExvY2FsQ29udHJvbEZpeHR1cmU+KQoreworICBzaGFyZWRfcHRyPExvY2FsRmFjZT4gZHVtbXkgPSBtYWtlX3NoYXJlZDxEdW1teUxvY2FsRmFjZT4oKTsKKyAgQk9PU1RfUkVRVUlSRShkdW1teS0+aXNMb2NhbCgpKTsKKyAgRmFjZVRhYmxlRml4dHVyZTo6bV9mYWNlVGFibGUuYWRkKGR1bW15KTsKKworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldExvY2FsQ29udHJvbEZlYXR1cmUoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGVuYWJsZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZW5hYmxlLWxvY2FsLWNvbnRyb2wiKTsKKyAgZW5hYmxlLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gZW5hYmxlQ29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oZW5hYmxlKSk7CisgIGVuYWJsZUNvbW1hbmQtPnNldEluY29taW5nRmFjZUlkKGR1bW15LT5nZXRJZCgpICsgMTAwKTsKKworICBnZW5lcmF0ZUNvbW1hbmQoKmVuYWJsZUNvbW1hbmQpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBlbmFibGVDb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgZW5hYmxlQ29tbWFuZC0+Z2V0TmFtZSgpLCA0MTAsICJGYWNlIG5vdCBmb3VuZCIpOworICB9OworCisgIG9uVmFsaWRhdGVkRmFjZVJlcXVlc3QoZW5hYmxlQ29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpKTsKKyAgQk9PU1RfQ0hFQ0soIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0lOQ09NSU5HX0ZBQ0VfSUQpKTsKKworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhLmNsZWFyKCk7CisgIHJlc2V0Q2FsbGJhY2tGaXJlZCgpOworCisgIE5hbWUgZGlzYWJsZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZGlzYWJsZS1sb2NhbC1jb250cm9sIik7CisgIGRpc2FibGUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBkaXNhYmxlQ29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oZGlzYWJsZSkpOworICBkaXNhYmxlQ29tbWFuZC0+c2V0SW5jb21pbmdGYWNlSWQoZHVtbXktPmdldElkKCkgKyAxMDApOworCisgIGdlbmVyYXRlQ29tbWFuZCgqZGlzYWJsZUNvbW1hbmQpOworCisgIFRlc3RGYWNlTWFuYWdlckNvbW1vbjo6bV9mYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBkaXNhYmxlQ29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGRpc2FibGVDb21tYW5kLT5nZXROYW1lKCksIDQxMCwgIkZhY2Ugbm90IGZvdW5kIik7CisgIH07CisKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChkaXNhYmxlQ29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX05FWFRfSE9QX0ZBQ0VfSUQpKTsKKyAgQk9PU1RfQ0hFQ0soIWR1bW15LT5pc0xvY2FsQ29udHJvbEhlYWRlckVuYWJsZWQoTE9DQUxfQ09OVFJPTF9GRUFUVVJFX0lOQ09NSU5HX0ZBQ0VfSUQpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoTG9jYWxDb250cm9sTmV4dEhvcEZhY2VJZE5vbkxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPExvY2FsQ29udHJvbEZpeHR1cmU+KQoreworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZHVtbXkgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIEJPT1NUX1JFUVVJUkUoIWR1bW15LT5pc0xvY2FsKCkpOworICBGYWNlVGFibGVGaXh0dXJlOjptX2ZhY2VUYWJsZS5hZGQoZHVtbXkpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TG9jYWxDb250cm9sRmVhdHVyZShMT0NBTF9DT05UUk9MX0ZFQVRVUkVfTkVYVF9IT1BfRkFDRV9JRCk7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgZW5hYmxlKCIvbG9jYWxob3N0L25mZC9mYWNlcy9lbmFibGUtbG9jYWwtY29udHJvbCIpOworICBlbmFibGUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBlbmFibGVDb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0PihlbmFibGUpKTsKKyAgZW5hYmxlQ29tbWFuZC0+c2V0SW5jb21pbmdGYWNlSWQoZHVtbXktPmdldElkKCkpOworCisgIGdlbmVyYXRlQ29tbWFuZCgqZW5hYmxlQ29tbWFuZCk7CisKKyAgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uOjptX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGVuYWJsZUNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBlbmFibGVDb21tYW5kLT5nZXROYW1lKCksIDQxMiwgIkZhY2UgaXMgbm9uLWxvY2FsIik7CisgIH07CisKKyAgb25WYWxpZGF0ZWRGYWNlUmVxdWVzdChlbmFibGVDb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKworICBUZXN0RmFjZU1hbmFnZXJDb21tb246Om1fZmFjZS0+b25SZWNlaXZlRGF0YS5jbGVhcigpOworICByZXNldENhbGxiYWNrRmlyZWQoKTsKKworICBOYW1lIGRpc2FibGUoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL2Rpc2FibGUtbG9jYWwtY29udHJvbCIpOworICBkaXNhYmxlLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gZGlzYWJsZUNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGRpc2FibGUpKTsKKyAgZGlzYWJsZUNvbW1hbmQtPnNldEluY29taW5nRmFjZUlkKGR1bW15LT5nZXRJZCgpKTsKKworICBnZW5lcmF0ZUNvbW1hbmQoKmRpc2FibGVDb21tYW5kKTsKKworICBUZXN0RmFjZU1hbmFnZXJDb21tb246Om1fZmFjZS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgZGlzYWJsZUNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBkaXNhYmxlQ29tbWFuZC0+Z2V0TmFtZSgpLCA0MTIsICJGYWNlIGlzIG5vbi1sb2NhbCIpOworICB9OworCisgIG9uVmFsaWRhdGVkRmFjZVJlcXVlc3QoZGlzYWJsZUNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitjbGFzcyBGYWNlRml4dHVyZSA6IHB1YmxpYyBGYWNlVGFibGVGaXh0dXJlLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVGVzdEZhY2VNYW5hZ2VyQ29tbW9uLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRmFjZU1hbmFnZXIKK3sKK3B1YmxpYzoKKyAgRmFjZUZpeHR1cmUoKQorICAgIDogRmFjZU1hbmFnZXIoRmFjZVRhYmxlRml4dHVyZTo6bV9mYWNlVGFibGUsCisgICAgICAgICAgICAgICAgICBUZXN0RmFjZU1hbmFnZXJDb21tb246Om1fZmFjZSwKKyAgICAgICAgICAgICAgICAgIG1fdGVzdEtleUNoYWluKQorICAgICwgbV9yZWNlaXZlZE5vdGlmaWNhdGlvbihmYWxzZSkKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5GYWNlRml4dHVyZSgpCisgIHsKKworICB9CisKKyAgdm9pZAorICBjYWxsYmFja0Rpc3BhdGNoKGNvbnN0IERhdGEmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZENvZGUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9jayYgZXhwZWN0ZWRCb2R5LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpGYWNlRXZlbnROb3RpZmljYXRpb24mIGV4cGVjdGVkRmFjZUV2ZW50KQorICB7CisgICAgQmxvY2sgcGF5bG9hZCA9IHJlc3BvbnNlLmdldENvbnRlbnQoKS5ibG9ja0Zyb21WYWx1ZSgpOworICAgIGlmIChwYXlsb2FkLnR5cGUoKSA9PSBuZG46OnRsdjo6bmZkOjpDb250cm9sUmVzcG9uc2UpCisgICAgICB7CisgICAgICAgIHZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBleHBlY3RlZE5hbWUsIGV4cGVjdGVkQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUZXh0LCBleHBlY3RlZEJvZHkpOworICAgICAgfQorICAgIGVsc2UgaWYgKHBheWxvYWQudHlwZSgpID09IG5kbjo6dGx2OjpuZmQ6OkZhY2VFdmVudE5vdGlmaWNhdGlvbikKKyAgICAgIHsKKyAgICAgICAgdmFsaWRhdGVGYWNlRXZlbnQocGF5bG9hZCwgZXhwZWN0ZWRGYWNlRXZlbnQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgQk9PU1RfRkFJTCgiUmVjZWl2ZWQgdW5rbm93biBtZXNzYWdlIHR5cGU6ICMiIDw8IHBheWxvYWQudHlwZSgpKTsKKyAgICAgIH0KKyAgfQorCisgIHZvaWQKKyAgY2FsbGJhY2tEaXNwYXRjaChjb25zdCBEYXRhJiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBleHBlY3RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRDb2RlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZFRleHQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjpuZmQ6OkZhY2VFdmVudE5vdGlmaWNhdGlvbiYgZXhwZWN0ZWRGYWNlRXZlbnQpCisgIHsKKyAgICBCbG9jayBwYXlsb2FkID0gcmVzcG9uc2UuZ2V0Q29udGVudCgpLmJsb2NrRnJvbVZhbHVlKCk7CisgICAgaWYgKHBheWxvYWQudHlwZSgpID09IG5kbjo6dGx2OjpuZmQ6OkNvbnRyb2xSZXNwb25zZSkKKyAgICAgIHsKKyAgICAgICAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2RlLCBleHBlY3RlZFRleHQpOworICAgICAgfQorICAgIGVsc2UgaWYgKHBheWxvYWQudHlwZSgpID09IG5kbjo6dGx2OjpuZmQ6OkZhY2VFdmVudE5vdGlmaWNhdGlvbikKKyAgICAgIHsKKyAgICAgICAgdmFsaWRhdGVGYWNlRXZlbnQocGF5bG9hZCwgZXhwZWN0ZWRGYWNlRXZlbnQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgQk9PU1RfRkFJTCgiUmVjZWl2ZWQgdW5rbm93biBtZXNzYWdlIHR5cGU6ICMiIDw8IHBheWxvYWQudHlwZSgpKTsKKyAgICAgIH0KKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGVGYWNlRXZlbnQoY29uc3QgQmxvY2smIHdpcmUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpGYWNlRXZlbnROb3RpZmljYXRpb24mIGV4cGVjdGVkRmFjZUV2ZW50KQorICB7CisKKyAgICBtX3JlY2VpdmVkTm90aWZpY2F0aW9uID0gdHJ1ZTsKKworICAgIG5kbjo6bmZkOjpGYWNlRXZlbnROb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKHdpcmUpOworCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm90aWZpY2F0aW9uLmdldEtpbmQoKSwgZXhwZWN0ZWRGYWNlRXZlbnQuZ2V0S2luZCgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChub3RpZmljYXRpb24uZ2V0RmFjZUlkKCksIGV4cGVjdGVkRmFjZUV2ZW50LmdldEZhY2VJZCgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChub3RpZmljYXRpb24uZ2V0UmVtb3RlVXJpKCksIGV4cGVjdGVkRmFjZUV2ZW50LmdldFJlbW90ZVVyaSgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChub3RpZmljYXRpb24uZ2V0TG9jYWxVcmkoKSwgZXhwZWN0ZWRGYWNlRXZlbnQuZ2V0TG9jYWxVcmkoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm90aWZpY2F0aW9uLmdldEZhY2VTY29wZSgpLCBleHBlY3RlZEZhY2VFdmVudC5nZXRGYWNlU2NvcGUoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm90aWZpY2F0aW9uLmdldEZhY2VQZXJzaXN0ZW5jeSgpLCBleHBlY3RlZEZhY2VFdmVudC5nZXRGYWNlUGVyc2lzdGVuY3koKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm90aWZpY2F0aW9uLmdldExpbmtUeXBlKCksIGV4cGVjdGVkRmFjZUV2ZW50LmdldExpbmtUeXBlKCkpOworICB9CisKKyAgYm9vbAorICBkaWRSZWNlaXZlTm90aWNhdGlvbigpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9yZWNlaXZlZE5vdGlmaWNhdGlvbjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGJvb2wgbV9yZWNlaXZlZE5vdGlmaWNhdGlvbjsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKENyZWF0ZUZhY2VCYWRVcmksIEF1dGhvcml6ZWRDb21tYW5kRml4dHVyZTxGYWNlRml4dHVyZT4pCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0VXJpKCJ0Y3A0Oi8xMjcuMC4wLjE6NjM2MyIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcyIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImNyZWF0ZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICB9OworCisgIGNyZWF0ZUZhY2UoKmNvbW1hbmQsIHBhcmFtZXRlcnMpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoQ3JlYXRlRmFjZU5vbmNhbm9uaWNhbFVyaSwgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPEZhY2VGaXh0dXJlPikKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRVcmkoInRjcDovLzEyNy4wLjAuMSIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcyIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImNyZWF0ZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJOb24tY2Fub25pY2FsIFVSSSIpOworICB9OworCisgIGNyZWF0ZUZhY2UoKmNvbW1hbmQsIHBhcmFtZXRlcnMpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShDcmVhdGVGYWNlTWlzc2luZ1VyaSwgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPEZhY2VGaXh0dXJlPikKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJjcmVhdGUiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBjcmVhdGVGYWNlKCpjb21tYW5kLCBwYXJhbWV0ZXJzKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoQ3JlYXRlRmFjZVVua25vd25TY2hlbWUsIEF1dGhvcml6ZWRDb21tYW5kRml4dHVyZTxGYWNlRml4dHVyZT4pCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIC8vIHRoaXMgd2lsbCBiZSBhbiB1bnN1cHBvcnRlZCBwcm90b2NvbCBiZWNhdXNlIG5vIGZhY3RvcmllcyBoYXZlIGJlZW4KKyAgLy8gYWRkZWQgdG8gdGhlIGZhY2UgbWFuYWdlcgorICBwYXJhbWV0ZXJzLnNldFVyaSgidGNwNDovLzEyNy4wLjAuMTo2MzYzIik7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgiY3JlYXRlIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBjb21tYW5kLT5nZXROYW1lKCksIDUwMSwgIlVuc3VwcG9ydGVkIHByb3RvY29sIik7CisgIH07CisKKyAgY3JlYXRlRmFjZSgqY29tbWFuZCwgcGFyYW1ldGVycyk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKE9uQ3JlYXRlZCwgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPEZhY2VGaXh0dXJlPikKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRVcmkoInRjcDQ6Ly8xMjcuMC4wLjE6NjM2MyIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcyIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImNyZWF0ZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgQ29udHJvbFBhcmFtZXRlcnMgcmVzdWx0UGFyYW1ldGVyczsKKyAgcmVzdWx0UGFyYW1ldGVycy5zZXRVcmkoImR1bW15Oi8vIik7CisgIHJlc3VsdFBhcmFtZXRlcnMuc2V0RmFjZUlkKEZBQ0VJRF9SRVNFUlZFRF9NQVggKyAxKTsKKworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZHVtbXkobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICBuZG46Om5mZDo6RmFjZUV2ZW50Tm90aWZpY2F0aW9uIGV4cGVjdGVkRmFjZUV2ZW50OworICBleHBlY3RlZEZhY2VFdmVudC5zZXRLaW5kKG5kbjo6bmZkOjpGQUNFX0VWRU5UX0NSRUFURUQpCisgICAgICAgICAgICAgICAgICAgLnNldEZhY2VJZChGQUNFSURfUkVTRVJWRURfTUFYICsgMSkKKyAgICAgICAgICAgICAgICAgICAuc2V0UmVtb3RlVXJpKGR1bW15LT5nZXRSZW1vdGVVcmkoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgIC5zZXRMb2NhbFVyaShkdW1teS0+Z2V0TG9jYWxVcmkoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgIC5zZXRGYWNlU2NvcGUobmRuOjpuZmQ6OkZBQ0VfU0NPUEVfTk9OX0xPQ0FMKQorICAgICAgICAgICAgICAgICAgIC5zZXRGYWNlUGVyc2lzdGVuY3kobmRuOjpuZmQ6OkZBQ0VfUEVSU0lTVEVOQ1lfUEVSU0lTVEVOVCk7CisKKyAgQmxvY2sgZW5jb2RlZFJlc3VsdFBhcmFtZXRlcnMocmVzdWx0UGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPQorICBbdGhpcywgY29tbWFuZCwgZW5jb2RlZFJlc3VsdFBhcmFtZXRlcnMsIGV4cGVjdGVkRmFjZUV2ZW50XSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT5jYWxsYmFja0Rpc3BhdGNoKHJlc3BvbnNlLGNvbW1hbmQtPmdldE5hbWUoKSwgMjAwLCAiU3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUmVzdWx0UGFyYW1ldGVycywgZXhwZWN0ZWRGYWNlRXZlbnQpOworICB9OworCisgIG9uQ3JlYXRlZChjb21tYW5kLT5nZXROYW1lKCksIHBhcmFtZXRlcnMsIGR1bW15KTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgQk9PU1RfUkVRVUlSRShkaWRSZWNlaXZlTm90aWNhdGlvbigpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoT25Db25uZWN0RmFpbGVkLCBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8RmFjZUZpeHR1cmU+KQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldFVyaSgidGNwNDovLzEyNy4wLjAuMTo2MzYzIik7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgiY3JlYXRlIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBjb21tYW5kLT5nZXROYW1lKCksIDQwOCwgInVuaXQtdGVzdC1yZWFzb24iKTsKKyAgfTsKKworICBvbkNvbm5lY3RGYWlsZWQoY29tbWFuZC0+Z2V0TmFtZSgpLCAidW5pdC10ZXN0LXJlYXNvbiIpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworICBCT09TVF9DSEVDS19FUVVBTChkaWRSZWNlaXZlTm90aWNhdGlvbigpLCBmYWxzZSk7Cit9CisKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoRGVzdHJveUZhY2UsIEF1dGhvcml6ZWRDb21tYW5kRml4dHVyZTxGYWNlRml4dHVyZT4pCit7CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBkdW1teShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworICBGYWNlVGFibGVGaXh0dXJlOjptX2ZhY2VUYWJsZS5hZGQoZHVtbXkpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKGR1bW15LT5nZXRJZCgpKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJkZXN0cm95Iik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBuZG46Om5mZDo6RmFjZUV2ZW50Tm90aWZpY2F0aW9uIGV4cGVjdGVkRmFjZUV2ZW50OworICBleHBlY3RlZEZhY2VFdmVudC5zZXRLaW5kKG5kbjo6bmZkOjpGQUNFX0VWRU5UX0RFU1RST1lFRCkKKyAgICAgICAgICAgICAgICAgICAuc2V0RmFjZUlkKGR1bW15LT5nZXRJZCgpKQorICAgICAgICAgICAgICAgICAgIC5zZXRSZW1vdGVVcmkoZHVtbXktPmdldFJlbW90ZVVyaSgpLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgLnNldExvY2FsVXJpKGR1bW15LT5nZXRMb2NhbFVyaSgpLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgLnNldEZhY2VTY29wZShuZG46Om5mZDo6RkFDRV9TQ09QRV9OT05fTE9DQUwpCisgICAgICAgICAgICAgICAgICAgLnNldEZhY2VQZXJzaXN0ZW5jeShuZG46Om5mZDo6RkFDRV9QRVJTSVNURU5DWV9QRVJTSVNURU5UKTsKKworICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0KKyAgW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzLCBleHBlY3RlZEZhY2VFdmVudF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+Y2FsbGJhY2tEaXNwYXRjaChyZXNwb25zZSxjb21tYW5kLT5nZXROYW1lKCksIDIwMCwgIlN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMsIGV4cGVjdGVkRmFjZUV2ZW50KTsKKyAgfTsKKworICBkZXN0cm95RmFjZSgqY29tbWFuZCwgcGFyYW1ldGVycyk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoZGlkUmVjZWl2ZU5vdGljYXRpb24oKSk7Cit9CisKK2NsYXNzIEZhY2VMaXN0Rml4dHVyZSA6IHB1YmxpYyBGYWNlU3RhdHVzUHVibGlzaGVyRml4dHVyZQoreworcHVibGljOgorICBGYWNlTGlzdEZpeHR1cmUoKQorICAgIDogbV9tYW5hZ2VyKG1fdGFibGUsIG1fZmFjZSwgbV90ZXN0S2V5Q2hhaW4pCisgIHsKKworICB9CisKKyAgdmlydHVhbAorICB+RmFjZUxpc3RGaXh0dXJlKCkKKyAgeworCisgIH0KKworcHJvdGVjdGVkOgorICBGYWNlTWFuYWdlciBtX21hbmFnZXI7CisgIG5kbjo6S2V5Q2hhaW4gbV90ZXN0S2V5Q2hhaW47Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShUZXN0RmFjZUxpc3QsIEZhY2VMaXN0Rml4dHVyZSkKK3sKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvbGlzdCIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworCisgIC8vIE1BWF9TRUdNRU5UX1NJWkUgPT0gNDQwMCwgRmFjZVN0YXR1cyBzaXplIHdpdGggZmlsbGVyIGNvdW50ZXJzIGlzIDc1CisgIC8vIHVzZSA1OSBGYWNlU3RhdHVzZXMgdG8gZm9yY2UgYSBGYWNlU3RhdHVzIHRvIHNwYW4gRGF0YSBwYWNrZXRzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTk7IGkrKykKKyAgICB7CisgICAgICBzaGFyZWRfcHRyPFRlc3RDb3VudGVyc0ZhY2U+IGR1bW15KG1ha2Vfc2hhcmVkPFRlc3RDb3VudGVyc0ZhY2U+KCkpOworCisgICAgICB1aW50NjRfdCBmaWxsZXIgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkgLSAxOworICAgICAgZHVtbXktPnNldENvdW50ZXJzKGZpbGxlciwgZmlsbGVyLCBmaWxsZXIsIGZpbGxlciwgZmlsbGVyLCBmaWxsZXIpOworCisgICAgICBtX3JlZmVyZW5jZUZhY2VzLnB1c2hfYmFjayhkdW1teSk7CisKKyAgICAgIGFkZChkdW1teSk7CisgICAgfQorCisgIG5kbjo6RW5jb2RpbmdCdWZmZXIgYnVmZmVyOworCisgIG1fZmFjZS0+b25SZWNlaXZlRGF0YSArPQorICAgIGJpbmQoJkZhY2VTdGF0dXNQdWJsaXNoZXJGaXh0dXJlOjpkZWNvZGVGYWNlU3RhdHVzQmxvY2ssIHRoaXMsIF8xKTsKKworICBtX21hbmFnZXIubGlzdEZhY2VzKCpjb21tYW5kKTsKKyAgQk9PU1RfUkVRVUlSRShtX2ZpbmlzaGVkKTsKK30KKworY2xhc3MgQ2hhbm5lbFN0YXR1c0ZpeHR1cmUgOiBwdWJsaWMgRmFjZU1hbmFnZXJGaXh0dXJlCit7CitwdWJsaWM6CisgIHZvaWQKKyAgdmFsaWRhdGVQdWJsaXNoKGNvbnN0IERhdGEmIGRhdGEsIGNvbnN0IG5kbjo6bmZkOjpDaGFubmVsU3RhdHVzJiBleHBlY3RlZEVudHJ5KQorICB7CisgICAgbV9jYWxsYmFja0ZpcmVkID0gdHJ1ZTsKKyAgICBCbG9jayBiID0gZGF0YS5nZXRDb250ZW50KCkuYmxvY2tGcm9tVmFsdWUoKTsKKyAgICBuZG46Om5mZDo6Q2hhbm5lbFN0YXR1cyBlbnRyeShiKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS5nZXRMb2NhbFVyaSgpLCBleHBlY3RlZEVudHJ5LmdldExvY2FsVXJpKCkpOworICB9CisKKyAgdmlydHVhbCBzaGFyZWRfcHRyPER1bW15UHJvdG9jb2xGYWN0b3J5PgorICBhZGRQcm90b2NvbEZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3RvY29sKQorICB7CisgICAgc2hhcmVkX3B0cjxEdW1teVByb3RvY29sRmFjdG9yeT4gZmFjdG9yeShtYWtlX3NoYXJlZDxEdW1teVByb3RvY29sRmFjdG9yeT4oKSk7CisgICAgbV9tYW5hZ2VyLm1fZmFjdG9yaWVzW3Byb3RvY29sXSA9IGZhY3Rvcnk7CisKKyAgICByZXR1cm4gZmFjdG9yeTsKKyAgfQorfTsKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVGVzdENoYW5uZWxTdGF0dXMsIENoYW5uZWxTdGF0dXNGaXh0dXJlKQoreworICBzaGFyZWRfcHRyPER1bW15UHJvdG9jb2xGYWN0b3J5PiBmYWN0b3J5KGFkZFByb3RvY29sRmFjdG9yeSgiZHVtbXkiKSk7CisgIGZhY3RvcnktPmFkZENoYW5uZWwoImR1bW15Oi8vIik7CisKKyAgTmFtZSByZXF1ZXN0TmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvY2hhbm5lbHMiKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gcmVxdWVzdChtYWtlX3NoYXJlZDxJbnRlcmVzdD4ocmVxdWVzdE5hbWUpKTsKKworICBuZG46Om5mZDo6Q2hhbm5lbFN0YXR1cyBleHBlY3RlZEVudHJ5OworICBleHBlY3RlZEVudHJ5LnNldExvY2FsVXJpKER1bW15Q2hhbm5lbCgiZHVtbXk6Ly8iKS5nZXRVcmkoKS50b1N0cmluZygpKTsKKworICBtX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0KKyAgICBiaW5kKCZDaGFubmVsU3RhdHVzRml4dHVyZTo6dmFsaWRhdGVQdWJsaXNoLCB0aGlzLCBfMSwgZXhwZWN0ZWRFbnRyeSk7CisKKyAgbV9tYW5hZ2VyLmxpc3RDaGFubmVscygqcmVxdWVzdCk7CisgIEJPT1NUX1JFUVVJUkUobV9jYWxsYmFja0ZpcmVkKTsKK30KKworY2xhc3MgRmFjZVF1ZXJ5TGlzdEZpeHR1cmUgOiBwdWJsaWMgRmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyRml4dHVyZQoreworcHVibGljOgorICBGYWNlUXVlcnlMaXN0Rml4dHVyZSgpCisgICAgOiBtX21hbmFnZXIobV90YWJsZSwgbV9mYWNlLCBtX3Rlc3RLZXlDaGFpbikKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5GYWNlUXVlcnlMaXN0Rml4dHVyZSgpCisgIHsKKworICB9CisKK3Byb3RlY3RlZDoKKyAgRmFjZU1hbmFnZXIgbV9tYW5hZ2VyOworICBuZG46OktleUNoYWluIG1fdGVzdEtleUNoYWluOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVGVzdFZhbGlkUXVlcnlGaWx0ZXIsIEZhY2VRdWVyeUxpc3RGaXh0dXJlKQoreworICBOYW1lIHF1ZXJ5TmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvcXVlcnkiKTsKKyAgbmRuOjpuZmQ6OkZhY2VRdWVyeUZpbHRlciBxdWVyeUZpbHRlcjsKKyAgcXVlcnlGaWx0ZXIuc2V0VXJpU2NoZW1lKCJkdW1teSIpOworICBxdWVyeU5hbWUuYXBwZW5kKHF1ZXJ5RmlsdGVyLndpcmVFbmNvZGUoKSk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gcXVlcnkobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KHF1ZXJ5TmFtZSkpOworCisgIC8vIGFkZCBleHBlY3RlZCBmYWNlcworICBzaGFyZWRfcHRyPER1bW15TG9jYWxGYWNlPiBleHBlY3RlZEZhY2UxKG1ha2Vfc2hhcmVkPER1bW15TG9jYWxGYWNlPigpKTsKKyAgbV9yZWZlcmVuY2VGYWNlcy5wdXNoX2JhY2soZXhwZWN0ZWRGYWNlMSk7CisgIGFkZChleHBlY3RlZEZhY2UxKTsKKworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZXhwZWN0ZWRGYWNlMihtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworICBtX3JlZmVyZW5jZUZhY2VzLnB1c2hfYmFjayhleHBlY3RlZEZhY2UyKTsKKyAgYWRkKGV4cGVjdGVkRmFjZTIpOworCisgIC8vIGFkZCBvdGhlciBmYWNlcworICBzaGFyZWRfcHRyPER1bW15RmFjZT4gZmFjZTEobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigidWRwOi8vIiwgInVkcDovLyIpKTsKKyAgYWRkKGZhY2UxKTsKKyAgc2hhcmVkX3B0cjxEdW1teUxvY2FsRmFjZT4gZmFjZTIobWFrZV9zaGFyZWQ8RHVtbXlMb2NhbEZhY2U+KCJ0Y3A6Ly8iLCAidGNwOi8vIikpOworICBhZGQoZmFjZTIpOworCisgIG1fZmFjZS0+b25SZWNlaXZlRGF0YSArPQorICAgIGJpbmQoJkZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlckZpeHR1cmU6OmRlY29kZUZhY2VTdGF0dXNCbG9jaywgdGhpcywgXzEpOworCisgIG1fbWFuYWdlci5saXN0UXVlcmllZEZhY2VzKCpxdWVyeSk7CisgIEJPT1NUX1JFUVVJUkUobV9maW5pc2hlZCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFRlc3RJbnZhbGlkUXVlcnlGaWx0ZXIsIEZhY2VRdWVyeUxpc3RGaXh0dXJlKQoreworICBOYW1lIHF1ZXJ5TmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvcXVlcnkiKTsKKyAgbmRuOjpuZmQ6OkZhY2VTdGF0dXMgcXVlcnlGaWx0ZXI7CisgIHF1ZXJ5TmFtZS5hcHBlbmQocXVlcnlGaWx0ZXIud2lyZUVuY29kZSgpKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBxdWVyeShtYWtlX3NoYXJlZDxJbnRlcmVzdD4ocXVlcnlOYW1lKSk7CisKKyAgc2hhcmVkX3B0cjxEdW1teUxvY2FsRmFjZT4gZmFjZShtYWtlX3NoYXJlZDxEdW1teUxvY2FsRmFjZT4oKSk7CisgIGFkZChmYWNlKTsKKworICBtX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0KKyAgICBiaW5kKCZGYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXJGaXh0dXJlOjpkZWNvZGVOYWNrQmxvY2ssIHRoaXMsIF8xKTsKKworICBtX21hbmFnZXIubGlzdFF1ZXJpZWRGYWNlcygqcXVlcnkpOworICBCT09TVF9SRVFVSVJFKG1fZmluaXNoZWQpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZhY2UtcXVlcnktc3RhdHVzLXB1Ymxpc2hlci1jb21tb24uaHBwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZhY2UtcXVlcnktc3RhdHVzLXB1Ymxpc2hlci1jb21tb24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzRjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1xdWVyeS1zdGF0dXMtcHVibGlzaGVyLWNvbW1vbi5ocHAKQEAgLTAsMCArMSwxNjMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX1RFU1RTX05GRF9NR01UX0ZBQ0VfUVVFUllfU1RBVFVTX1BVQkxJU0hFUl9DT01NT05fSFBQCisjZGVmaW5lIE5GRF9URVNUU19ORkRfTUdNVF9GQUNFX1FVRVJZX1NUQVRVU19QVUJMSVNIRVJfQ09NTU9OX0hQUAorCisjaW5jbHVkZSAibWdtdC9mYWNlLXF1ZXJ5LXN0YXR1cy1wdWJsaXNoZXIuaHBwIgorI2luY2x1ZGUgIm1nbXQvYXBwLWZhY2UuaHBwIgorI2luY2x1ZGUgIm1nbXQvaW50ZXJuYWwtZmFjZS5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJmYWNlL3VkcC1mYWN0b3J5LmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1mYWNlLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtZmFjZS1zdGF0dXMuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK2NsYXNzIEZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUgOiBwdWJsaWMgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKworICBGYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXJGaXh0dXJlKCkKKyAgICA6IG1fdGFibGUobV9mb3J3YXJkZXIpCisgICAgLCBtX2ZhY2UobWFrZV9zaGFyZWQ8SW50ZXJuYWxGYWNlPigpKQorICAgICwgbV9kdW1teUZhY2UobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKQorICAgICwgbV9kdW1teUxvY2FsRmFjZShtYWtlX3NoYXJlZDxEdW1teUxvY2FsRmFjZT4oKSkKKyAgICAsIG1fZHVtbXlVcmkobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigiZHVtbXk6Ly9yZW1vdGVVcmkiLCAiZHVtbXk6Ly9sb2NhbFVyaSIpKQorICAgICwgbV9mYWN0b3J5KFVkcEZhY3RvcnkoKSkKKyAgICAsIG1fZmluaXNoZWQoZmFsc2UpCisgIHsKKyAgfQorCisgIHZpcnR1YWwKKyAgfkZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUoKQorICB7CisgIH0KKworICB2b2lkCisgIGFkZChzaGFyZWRfcHRyPEZhY2U+IGZhY2UpCisgIHsKKyAgICBtX3RhYmxlLmFkZChmYWNlKTsKKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGVGYWNlU3RhdHVzKGNvbnN0IEJsb2NrJiBzdGF0dXNCbG9jaywgY29uc3Qgc2hhcmVkX3B0cjxGYWNlPiYgcmVmZXJlbmNlKQorICB7CisgICAgbmRuOjpuZmQ6OkZhY2VTdGF0dXMgc3RhdHVzOworICAgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1coc3RhdHVzLndpcmVEZWNvZGUoc3RhdHVzQmxvY2spKTsKKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXRGYWNlSWQoKSwgcmVmZXJlbmNlLT5nZXRJZCgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0UmVtb3RlVXJpKCksIHJlZmVyZW5jZS0+Z2V0UmVtb3RlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldExvY2FsVXJpKCksIHJlZmVyZW5jZS0+Z2V0TG9jYWxVcmkoKS50b1N0cmluZygpKTsKKworICAgIGlmIChyZWZlcmVuY2UtPmlzTG9jYWwoKSkgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldEZhY2VTY29wZSgpLCBuZG46Om5mZDo6RkFDRV9TQ09QRV9MT0NBTCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldEZhY2VTY29wZSgpLCBuZG46Om5mZDo6RkFDRV9TQ09QRV9OT05fTE9DQUwpOworICAgIH0KKworICAgIGlmIChyZWZlcmVuY2UtPmlzT25EZW1hbmQoKSkgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldEZhY2VQZXJzaXN0ZW5jeSgpLCBuZG46Om5mZDo6RkFDRV9QRVJTSVNURU5DWV9PTl9ERU1BTkQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXRGYWNlUGVyc2lzdGVuY3koKSwgbmRuOjpuZmQ6OkZBQ0VfUEVSU0lTVEVOQ1lfUEVSU0lTVEVOVCk7CisgICAgfQorCisgICAgaWYgKHJlZmVyZW5jZS0+aXNNdWx0aUFjY2VzcygpKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0TGlua1R5cGUoKSwgbmRuOjpuZmQ6OkxJTktfVFlQRV9NVUxUSV9BQ0NFU1MpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXRMaW5rVHlwZSgpLCBuZG46Om5mZDo6TElOS19UWVBFX1BPSU5UX1RPX1BPSU5UKTsKKyAgICB9CisgIH0KKworICB2b2lkCisgIGRlY29kZUZhY2VTdGF0dXNCbG9jayhjb25zdCBEYXRhJiBkYXRhKQorICB7CisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChkYXRhLmdldENvbnRlbnRUeXBlKCksIHRsdjo6Q29udGVudFR5cGVfQmxvYik7CisKKyAgICBCbG9jayBwYXlsb2FkID0gZGF0YS5nZXRDb250ZW50KCk7CisgICAgbV9idWZmZXIuYXBwZW5kQnl0ZUFycmF5KHBheWxvYWQudmFsdWUoKSwgcGF5bG9hZC52YWx1ZV9zaXplKCkpOworCisgICAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coZGF0YS5nZXROYW1lKClbLTFdLnRvU2VnbWVudCgpKTsKKyAgICBpZiAoZGF0YS5nZXRGaW5hbEJsb2NrSWQoKSAhPSBkYXRhLmdldE5hbWUoKVstMV0pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdyYXAgdGhlIEZhY2UgU3RhdHVzZXMgaW4gYSBzaW5nbGUgQ29udGVudCBUTFYgZm9yIGVhc3kgcGFyc2luZworICAgIG1fYnVmZmVyLnByZXBlbmRWYXJOdW1iZXIobV9idWZmZXIuc2l6ZSgpKTsKKyAgICBtX2J1ZmZlci5wcmVwZW5kVmFyTnVtYmVyKHRsdjo6Q29udGVudCk7CisKKyAgICBuZG46OkJsb2NrIHBhcnNlcihtX2J1ZmZlci5idWYoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICBwYXJzZXIucGFyc2UoKTsKKworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwocGFyc2VyLmVsZW1lbnRzX3NpemUoKSwgbV9yZWZlcmVuY2VGYWNlcy5zaXplKCkpOworCisgICAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8RmFjZT4gPjo6Y29uc3RfaXRlcmF0b3IgaVJlZmVyZW5jZSA9IG1fcmVmZXJlbmNlRmFjZXMuYmVnaW4oKTsKKyAgICBmb3IgKEJsb2NrOjplbGVtZW50X2NvbnN0X2l0ZXJhdG9yIGkgPSBwYXJzZXIuZWxlbWVudHNfYmVnaW4oKTsKKyAgICAgICAgIGkgIT0gcGFyc2VyLmVsZW1lbnRzX2VuZCgpOworICAgICAgICAgKytpKSB7CisgICAgICBpZiAoaS0+dHlwZSgpICE9IG5kbjo6dGx2OjpuZmQ6OkZhY2VTdGF0dXMpIHsKKyAgICAgICAgICBCT09TVF9GQUlMKCJleHBlY3RlZCBmYWNlIHN0YXR1cywgZ290IHR5cGUgIyIgPDwgaS0+dHlwZSgpKTsKKyAgICAgIH0KKyAgICAgIHZhbGlkYXRlRmFjZVN0YXR1cygqaSwgKmlSZWZlcmVuY2UpOworICAgICAgKytpUmVmZXJlbmNlOworICAgIH0KKyAgICBtX2ZpbmlzaGVkID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQKKyAgZGVjb2RlTmFja0Jsb2NrKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBCT09TVF9SRVFVSVJFX0VRVUFMKGRhdGEuZ2V0Q29udGVudFR5cGUoKSwgdGx2OjpDb250ZW50VHlwZV9OYWNrKTsKKworICAgIG1fZmluaXNoZWQgPSB0cnVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgRm9yd2FyZGVyIG1fZm9yd2FyZGVyOworICBGYWNlVGFibGUgbV90YWJsZTsKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IG1fZmFjZTsKKyAgbmRuOjpFbmNvZGluZ0J1ZmZlciBtX2J1ZmZlcjsKKyAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8RmFjZT4gPiBtX3JlZmVyZW5jZUZhY2VzOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBtX2R1bW15RmFjZTsKKyAgc2hhcmVkX3B0cjxEdW1teUxvY2FsRmFjZT4gbV9kdW1teUxvY2FsRmFjZTsKKyAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IG1fZHVtbXlVcmk7CisgIFVkcEZhY3RvcnkgbV9mYWN0b3J5OworCitwcm90ZWN0ZWQ6CisgIGJvb2wgbV9maW5pc2hlZDsKK307CisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9URVNUU19ORkRfTUdNVF9GQUNFX1FVRVJZX1NUQVRVU19QVUJMSVNIRVJfQ09NTU9OX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZhY2UtcXVlcnktc3RhdHVzLXB1Ymxpc2hlci5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1xdWVyeS1zdGF0dXMtcHVibGlzaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhlZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZhY2UtcXVlcnktc3RhdHVzLXB1Ymxpc2hlci5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJmYWNlLXF1ZXJ5LXN0YXR1cy1wdWJsaXNoZXItY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitORkRfTE9HX0lOSVQoIkZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlclRlc3QiKTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKE1nbXRGYWNlUXVlcnlTYXR1c1B1Ymxpc2hlciwgRmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9Db25kaXRpb25GaWx0ZXIpCit7CisgIC8vIGZpbHRlciB3aXRob3V0IGNvbmRpdGlvbnMgbWF0Y2hlcyBhbGwgZmFjZXMKKyAgbmRuOjpuZmQ6OkZhY2VRdWVyeUZpbHRlciBmaWx0ZXI7CisgIEZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlciBmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIobV90YWJsZSwgKm1fZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvRmFjZVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgbV9rZXlDaGFpbik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyLmRvZXNNYXRjaEZpbHRlcihtX2R1bW15RmFjZSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKG1fZHVtbXlMb2NhbEZhY2UpLCB0cnVlKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQWxsQ29uZGl0aW9uRmlsdGVyKQoreworICBuZG46Om5mZDo6RmFjZVF1ZXJ5RmlsdGVyIGZpbHRlcjsKKyAgZmlsdGVyLnNldFVyaVNjaGVtZSgiZHVtbXkiKQorICAgICAgICAuc2V0UmVtb3RlVXJpKCJkdW1teTovLyIpCisgICAgICAgIC5zZXRMb2NhbFVyaSgiZHVtbXk6Ly8iKQorICAgICAgICAuc2V0RmFjZVNjb3BlKG5kbjo6bmZkOjpGQUNFX1NDT1BFX05PTl9MT0NBTCkKKyAgICAgICAgLnNldEZhY2VQZXJzaXN0ZW5jeShuZG46Om5mZDo6RkFDRV9QRVJTSVNURU5DWV9QRVJTSVNURU5UKQorICAgICAgICAuc2V0TGlua1R5cGUobmRuOjpuZmQ6OkxJTktfVFlQRV9QT0lOVF9UT19QT0lOVCk7CisKKyAgRmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyIGZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlcihtX3RhYmxlLCAqbV9mYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9GYWNlU3RhdHVzUHVibGlzaGVyRml4dHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBtX2tleUNoYWluKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyLmRvZXNNYXRjaEZpbHRlcihtX2R1bW15RmFjZSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKG1fZHVtbXlMb2NhbEZhY2UpLCBmYWxzZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFVyaVNjaGVtZUZpbHRlcikKK3sKKyAgbmRuOjpuZmQ6OkZhY2VRdWVyeUZpbHRlciBmaWx0ZXI7CisgIGZpbHRlci5zZXRVcmlTY2hlbWUoImR1bW15dXJpc2NoZW1lIik7CisgIEZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlciBmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIobV90YWJsZSwgKm1fZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvRmFjZVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgbV9rZXlDaGFpbik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlci5kb2VzTWF0Y2hGaWx0ZXIobV9kdW1teUZhY2UpLCBmYWxzZSk7CisgIGF1dG8gZHVtbXlVcmlTY2hlbWUgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCJkdW1teXVyaXNjaGVtZTovLyIsICJkdW1teXVyaXNjaGVtZTovLyIpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKGR1bW15VXJpU2NoZW1lKSwgdHJ1ZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFJlbW90ZVVyaUZpbHRlcikKK3sKKyAgbmRuOjpuZmQ6OkZhY2VRdWVyeUZpbHRlciBmaWx0ZXI7CisgIGZpbHRlci5zZXRSZW1vdGVVcmkoImR1bW15Oi8vcmVtb3RlVXJpIik7CisgIEZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlciBmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIobV90YWJsZSwgKm1fZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvRmFjZVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgbV9rZXlDaGFpbik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlci5kb2VzTWF0Y2hGaWx0ZXIobV9kdW1teUZhY2UpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2VRdWVyeVN0YXR1c1B1Ymxpc2hlci5kb2VzTWF0Y2hGaWx0ZXIobV9kdW1teVVyaSksIHRydWUpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShMb2NhbFVyaUZpbHRlcikKK3sKKyAgbmRuOjpuZmQ6OkZhY2VRdWVyeUZpbHRlciBmaWx0ZXI7CisgIGZpbHRlci5zZXRMb2NhbFVyaSgiZHVtbXk6Ly9sb2NhbFVyaSIpOworICBGYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIgZmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyKG1fdGFibGUsICptX2ZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL0ZhY2VTdGF0dXNQdWJsaXNoZXJGaXh0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIG1fa2V5Q2hhaW4pOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKG1fZHVtbXlGYWNlKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKG1fZHVtbXlVcmkpLCB0cnVlKTsKK30KKworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShMaW5rVHlwZUZpbHRlcikKK3sKKyAgc2hhcmVkX3B0cjxNdWx0aWNhc3RVZHBGYWNlPiBtdWx0aWNhc3RGYWNlID0gbV9mYWN0b3J5LmNyZWF0ZU11bHRpY2FzdEZhY2UoIjAuMC4wLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjI0LjAuMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDcwIik7CisgIG5kbjo6bmZkOjpGYWNlUXVlcnlGaWx0ZXIgZmlsdGVyOworICBmaWx0ZXIuc2V0TGlua1R5cGUobmRuOjpuZmQ6OkxJTktfVFlQRV9NVUxUSV9BQ0NFU1MpOworICBGYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIgZmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyKG1fdGFibGUsICptX2ZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL0ZhY2VTdGF0dXNQdWJsaXNoZXJGaXh0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIG1fa2V5Q2hhaW4pOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKG1fZHVtbXlGYWNlKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKG11bHRpY2FzdEZhY2UpLCB0cnVlKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUGVyc2lzdGVuY3lGaWx0ZXIpCit7CisgIHNoYXJlZF9wdHI8TXVsdGljYXN0VWRwRmFjZT4gbXVsdGljYXN0RmFjZSA9IG1fZmFjdG9yeS5jcmVhdGVNdWx0aWNhc3RGYWNlKCIwLjAuMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIyNC4wLjAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA3MCIpOworICBuZG46Om5mZDo6RmFjZVF1ZXJ5RmlsdGVyIGZpbHRlcjsKKyAgZmlsdGVyLnNldEZhY2VQZXJzaXN0ZW5jeShuZG46Om5mZDo6RkFDRV9QRVJTSVNURU5DWV9PTl9ERU1BTkQpOworICBGYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIgZmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyKG1fdGFibGUsICptX2ZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL0ZhY2VTdGF0dXNQdWJsaXNoZXJGaXh0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIG1fa2V5Q2hhaW4pOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlUXVlcnlTdGF0dXNQdWJsaXNoZXIuZG9lc01hdGNoRmlsdGVyKG1fZHVtbXlGYWNlKSwgZmFsc2UpOworICBtdWx0aWNhc3RGYWNlLT5zZXRPbkRlbWFuZCh0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZVF1ZXJ5U3RhdHVzUHVibGlzaGVyLmRvZXNNYXRjaEZpbHRlcihtdWx0aWNhc3RGYWNlKSwgdHJ1ZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1zdGF0dXMtcHVibGlzaGVyLWNvbW1vbi5ocHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1zdGF0dXMtcHVibGlzaGVyLWNvbW1vbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmNDkxMwotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9mYWNlLXN0YXR1cy1wdWJsaXNoZXItY29tbW9uLmhwcApAQCAtMCwwICsxLDIyMCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfVEVTVFNfTkZEX01HTVRfRkFDRV9TVEFUVVNfUFVCTElTSEVSX0NPTU1PTl9IUFAKKyNkZWZpbmUgTkZEX1RFU1RTX05GRF9NR01UX0ZBQ0VfU1RBVFVTX1BVQkxJU0hFUl9DT01NT05fSFBQCisKKyNpbmNsdWRlICJtZ210L2ZhY2Utc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisjaW5jbHVkZSAibWdtdC9hcHAtZmFjZS5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJmdy9mb3J3YXJkZXIuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2RhZW1vbi9mYWNlL2R1bW15LWZhY2UuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1mYWNlLXN0YXR1cy5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworY2xhc3MgVGVzdENvdW50ZXJzRmFjZSA6IHB1YmxpYyBEdW1teUZhY2UKK3sKK3B1YmxpYzoKKworICBUZXN0Q291bnRlcnNGYWNlKCkKKyAgeworICB9CisKKyAgdmlydHVhbAorICB+VGVzdENvdW50ZXJzRmFjZSgpCisgIHsKKyAgfQorCisgIHZvaWQKKyAgc2V0Q291bnRlcnMoUGFja2V0Q291bnRlcjo6cmVwIG5JbkludGVyZXN0cywKKyAgICAgICAgICAgICAgUGFja2V0Q291bnRlcjo6cmVwIG5JbkRhdGFzLAorICAgICAgICAgICAgICBQYWNrZXRDb3VudGVyOjpyZXAgbk91dEludGVyZXN0cywKKyAgICAgICAgICAgICAgUGFja2V0Q291bnRlcjo6cmVwIG5PdXREYXRhcywKKyAgICAgICAgICAgICAgQnl0ZUNvdW50ZXI6OnJlcCBuSW5CeXRlcywKKyAgICAgICAgICAgICAgQnl0ZUNvdW50ZXI6OnJlcCBuT3V0Qnl0ZXMpCisgIHsKKyAgICBGYWNlQ291bnRlcnMmIGNvdW50ZXJzID0gZ2V0TXV0YWJsZUNvdW50ZXJzKCk7CisgICAgY291bnRlcnMuZ2V0TkluSW50ZXJlc3RzKCkuc2V0KG5JbkludGVyZXN0cyk7CisgICAgY291bnRlcnMuZ2V0TkluRGF0YXMoKS5zZXQobkluRGF0YXMpOworICAgIGNvdW50ZXJzLmdldE5PdXRJbnRlcmVzdHMoKS5zZXQobk91dEludGVyZXN0cyk7CisgICAgY291bnRlcnMuZ2V0Tk91dERhdGFzKCkuc2V0KG5PdXREYXRhcyk7CisgICAgY291bnRlcnMuZ2V0TkluQnl0ZXMoKS5zZXQobkluQnl0ZXMpOworICAgIGNvdW50ZXJzLmdldE5PdXRCeXRlcygpLnNldChuT3V0Qnl0ZXMpOworICB9CisKKworfTsKKworc3RhdGljIGlubGluZSB1aW50NjRfdAorcmVhZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUoY29uc3QgQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSkKK3sKKyAgaWYgKGJsb2NrLnR5cGUoKSA9PSB0eXBlKQorICAgIHsKKyAgICAgIHJldHVybiByZWFkTm9uTmVnYXRpdmVJbnRlZ2VyKGJsb2NrKTsKKyAgICB9CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yOworICBlcnJvciA8PCAiZXhwZWN0ZWQgdHlwZSAiIDw8IHR5cGUgPDwgIiBnb3QgIiA8PCBibG9jay50eXBlKCk7CisgIHRocm93IHRsdjo6RXJyb3IoZXJyb3Iuc3RyKCkpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90CitjaGVja2VkUmVhZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUoQmxvY2s6OmVsZW1lbnRfY29uc3RfaXRlcmF0b3ImIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2s6OmVsZW1lbnRfY29uc3RfaXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUpCit7CisgIGlmIChpICE9IGVuZCkKKyAgICB7CisgICAgICBjb25zdCBCbG9jayYgYmxvY2sgPSAqaTsKKyAgICAgICsraTsKKyAgICAgIHJldHVybiByZWFkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZShibG9jaywgdHlwZSk7CisgICAgfQorICB0aHJvdyB0bHY6OkVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBGYWNlU3RhdHVzIik7Cit9CisKK2NsYXNzIEZhY2VTdGF0dXNQdWJsaXNoZXJGaXh0dXJlIDogcHVibGljIEJhc2VGaXh0dXJlCit7CitwdWJsaWM6CisKKyAgRmFjZVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUoKQorICAgIDogbV90YWJsZShtX2ZvcndhcmRlcikKKyAgICAsIG1fZmFjZShtYWtlX3NoYXJlZDxJbnRlcm5hbEZhY2U+KCkpCisgICAgLCBtX3B1Ymxpc2hlcihtX3RhYmxlLCAqbV9mYWNlLCAiL2xvY2FsaG9zdC9uZmQvRmFjZVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUiLCBtX2tleUNoYWluKQorICAgICwgbV9maW5pc2hlZChmYWxzZSkKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5GYWNlU3RhdHVzUHVibGlzaGVyRml4dHVyZSgpCisgIHsKKworICB9CisKKyAgdm9pZAorICBhZGQoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKQorICB7CisgICAgbV90YWJsZS5hZGQoZmFjZSk7CisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlRmFjZVN0YXR1cyhjb25zdCBCbG9jayYgc3RhdHVzQmxvY2ssIGNvbnN0IHNoYXJlZF9wdHI8RmFjZT4mIHJlZmVyZW5jZSkKKyAgeworICAgIG5kbjo6bmZkOjpGYWNlU3RhdHVzIHN0YXR1czsKKyAgICBCT09TVF9SRVFVSVJFX05PX1RIUk9XKHN0YXR1cy53aXJlRGVjb2RlKHN0YXR1c0Jsb2NrKSk7CisgICAgY29uc3QgRmFjZUNvdW50ZXJzJiBjb3VudGVycyA9IHJlZmVyZW5jZS0+Z2V0Q291bnRlcnMoKTsKKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXRGYWNlSWQoKSwgcmVmZXJlbmNlLT5nZXRJZCgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0UmVtb3RlVXJpKCksIHJlZmVyZW5jZS0+Z2V0UmVtb3RlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldExvY2FsVXJpKCksIHJlZmVyZW5jZS0+Z2V0TG9jYWxVcmkoKS50b1N0cmluZygpKTsKKworICAgIGlmIChyZWZlcmVuY2UtPmlzTG9jYWwoKSkgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldEZhY2VTY29wZSgpLCBuZG46Om5mZDo6RkFDRV9TQ09QRV9MT0NBTCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldEZhY2VTY29wZSgpLCBuZG46Om5mZDo6RkFDRV9TQ09QRV9OT05fTE9DQUwpOworICAgIH0KKworICAgIGlmIChyZWZlcmVuY2UtPmlzT25EZW1hbmQoKSkgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldEZhY2VQZXJzaXN0ZW5jeSgpLCBuZG46Om5mZDo6RkFDRV9QRVJTSVNURU5DWV9PTl9ERU1BTkQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXRGYWNlUGVyc2lzdGVuY3koKSwgbmRuOjpuZmQ6OkZBQ0VfUEVSU0lTVEVOQ1lfUEVSU0lTVEVOVCk7CisgICAgfQorCisgICAgaWYgKHJlZmVyZW5jZS0+aXNNdWx0aUFjY2VzcygpKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0TGlua1R5cGUoKSwgbmRuOjpuZmQ6OkxJTktfVFlQRV9NVUxUSV9BQ0NFU1MpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXRMaW5rVHlwZSgpLCBuZG46Om5mZDo6TElOS19UWVBFX1BPSU5UX1RPX1BPSU5UKTsKKyAgICB9CisKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0TkluSW50ZXJlc3RzKCksIGNvdW50ZXJzLmdldE5JbkludGVyZXN0cygpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0TkluRGF0YXMoKSwgY291bnRlcnMuZ2V0TkluRGF0YXMoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldE5PdXRJbnRlcmVzdHMoKSwgY291bnRlcnMuZ2V0Tk91dEludGVyZXN0cygpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0Tk91dERhdGFzKCksIGNvdW50ZXJzLmdldE5PdXREYXRhcygpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0TkluQnl0ZXMoKSwgY291bnRlcnMuZ2V0TkluQnl0ZXMoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldE5PdXRCeXRlcygpLCBjb3VudGVycy5nZXROT3V0Qnl0ZXMoKSk7CisgIH0KKworICB2b2lkCisgIGRlY29kZUZhY2VTdGF0dXNCbG9jayhjb25zdCBEYXRhJiBkYXRhKQorICB7CisgICAgQmxvY2sgcGF5bG9hZCA9IGRhdGEuZ2V0Q29udGVudCgpOworCisgICAgbV9idWZmZXIuYXBwZW5kQnl0ZUFycmF5KHBheWxvYWQudmFsdWUoKSwgcGF5bG9hZC52YWx1ZV9zaXplKCkpOworCisgICAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coZGF0YS5nZXROYW1lKClbLTFdLnRvU2VnbWVudCgpKTsKKyAgICBpZiAoZGF0YS5nZXRGaW5hbEJsb2NrSWQoKSAhPSBkYXRhLmdldE5hbWUoKVstMV0pCisgICAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgIC8vIHdyYXAgdGhlIEZhY2UgU3RhdHVzZXMgaW4gYSBzaW5nbGUgQ29udGVudCBUTFYgZm9yIGVhc3kgcGFyc2luZworICAgIG1fYnVmZmVyLnByZXBlbmRWYXJOdW1iZXIobV9idWZmZXIuc2l6ZSgpKTsKKyAgICBtX2J1ZmZlci5wcmVwZW5kVmFyTnVtYmVyKHRsdjo6Q29udGVudCk7CisKKyAgICBuZG46OkJsb2NrIHBhcnNlcihtX2J1ZmZlci5idWYoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICBwYXJzZXIucGFyc2UoKTsKKworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwocGFyc2VyLmVsZW1lbnRzX3NpemUoKSwgbV9yZWZlcmVuY2VGYWNlcy5zaXplKCkpOworCisgICAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8RmFjZT4gPjo6Y29uc3RfaXRlcmF0b3IgaVJlZmVyZW5jZSA9IG1fcmVmZXJlbmNlRmFjZXMuYmVnaW4oKTsKKyAgICBmb3IgKEJsb2NrOjplbGVtZW50X2NvbnN0X2l0ZXJhdG9yIGkgPSBwYXJzZXIuZWxlbWVudHNfYmVnaW4oKTsKKyAgICAgICAgIGkgIT0gcGFyc2VyLmVsZW1lbnRzX2VuZCgpOworICAgICAgICAgKytpKQorICAgICAgeworICAgICAgICBpZiAoaS0+dHlwZSgpICE9IG5kbjo6dGx2OjpuZmQ6OkZhY2VTdGF0dXMpCisgICAgICAgICAgeworICAgICAgICAgICAgQk9PU1RfRkFJTCgiZXhwZWN0ZWQgZmFjZSBzdGF0dXMsIGdvdCB0eXBlICMiIDw8IGktPnR5cGUoKSk7CisgICAgICAgICAgfQorICAgICAgICB2YWxpZGF0ZUZhY2VTdGF0dXMoKmksICppUmVmZXJlbmNlKTsKKyAgICAgICAgKytpUmVmZXJlbmNlOworICAgICAgfQorICAgIG1fZmluaXNoZWQgPSB0cnVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgRm9yd2FyZGVyIG1fZm9yd2FyZGVyOworICBGYWNlVGFibGUgbV90YWJsZTsKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IG1fZmFjZTsKKyAgRmFjZVN0YXR1c1B1Ymxpc2hlciBtX3B1Ymxpc2hlcjsKKyAgbmRuOjpFbmNvZGluZ0J1ZmZlciBtX2J1ZmZlcjsKKyAgc3RkOjpsaXN0PHNoYXJlZF9wdHI8RmFjZT4gPiBtX3JlZmVyZW5jZUZhY2VzOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBtX2ZpbmlzaGVkOworfTsKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1RFU1RTX05GRF9NR01UX0ZBQ0VfU1RBVFVTX1BVQkxJU0hFUl9DT01NT05fSFBQCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1zdGF0dXMtcHVibGlzaGVyLmNwcCBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9mYWNlLXN0YXR1cy1wdWJsaXNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NWZlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmFjZS1zdGF0dXMtcHVibGlzaGVyLmNwcApAQCAtMCwwICsxLDY2IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZmFjZS1zdGF0dXMtcHVibGlzaGVyLWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTkZEX0xPR19JTklUKCJGYWNlU3RhdHVzUHVibGlzaGVyVGVzdCIpOworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoTWdtdEZhY2VTYXR1c1B1Ymxpc2hlciwgRmFjZVN0YXR1c1B1Ymxpc2hlckZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVuY29kaW5nRGVjb2RpbmcpCit7CisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL2xpc3QiKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKworICAvLyBNQVhfU0VHTUVOVF9TSVpFID09IDQ0MDAsIEZhY2VTdGF0dXMgc2l6ZSB3aXRoIGZpbGxlciBjb3VudGVycyBpcyA3NQorICAvLyB1c2UgNTkgRmFjZVN0YXR1c2VzIHRvIGZvcmNlIGEgRmFjZVN0YXR1cyB0byBzcGFuIERhdGEgcGFja2V0cworICBmb3IgKGludCBpID0gMDsgaSA8IDU5OyBpKyspCisgICAgeworICAgICAgc2hhcmVkX3B0cjxUZXN0Q291bnRlcnNGYWNlPiBkdW1teShtYWtlX3NoYXJlZDxUZXN0Q291bnRlcnNGYWNlPigpKTsKKworICAgICAgdWludDY0X3QgZmlsbGVyID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpIC0gMTsKKyAgICAgIGR1bW15LT5zZXRDb3VudGVycyhmaWxsZXIsIGZpbGxlciwgZmlsbGVyLCBmaWxsZXIsIGZpbGxlciwgZmlsbGVyKTsKKworICAgICAgbV9yZWZlcmVuY2VGYWNlcy5wdXNoX2JhY2soZHVtbXkpOworCisgICAgICBhZGQoZHVtbXkpOworICAgIH0KKworICBuZG46OkVuY29kaW5nQnVmZmVyIGJ1ZmZlcjsKKworICBtX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0KKyAgICBiaW5kKCZGYWNlU3RhdHVzUHVibGlzaGVyRml4dHVyZTo6ZGVjb2RlRmFjZVN0YXR1c0Jsb2NrLCB0aGlzLCBfMSk7CisKKyAgbV9wdWJsaXNoZXIucHVibGlzaCgpOworICBCT09TVF9SRVFVSVJFKG1fZmluaXNoZWQpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZpYi1lbnVtZXJhdGlvbi1wdWJsaXNoZXItY29tbW9uLmhwcCBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9maWItZW51bWVyYXRpb24tcHVibGlzaGVyLWNvbW1vbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiNzI4MAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9maWItZW51bWVyYXRpb24tcHVibGlzaGVyLWNvbW1vbi5ocHAKQEAgLTAsMCArMSwyMjEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX1RFU1RTX05GRF9NR01UX0ZJQl9FTlVNRVJBVElPTl9QVUJMSVNIRVJfQ09NTU9OX0hQUAorI2RlZmluZSBORkRfVEVTVFNfTkZEX01HTVRfRklCX0VOVU1FUkFUSU9OX1BVQkxJU0hFUl9DT01NT05fSFBQCisKKyNpbmNsdWRlICJtZ210L2ZpYi1lbnVtZXJhdGlvbi1wdWJsaXNoZXIuaHBwIgorCisjaW5jbHVkZSAibWdtdC9hcHAtZmFjZS5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9maWIuaHBwIgorI2luY2x1ZGUgInRhYmxlL25hbWUtdHJlZS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiLi4vZmFjZS9kdW1teS1mYWNlLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvZW5jb2RpbmcvdGx2LmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90CityZWFkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZShjb25zdCBCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlKQoreworICBpZiAoYmxvY2sudHlwZSgpID09IHR5cGUpCisgICAgeworICAgICAgcmV0dXJuIHJlYWROb25OZWdhdGl2ZUludGVnZXIoYmxvY2spOworICAgIH0KKyAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3I7CisgIGVycm9yIDw8ICJFeHBlY3RlZCB0eXBlICIgPDwgdHlwZSA8PCAiIGdvdCAiIDw8IGJsb2NrLnR5cGUoKTsKKyAgdGhyb3cgdGx2OjpFcnJvcihlcnJvci5zdHIoKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QKK2NoZWNrZWRSZWFkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZShCbG9jazo6ZWxlbWVudF9jb25zdF9pdGVyYXRvciYgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jazo6ZWxlbWVudF9jb25zdF9pdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSkKK3sKKyAgaWYgKGkgIT0gZW5kKQorICAgIHsKKyAgICAgIGNvbnN0IEJsb2NrJiBibG9jayA9ICppOworICAgICAgKytpOworICAgICAgcmV0dXJuIHJlYWROb25OZWdhdGl2ZUludGVnZXJUeXBlKGJsb2NrLCB0eXBlKTsKKyAgICB9CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yOworICBlcnJvciA8PCAiVW5leHBlY3RlZCBlbmQgb2YgQmxvY2sgd2hpbGUgYXR0ZW1wdGluZyB0byByZWFkIHR5cGUgIyIKKyAgICAgICAgPDwgdHlwZTsKKyAgdGhyb3cgdGx2OjpFcnJvcihlcnJvci5zdHIoKSk7Cit9CisKK2NsYXNzIEZpYkVudW1lcmF0aW9uUHVibGlzaGVyRml4dHVyZSA6IHB1YmxpYyBCYXNlRml4dHVyZQoreworcHVibGljOgorCisgIEZpYkVudW1lcmF0aW9uUHVibGlzaGVyRml4dHVyZSgpCisgICAgOiBtX2ZpYihtX25hbWVUcmVlKQorICAgICwgbV9mYWNlKG1ha2Vfc2hhcmVkPEludGVybmFsRmFjZT4oKSkKKyAgICAsIG1fcHVibGlzaGVyKG1fZmliLCAqbV9mYWNlLCAiL2xvY2FsaG9zdC9uZmQvRmliRW51bWVyYXRpb25QdWJsaXNoZXJGaXh0dXJlIiwgbV9rZXlDaGFpbikKKyAgICAsIG1fZmluaXNoZWQoZmFsc2UpCisgIHsKKyAgfQorCisgIHZpcnR1YWwKKyAgfkZpYkVudW1lcmF0aW9uUHVibGlzaGVyRml4dHVyZSgpCisgIHsKKyAgfQorCisgIGJvb2wKKyAgaGFzTmV4dEhvcFdpdGhDb3N0KGNvbnN0IGZpYjo6TmV4dEhvcExpc3QmIG5leHRIb3BzLAorICAgICAgICAgICAgICAgICAgICAgRmFjZUlkIGZhY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvc3QpCisgIHsKKyAgICBmb3IgKGZpYjo6TmV4dEhvcExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGkgPSBuZXh0SG9wcy5iZWdpbigpOworICAgICAgICAgaSAhPSBuZXh0SG9wcy5lbmQoKTsKKyAgICAgICAgICsraSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGktPmdldEZhY2UoKS0+Z2V0SWQoKSA9PSBmYWNlSWQgJiYgaS0+Z2V0Q29zdCgpID09IGNvc3QpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wKKyAgZW50cnlIYXNQcmVmaXgoY29uc3Qgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBlbnRyeSwgY29uc3QgTmFtZSYgcHJlZml4KQorICB7CisgICAgcmV0dXJuIGVudHJ5LT5nZXRQcmVmaXgoKSA9PSBwcmVmaXg7CisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlRmliRW50cnkoY29uc3QgQmxvY2smIGVudHJ5KQorICB7CisgICAgZW50cnkucGFyc2UoKTsKKworICAgIEJsb2NrOjplbGVtZW50X2NvbnN0X2l0ZXJhdG9yIGkgPSBlbnRyeS5lbGVtZW50c19iZWdpbigpOworICAgIEJPT1NUX1JFUVVJUkUoaSAhPSBlbnRyeS5lbGVtZW50c19lbmQoKSk7CisKKworICAgIEJPT1NUX1JFUVVJUkUoaS0+dHlwZSgpID09IHRsdjo6TmFtZSk7CisgICAgTmFtZSBwcmVmaXgoKmkpOworICAgICsraTsKKworICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gPjo6Y29uc3RfaXRlcmF0b3IgcmVmZXJlbmNlSXRlciA9CisgICAgICBzdGQ6OmZpbmRfaWYobV9yZWZlcmVuY2VFbnRyaWVzLmJlZ2luKCksIG1fcmVmZXJlbmNlRW50cmllcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBiaW5kKCZGaWJFbnVtZXJhdGlvblB1Ymxpc2hlckZpeHR1cmU6OmVudHJ5SGFzUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgXzEsIHByZWZpeCkpOworCisgICAgQk9PU1RfUkVRVUlSRShyZWZlcmVuY2VJdGVyICE9IG1fcmVmZXJlbmNlRW50cmllcy5lbmQoKSk7CisKKyAgICBjb25zdCBzaGFyZWRfcHRyPGZpYjo6RW50cnk+JiByZWZlcmVuY2UgPSAqcmVmZXJlbmNlSXRlcjsKKyAgICBCT09TVF9SRVFVSVJFX0VRVUFMKHByZWZpeCwgcmVmZXJlbmNlLT5nZXRQcmVmaXgoKSk7CisKKyAgICAvLyAwIG9yIG1vcmUgbmV4dCBob3AgcmVjb3JkcworICAgIHNpemVfdCBuUmVjb3JkcyA9IDA7CisgICAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgcmVmZXJlbmNlTmV4dEhvcHMgPSByZWZlcmVuY2UtPmdldE5leHRIb3BzKCk7CisgICAgZm9yICg7IGkgIT0gZW50cnkuZWxlbWVudHNfZW5kKCk7ICsraSkKKyAgICAgIHsKKyAgICAgICAgY29uc3QgbmRuOjpCbG9jayYgbmV4dEhvcFJlY29yZCA9ICppOworICAgICAgICBCT09TVF9SRVFVSVJFKG5leHRIb3BSZWNvcmQudHlwZSgpID09IG5kbjo6dGx2OjpuZmQ6Ok5leHRIb3BSZWNvcmQpOworICAgICAgICBuZXh0SG9wUmVjb3JkLnBhcnNlKCk7CisKKyAgICAgICAgQmxvY2s6OmVsZW1lbnRfY29uc3RfaXRlcmF0b3IgaiA9IG5leHRIb3BSZWNvcmQuZWxlbWVudHNfYmVnaW4oKTsKKworICAgICAgICBGYWNlSWQgZmFjZUlkID0KKyAgICAgICAgICBjaGVja2VkUmVhZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUoaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZWxlbWVudHNfZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6dGx2OjpuZmQ6OkZhY2VJZCk7CisKKyAgICAgICAgdWludDY0X3QgY29zdCA9CisgICAgICAgICAgY2hlY2tlZFJlYWROb25OZWdhdGl2ZUludGVnZXJUeXBlKGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmVsZW1lbnRzX2VuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnRsdjo6bmZkOjpDb3N0KTsKKworICAgICAgICBCT09TVF9SRVFVSVJFKGhhc05leHRIb3BXaXRoQ29zdChyZWZlcmVuY2VOZXh0SG9wcywgZmFjZUlkLCBjb3N0KSk7CisKKyAgICAgICAgQk9PU1RfUkVRVUlSRShqID09IG5leHRIb3BSZWNvcmQuZWxlbWVudHNfZW5kKCkpOworICAgICAgICBuUmVjb3JkcysrOworICAgICAgfQorICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoblJlY29yZHMsIHJlZmVyZW5jZU5leHRIb3BzLnNpemUoKSk7CisKKyAgICBCT09TVF9SRVFVSVJFKGkgPT0gZW50cnkuZWxlbWVudHNfZW5kKCkpOworICAgIG1fcmVmZXJlbmNlRW50cmllcy5lcmFzZShyZWZlcmVuY2VJdGVyKTsKKyAgfQorCisgIHZvaWQKKyAgZGVjb2RlRmliRW50cnlCbG9jayhjb25zdCBEYXRhJiBkYXRhKQorICB7CisgICAgQmxvY2sgcGF5bG9hZCA9IGRhdGEuZ2V0Q29udGVudCgpOworCisgICAgbV9idWZmZXIuYXBwZW5kQnl0ZUFycmF5KHBheWxvYWQudmFsdWUoKSwgcGF5bG9hZC52YWx1ZV9zaXplKCkpOworCisgICAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coZGF0YS5nZXROYW1lKClbLTFdLnRvU2VnbWVudCgpKTsKKyAgICBpZiAoZGF0YS5nZXRGaW5hbEJsb2NrSWQoKSAhPSBkYXRhLmdldE5hbWUoKVstMV0pCisgICAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgIC8vIHdyYXAgdGhlIEZJQiBFbnRyeSBibG9ja3MgaW4gYSBzaW5nbGUgQ29udGVudCBUTFYgZm9yIGVhc3kgcGFyc2luZworICAgIG1fYnVmZmVyLnByZXBlbmRWYXJOdW1iZXIobV9idWZmZXIuc2l6ZSgpKTsKKyAgICBtX2J1ZmZlci5wcmVwZW5kVmFyTnVtYmVyKHRsdjo6Q29udGVudCk7CisKKyAgICBuZG46OkJsb2NrIHBhcnNlcihtX2J1ZmZlci5idWYoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICBwYXJzZXIucGFyc2UoKTsKKworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwocGFyc2VyLmVsZW1lbnRzX3NpemUoKSwgbV9yZWZlcmVuY2VFbnRyaWVzLnNpemUoKSk7CisKKyAgICBmb3IgKEJsb2NrOjplbGVtZW50X2NvbnN0X2l0ZXJhdG9yIGkgPSBwYXJzZXIuZWxlbWVudHNfYmVnaW4oKTsKKyAgICAgICAgIGkgIT0gcGFyc2VyLmVsZW1lbnRzX2VuZCgpOworICAgICAgICAgKytpKQorICAgICAgeworICAgICAgICBpZiAoaS0+dHlwZSgpICE9IG5kbjo6dGx2OjpuZmQ6OkZpYkVudHJ5KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoImV4cGVjdGVkIGZpYiBlbnRyeSwgZ290IHR5cGUgIyIgPDwgaS0+dHlwZSgpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgdmFsaWRhdGVGaWJFbnRyeSgqaSk7CisgICAgICB9CisgICAgbV9maW5pc2hlZCA9IHRydWU7CisgIH0KKworcHJvdGVjdGVkOgorICBOYW1lVHJlZSBtX25hbWVUcmVlOworICBGaWIgbV9maWI7CisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBtX2ZhY2U7CisgIEZpYkVudW1lcmF0aW9uUHVibGlzaGVyIG1fcHVibGlzaGVyOworICBuZG46OkVuY29kaW5nQnVmZmVyIG1fYnVmZmVyOworICBzdGQ6OnNldDxzaGFyZWRfcHRyPGZpYjo6RW50cnk+ID4gbV9yZWZlcmVuY2VFbnRyaWVzOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBtX2ZpbmlzaGVkOworfTsKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1RFU1RTX05GRF9NR01UX0ZJQl9FTlVNRVJBVElPTl9QVUJMSVNIRVJfQ09NTU9OX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZpYi1lbnVtZXJhdGlvbi1wdWJsaXNoZXIuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZpYi1lbnVtZXJhdGlvbi1wdWJsaXNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzMwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmliLWVudW1lcmF0aW9uLXB1Ymxpc2hlci5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm1nbXQvZmliLWVudW1lcmF0aW9uLXB1Ymxpc2hlci5ocHAiCisKKyNpbmNsdWRlICJtZ210L2FwcC1mYWNlLmhwcCIKKyNpbmNsdWRlICJtZ210L2ludGVybmFsLWZhY2UuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgIi4uL2ZhY2UvZHVtbXktZmFjZS5ocHAiCisKKyNpbmNsdWRlICJmaWItZW51bWVyYXRpb24tcHVibGlzaGVyLWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlIDxuZG4tY3h4L2VuY29kaW5nL3Rsdi5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTkZEX0xPR19JTklUKCJUZXN0RmliRW51bWVyYXRpb25QdWJsaXNoZXIiKTsKKworCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShNZ210RmliRW51bWVyYXRpb24sIEZpYkVudW1lcmF0aW9uUHVibGlzaGVyRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoVGVzdEZpYkVudW1lcmF0aW9uUHVibGlzaGVyKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IDg3OyBpKyspCisgICAgeworICAgICAgTmFtZSBwcmVmaXgoIi90ZXN0Iik7CisgICAgICBwcmVmaXguYXBwZW5kU2VnbWVudChpKTsKKworICAgICAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGR1bW15MShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworICAgICAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGR1bW15MihtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgICAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gbV9maWIuaW5zZXJ0KHByZWZpeCkuZmlyc3Q7CisgICAgICBlbnRyeS0+YWRkTmV4dEhvcChkdW1teTEsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSAtIDEpOworICAgICAgZW50cnktPmFkZE5leHRIb3AoZHVtbXkyLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkgLSAyKTsKKworICAgICAgbV9yZWZlcmVuY2VFbnRyaWVzLmluc2VydChlbnRyeSk7CisgICAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICBOYW1lIHByZWZpeCgiL3Rlc3QyIik7CisgICAgICBwcmVmaXguYXBwZW5kU2VnbWVudChpKTsKKworICAgICAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGR1bW15MShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworICAgICAgc2hhcmVkX3B0cjxEdW1teUZhY2U+IGR1bW15MihtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgICAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gbV9maWIuaW5zZXJ0KHByZWZpeCkuZmlyc3Q7CisgICAgICBlbnRyeS0+YWRkTmV4dEhvcChkdW1teTEsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpIC0gMSk7CisgICAgICBlbnRyeS0+YWRkTmV4dEhvcChkdW1teTIsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpIC0gMik7CisKKyAgICAgIG1fcmVmZXJlbmNlRW50cmllcy5pbnNlcnQoZW50cnkpOworICAgIH0KKworICBuZG46OkVuY29kaW5nQnVmZmVyIGJ1ZmZlcjsKKworICBtX2ZhY2UtPm9uUmVjZWl2ZURhdGEgKz0KKyAgICBiaW5kKCZGaWJFbnVtZXJhdGlvblB1Ymxpc2hlckZpeHR1cmU6OmRlY29kZUZpYkVudHJ5QmxvY2ssIHRoaXMsIF8xKTsKKworICBtX3B1Ymxpc2hlci5wdWJsaXNoKCk7CisgIEJPT1NUX1JFUVVJUkUobV9maW5pc2hlZCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZmliLW1hbmFnZXIuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZpYi1tYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjVkZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2ZpYi1tYW5hZ2VyLmNwcApAQCAtMCwwICsxLDkyMCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm1nbXQvZmliLW1hbmFnZXIuaHBwIgorI2luY2x1ZGUgInRhYmxlL2ZpYi5ocHAiCisjaW5jbHVkZSAidGFibGUvZmliLW5leHRob3AuaHBwIgorI2luY2x1ZGUgImZhY2UvZmFjZS5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1mYWNlLmhwcCIKKworI2luY2x1ZGUgInZhbGlkYXRpb24tY29tbW9uLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlICJmaWItZW51bWVyYXRpb24tcHVibGlzaGVyLWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTkZEX0xPR19JTklUKCJGaWJNYW5hZ2VyVGVzdCIpOworCitjbGFzcyBGaWJNYW5hZ2VyRml4dHVyZSA6IHB1YmxpYyBGaWJFbnVtZXJhdGlvblB1Ymxpc2hlckZpeHR1cmUKK3sKK3B1YmxpYzoKKworICB2aXJ0dWFsCisgIH5GaWJNYW5hZ2VyRml4dHVyZSgpCisgIHsKKyAgfQorCisgIHNoYXJlZF9wdHI8RmFjZT4KKyAgZ2V0RmFjZShGYWNlSWQgaWQpCisgIHsKKyAgICBpZiAoaWQgPiAwICYmIHN0YXRpY19jYXN0PHNpemVfdD4oaWQpIDw9IG1fZmFjZXMuc2l6ZSgpKQorICAgICAgeworICAgICAgICByZXR1cm4gbV9mYWNlc1tpZCAtIDFdOworICAgICAgfQorICAgIE5GRF9MT0dfREVCVUcoIk5vIGZhY2UgZm91bmQgcmV0dXJuaW5nIE5VTEwiKTsKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxEdW1teUZhY2U+KCk7CisgIH0KKworICB2b2lkCisgIGFkZEZhY2Uoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKQorICB7CisgICAgbV9mYWNlcy5wdXNoX2JhY2soZmFjZSk7CisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlQ29udHJvbFJlc3BvbnNlQ29tbW9uKGNvbnN0IERhdGEmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBleHBlY3RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFJlc3BvbnNlJiBjb250cm9sKQorICB7CisgICAgbV9jYWxsYmFja0ZpcmVkID0gdHJ1ZTsKKyAgICBCbG9jayBjb250cm9sUmF3ID0gcmVzcG9uc2UuZ2V0Q29udGVudCgpLmJsb2NrRnJvbVZhbHVlKCk7CisKKyAgICBjb250cm9sLndpcmVEZWNvZGUoY29udHJvbFJhdyk7CisKKyAgICAvLyBORkRfTE9HX0RFQlVHKCJyZWNlaXZlZCBjb250cm9sIHJlc3BvbnNlIgorICAgIC8vICAgICAgICAgICAgICAgPDwgIiBOYW1lOiAiIDw8IHJlc3BvbnNlLmdldE5hbWUoKQorICAgIC8vICAgICAgICAgICAgICAgPDwgIiBjb2RlOiAiIDw8IGNvbnRyb2wuZ2V0Q29kZSgpCisgICAgLy8gICAgICAgICAgICAgICA8PCAiIHRleHQ6ICIgPDwgY29udHJvbC5nZXRUZXh0KCkpOworCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVzcG9uc2UuZ2V0TmFtZSgpLCBleHBlY3RlZE5hbWUpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbnRyb2wuZ2V0Q29kZSgpLCBleHBlY3RlZENvZGUpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbnRyb2wuZ2V0VGV4dCgpLCBleHBlY3RlZFRleHQpOworICB9CisKKyAgdm9pZAorICB2YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShjb25zdCBEYXRhJiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZSYgZXhwZWN0ZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZFRleHQpCisgIHsKKyAgICBDb250cm9sUmVzcG9uc2UgY29udHJvbDsKKyAgICB2YWxpZGF0ZUNvbnRyb2xSZXNwb25zZUNvbW1vbihyZXNwb25zZSwgZXhwZWN0ZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29kZSwgZXhwZWN0ZWRUZXh0LCBjb250cm9sKTsKKworICAgIGlmICghY29udHJvbC5nZXRCb2R5KCkuZW1wdHkoKSkKKyAgICAgIHsKKyAgICAgICAgQk9PU1RfRkFJTCgiZm91bmQgdW5leHBlY3RlZCBjb250cm9sIHJlc3BvbnNlIGJvZHkiKTsKKyAgICAgIH0KKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2UoY29uc3QgRGF0YSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9jayYgZXhwZWN0ZWRCb2R5KQorICB7CisgICAgQ29udHJvbFJlc3BvbnNlIGNvbnRyb2w7CisgICAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2VDb21tb24ocmVzcG9uc2UsIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZENvZGUsIGV4cGVjdGVkVGV4dCwgY29udHJvbCk7CisKKyAgICBCT09TVF9SRVFVSVJFKCFjb250cm9sLmdldEJvZHkoKS5lbXB0eSgpKTsKKyAgICBCT09TVF9SRVFVSVJFX0VRVUFMKGNvbnRyb2wuZ2V0Qm9keSgpLnZhbHVlX3NpemUoKSwgZXhwZWN0ZWRCb2R5LnZhbHVlX3NpemUoKSk7CisKKyAgICBCT09TVF9DSEVDSyhtZW1jbXAoY29udHJvbC5nZXRCb2R5KCkudmFsdWUoKSwgZXhwZWN0ZWRCb2R5LnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQm9keS52YWx1ZV9zaXplKCkpID09IDApOworCisgIH0KKworICBib29sCisgIGRpZENhbGxiYWNrRmlyZSgpCisgIHsKKyAgICByZXR1cm4gbV9jYWxsYmFja0ZpcmVkOworICB9CisKKyAgdm9pZAorICByZXNldENhbGxiYWNrRmlyZWQoKQorICB7CisgICAgbV9jYWxsYmFja0ZpcmVkID0gZmFsc2U7CisgIH0KKworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4KKyAgZ2V0SW50ZXJuYWxGYWNlKCkKKyAgeworICAgIHJldHVybiBtX2ZhY2U7CisgIH0KKworICBGaWJNYW5hZ2VyJgorICBnZXRGaWJNYW5hZ2VyKCkKKyAgeworICAgIHJldHVybiBtX21hbmFnZXI7CisgIH0KKworICBGaWImCisgIGdldEZpYigpCisgIHsKKyAgICByZXR1cm4gbV9maWI7CisgIH0KKworICB2b2lkCisgIGFkZEludGVyZXN0UnVsZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnZXgsCisgICAgICAgICAgICAgICAgICBuZG46OklkZW50aXR5Q2VydGlmaWNhdGUmIGNlcnRpZmljYXRlKQorICB7CisgICAgbV9tYW5hZ2VyLmFkZEludGVyZXN0UnVsZShyZWdleCwgY2VydGlmaWNhdGUpOworICB9CisKK3Byb3RlY3RlZDoKKyAgRmliTWFuYWdlckZpeHR1cmUoKQorICAgIDogbV9tYW5hZ2VyKHJlZihtX2ZpYiksIGJpbmQoJkZpYk1hbmFnZXJGaXh0dXJlOjpnZXRGYWNlLCB0aGlzLCBfMSksIG1fZmFjZSwgbV9rZXlDaGFpbikKKyAgICAsIG1fY2FsbGJhY2tGaXJlZChmYWxzZSkKKyAgeworICB9CisKK3Byb3RlY3RlZDoKKyAgRmliTWFuYWdlciBtX21hbmFnZXI7CisKKyAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxGYWNlPiA+IG1fZmFjZXM7CisgIGJvb2wgbV9jYWxsYmFja0ZpcmVkOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEF1dGhvcml6ZWRDb21tYW5kRml4dHVyZSA6IHB1YmxpYyBDb21tYW5kRml4dHVyZTxUPgoreworcHVibGljOgorICBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmUoKQorICB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmVnZXggPSAiXjxsb2NhbGhvc3Q+PG5mZD48ZmliPiI7CisgICAgVDo6YWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCAqQ29tbWFuZEZpeHR1cmU8VD46Om1fY2VydGlmaWNhdGUpOworICB9CisKKyAgdmlydHVhbAorICB+QXV0aG9yaXplZENvbW1hbmRGaXh0dXJlKCkKKyAgeworICB9Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoTWdtdEZpYk1hbmFnZXIsIEF1dGhvcml6ZWRDb21tYW5kRml4dHVyZTxGaWJNYW5hZ2VyRml4dHVyZT4pCisKK2Jvb2wKK2ZvdW5kTmV4dEhvcChGYWNlSWQgaWQsIHVpbnQzMl90IGNvc3QsIGNvbnN0IGZpYjo6TmV4dEhvcCYgbmV4dCkKK3sKKyAgcmV0dXJuIGlkID09IG5leHQuZ2V0RmFjZSgpLT5nZXRJZCgpICYmIG5leHQuZ2V0Q29zdCgpID09IGNvc3Q7Cit9CisKK2Jvb2wKK2FkZGVkTmV4dEhvcFdpdGhDb3N0KGNvbnN0IEZpYiYgZmliLCBjb25zdCBOYW1lJiBwcmVmaXgsIHNpemVfdCBvbGRTaXplLCB1aW50MzJfdCBjb3N0KQoreworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZmliLmZpbmRFeGFjdE1hdGNoKHByZWZpeCk7CisKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICB7CisgICAgICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBob3BzID0gZW50cnktPmdldE5leHRIb3BzKCk7CisgICAgICByZXR1cm4gaG9wcy5zaXplKCkgPT0gb2xkU2l6ZSArIDEgJiYKKyAgICAgICAgc3RkOjpmaW5kX2lmKGhvcHMuYmVnaW4oKSwgaG9wcy5lbmQoKSwgYmluZCgmZm91bmROZXh0SG9wLCAtMSwgY29zdCwgXzEpKSAhPSBob3BzLmVuZCgpOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sCitmb3VuZE5leHRIb3BXaXRoRmFjZShGYWNlSWQgaWQsIHVpbnQzMl90IGNvc3QsCisgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UsIGNvbnN0IGZpYjo6TmV4dEhvcCYgbmV4dCkKK3sKKyAgcmV0dXJuIGlkID09IG5leHQuZ2V0RmFjZSgpLT5nZXRJZCgpICYmIG5leHQuZ2V0Q29zdCgpID09IGNvc3QgJiYgZmFjZSA9PSBuZXh0LmdldEZhY2UoKTsKK30KKworYm9vbAorYWRkZWROZXh0SG9wV2l0aEZhY2UoY29uc3QgRmliJiBmaWIsIGNvbnN0IE5hbWUmIHByZWZpeCwgc2l6ZV90IG9sZFNpemUsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3N0LCBzaGFyZWRfcHRyPEZhY2U+IGZhY2UpCit7CisgIHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4gZW50cnkgPSBmaWIuZmluZEV4YWN0TWF0Y2gocHJlZml4KTsKKworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKQorICAgIHsKKyAgICAgIGNvbnN0IGZpYjo6TmV4dEhvcExpc3QmIGhvcHMgPSBlbnRyeS0+Z2V0TmV4dEhvcHMoKTsKKyAgICAgIHJldHVybiBob3BzLnNpemUoKSA9PSBvbGRTaXplICsgMSAmJgorICAgICAgICBzdGQ6OmZpbmRfaWYoaG9wcy5iZWdpbigpLCBob3BzLmVuZCgpLCBiaW5kKCZmb3VuZE5leHRIb3AsIC0xLCBjb3N0LCBfMSkpICE9IGhvcHMuZW5kKCk7CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNob3J0TmFtZSkKK3sKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBnZXRJbnRlcm5hbEZhY2UoKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kID0gbWFrZUludGVyZXN0KCIvbG9jYWxob3N0L25mZC9maWIiKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICB9OworCisgIGZhY2UtPnNlbmRJbnRlcmVzdCgqY29tbWFuZCk7CisgIGdfaW8ucnVuX29uZSgpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNYWxmb3JtZWRDb21tbWFuZCkKK3sKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBnZXRJbnRlcm5hbEZhY2UoKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpID09IGZhbHNlKTsKKworICBJbnRlcmVzdCBjb21tYW5kKCIvbG9jYWxob3N0L25mZC9maWIiKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC5nZXROYW1lKCksIDQwMCwgIk1hbGZvcm1lZCBjb21tYW5kIik7CisgIH07CisKKyAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdChjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVW5zdXBwb3J0ZWRWZXJiKQoreworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSgiL2hlbGxvIik7CisgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKDEpOworICBwYXJhbWV0ZXJzLnNldENvc3QoMSk7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZpYiIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoInVuc3VwcG9ydGVkIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA1MDEsICJVbnN1cHBvcnRlZCBjb21tYW5kIik7CisgIH07CisKKyAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFVuc2lnbmVkQ29tbWFuZCkKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlID0gZ2V0SW50ZXJuYWxGYWNlKCk7CisKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXROYW1lKCIvaGVsbG8iKTsKKyAgcGFyYW1ldGVycy5zZXRGYWNlSWQoMSk7CisgIHBhcmFtZXRlcnMuc2V0Q29zdCgxMDEpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9maWIiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJhZGQtbmV4dGhvcCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIEludGVyZXN0IGNvbW1hbmQoY29tbWFuZE5hbWUpOworCisgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBjb21tYW5kLmdldE5hbWUoKSwgNDAxLCAiU2lnbmF0dXJlIHJlcXVpcmVkIik7CisgIH07CisKKyAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdChjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgQk9PU1RfUkVRVUlSRSghYWRkZWROZXh0SG9wV2l0aENvc3QoZ2V0RmliKCksICIvaGVsbG8iLCAwLCAxMDEpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVW5hdXRob3JpemVkQ29tbWFuZCwgVW5hdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8RmliTWFuYWdlckZpeHR1cmU+KQoreworICBhZGRGYWNlKG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKSk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBnZXRJbnRlcm5hbEZhY2UoKTsKKworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi9oZWxsbyIpOworICBwYXJhbWV0ZXJzLnNldEZhY2VJZCgxKTsKKyAgcGFyYW1ldGVycy5zZXRDb3N0KDEwMSk7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZpYiIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImFkZC1uZXh0aG9wIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDMsICJVbmF1dGhvcml6ZWQgY29tbWFuZCIpOworICB9OworCisgIGdldEZpYk1hbmFnZXIoKS5vbkZpYlJlcXVlc3QoKmNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworICBCT09TVF9SRVFVSVJFKCFhZGRlZE5leHRIb3BXaXRoQ29zdChnZXRGaWIoKSwgIi9oZWxsbyIsIDAsIDEwMSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCYWRPcHRpb25QYXJzZSkKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlID0gZ2V0SW50ZXJuYWxGYWNlKCk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgiYWRkLW5leHRob3AiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJOb3RSZWFsbHlQYXJhbWV0ZXJzIik7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICB9OworCisgIGdldEZpYk1hbmFnZXIoKS5vbkZpYlJlcXVlc3QoKmNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShVbmtub3duRmFjZUlkKQoreworICBhZGRGYWNlKG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKSk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBnZXRJbnRlcm5hbEZhY2UoKTsKKworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi9oZWxsbyIpOworICBwYXJhbWV0ZXJzLnNldEZhY2VJZCgxMDAwKTsKKyAgcGFyYW1ldGVycy5zZXRDb3N0KDEwMSk7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZpYiIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImFkZC1uZXh0aG9wIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MTAsICJGYWNlIG5vdCBmb3VuZCIpOworICB9OworCisgIGdldEZpYk1hbmFnZXIoKS5vbkZpYlJlcXVlc3QoKmNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworICBCT09TVF9SRVFVSVJFKGFkZGVkTmV4dEhvcFdpdGhDb3N0KGdldEZpYigpLCAiL2hlbGxvIiwgMCwgMTAxKSA9PSBmYWxzZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFkZE5leHRIb3BWZXJiSW1wbGljaXRGYWNlSWQpCit7CisgIGFkZEZhY2UobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIHN0ZDo6dmVjdG9yPENvbnRyb2xQYXJhbWV0ZXJzPiB0ZXN0ZWRQYXJhbWV0ZXJzOworICB0ZXN0ZWRQYXJhbWV0ZXJzLnB1c2hfYmFjayhDb250cm9sUGFyYW1ldGVycygpLnNldE5hbWUoIi9oZWxsbyIpLnNldENvc3QoMTAxKS5zZXRGYWNlSWQoMCkpOworICB0ZXN0ZWRQYXJhbWV0ZXJzLnB1c2hfYmFjayhDb250cm9sUGFyYW1ldGVycygpLnNldE5hbWUoIi9oZWxsbyIpLnNldENvc3QoMTAxKSk7CisKKyAgZm9yIChzdGQ6OnZlY3RvcjxDb250cm9sUGFyYW1ldGVycz46Oml0ZXJhdG9yIHBhcmFtZXRlcnMgPSB0ZXN0ZWRQYXJhbWV0ZXJzLmJlZ2luKCk7CisgICAgICAgcGFyYW1ldGVycyAhPSB0ZXN0ZWRQYXJhbWV0ZXJzLmVuZCgpOyArK3BhcmFtZXRlcnMpIHsKKworICAgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMtPndpcmVFbmNvZGUoKSk7CisKKyAgICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9maWIiKTsKKyAgICBjb21tYW5kTmFtZS5hcHBlbmQoImFkZC1uZXh0aG9wIik7CisgICAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICAgIENvbnRyb2xQYXJhbWV0ZXJzIGV4cGVjdGVkUGFyYW1ldGVyczsKKyAgICBleHBlY3RlZFBhcmFtZXRlcnMuc2V0TmFtZSgiL2hlbGxvIik7CisgICAgZXhwZWN0ZWRQYXJhbWV0ZXJzLnNldEZhY2VJZCgxKTsKKyAgICBleHBlY3RlZFBhcmFtZXRlcnMuc2V0Q29zdCgxMDEpOworCisgICAgQmxvY2sgZW5jb2RlZEV4cGVjdGVkUGFyYW1ldGVycyhleHBlY3RlZFBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICAgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgICAgY29tbWFuZC0+c2V0SW5jb21pbmdGYWNlSWQoMSk7CisgICAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICAgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRFeHBlY3RlZFBhcmFtZXRlcnNdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCBlbmNvZGVkRXhwZWN0ZWRQYXJhbWV0ZXJzKTsKKyAgICB9OworCisgICAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgICBCT09TVF9SRVFVSVJFKGFkZGVkTmV4dEhvcFdpdGhGYWNlKGdldEZpYigpLCAiL2hlbGxvIiwgMCwgMTAxLCBnZXRGYWNlKDEpKSk7CisKKyAgICBmYWNlLT5vblJlY2VpdmVEYXRhLmNsZWFyKCk7CisgICAgZ2V0RmliKCkuZXJhc2UoIi9oZWxsbyIpOworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ2V0RmliKCkuc2l6ZSgpLCAwKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShBZGROZXh0SG9wVmVyYkluaXRpYWxBZGQpCit7CisgIGFkZEZhY2UobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSgiL2hlbGxvIik7CisgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKDEpOworICBwYXJhbWV0ZXJzLnNldENvc3QoMTAxKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgiYWRkLW5leHRob3AiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCBlbmNvZGVkUGFyYW1ldGVycyk7CisgIH07CisKKyAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoYWRkZWROZXh0SG9wV2l0aENvc3QoZ2V0RmliKCksICIvaGVsbG8iLCAwLCAxMDEpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQWRkTmV4dEhvcFZlcmJJbXBsaWNpdENvc3QpCit7CisgIGFkZEZhY2UobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSgiL2hlbGxvIik7CisgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKDEpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9maWIiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJhZGQtbmV4dGhvcCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgQ29udHJvbFBhcmFtZXRlcnMgcmVzdWx0UGFyYW1ldGVyczsKKyAgcmVzdWx0UGFyYW1ldGVycy5zZXROYW1lKCIvaGVsbG8iKTsKKyAgcmVzdWx0UGFyYW1ldGVycy5zZXRGYWNlSWQoMSk7CisgIHJlc3VsdFBhcmFtZXRlcnMuc2V0Q29zdCgwKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kLCByZXN1bHRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCByZXN1bHRQYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisgIH07CisKKyAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIEJPT1NUX1JFUVVJUkUoYWRkZWROZXh0SG9wV2l0aENvc3QoZ2V0RmliKCksICIvaGVsbG8iLCAwLCAwKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFkZE5leHRIb3BWZXJiQWRkVG9FeGlzdGluZykKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIGZvciAoaW50IGkgPSAxOyBpIDw9IDI7IGkrKykKKyAgICB7CisKKyAgICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgICAgICBwYXJhbWV0ZXJzLnNldE5hbWUoIi9oZWxsbyIpOworICAgICAgcGFyYW1ldGVycy5zZXRGYWNlSWQoMSk7CisgICAgICBwYXJhbWV0ZXJzLnNldENvc3QoMTAwICsgaSk7CisKKyAgICAgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICAgICAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliIik7CisgICAgICBjb21tYW5kTmFtZS5hcHBlbmQoImFkZC1uZXh0aG9wIik7CisgICAgICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgICAgICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICAgICAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICAgICAgZmFjZS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZCwgZW5jb2RlZFBhcmFtZXRlcnNdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgICAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsICJTdWNjZXNzIiwgZW5jb2RlZFBhcmFtZXRlcnMpOworICAgICAgfTsKKworICAgICAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisgICAgICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgICAgIHJlc2V0Q2FsbGJhY2tGaXJlZCgpOworCisgICAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZ2V0RmliKCkuZmluZEV4YWN0TWF0Y2goIi9oZWxsbyIpOworCisgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgaG9wcyA9IGVudHJ5LT5nZXROZXh0SG9wcygpOworICAgICAgICAgIEJPT1NUX1JFUVVJUkUoaG9wcy5zaXplKCkgPT0gMSk7CisgICAgICAgICAgQk9PU1RfUkVRVUlSRShzdGQ6OmZpbmRfaWYoaG9wcy5iZWdpbigpLCBob3BzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmZvdW5kTmV4dEhvcCwgLTEsIDEwMCArIGksIF8xKSkgIT0gaG9wcy5lbmQoKSk7CisKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgQk9PU1RfRkFJTCgiRmFpbGVkIHRvIGZpbmQgZXhwZWN0ZWQgZmliIGVudHJ5Iik7CisgICAgICAgIH0KKworICAgICAgZmFjZS0+b25SZWNlaXZlRGF0YS5jbGVhcigpOworICAgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQWRkTmV4dEhvcFZlcmJVcGRhdGVGYWNlQ29zdCkKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSgiL2hlbGxvIik7CisgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKDEpOworCisgIHsKKyAgICBwYXJhbWV0ZXJzLnNldENvc3QoMSk7CisKKyAgICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9maWIiKTsKKyAgICBjb21tYW5kTmFtZS5hcHBlbmQoImFkZC1uZXh0aG9wIik7CisgICAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICAgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgICAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICAgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBjb21tYW5kLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsICJTdWNjZXNzIiwgZW5jb2RlZFBhcmFtZXRlcnMpOworICAgIH07CisKKyAgICBnZXRGaWJNYW5hZ2VyKCkub25GaWJSZXF1ZXN0KCpjb21tYW5kKTsKKworICAgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworICB9CisKKyAgcmVzZXRDYWxsYmFja0ZpcmVkKCk7CisgIGZhY2UtPm9uUmVjZWl2ZURhdGEuY2xlYXIoKTsKKworICB7CisgICAgcGFyYW1ldGVycy5zZXRDb3N0KDEwMik7CisKKyAgICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9maWIiKTsKKyAgICBjb21tYW5kTmFtZS5hcHBlbmQoImFkZC1uZXh0aG9wIik7CisgICAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICAgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgICAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICAgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBjb21tYW5kLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsICJTdWNjZXNzIiwgZW5jb2RlZFBhcmFtZXRlcnMpOworICAgIH07CisKKyAgICBnZXRGaWJNYW5hZ2VyKCkub25GaWJSZXF1ZXN0KCpjb21tYW5kKTsKKworICAgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworICB9CisKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBlbnRyeSA9IGdldEZpYigpLmZpbmRFeGFjdE1hdGNoKCIvaGVsbG8iKTsKKworICAvLyBBZGQgZmFjZXMgd2l0aCBjb3N0ID09IEZhY2VJRCBmb3IgdGhlIG5hbWUgL2hlbGxvCisgIC8vIFRoaXMgdGVzdCBhc3N1bWVzOgorICAvLyAgIEZhY2VJRHMgYXJlIC0xIGJlY2F1c2Ugd2UgZG9uJ3QgYWRkIHRoZW0gdG8gYSBmb3J3YXJkZXIKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICB7CisgICAgICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBob3BzID0gZW50cnktPmdldE5leHRIb3BzKCk7CisgICAgICBCT09TVF9SRVFVSVJFKGhvcHMuc2l6ZSgpID09IDEpOworICAgICAgQk9PU1RfUkVRVUlSRShzdGQ6OmZpbmRfaWYoaG9wcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9wcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJmZvdW5kTmV4dEhvcCwgLTEsIDEwMiwgXzEpKSAhPSBob3BzLmVuZCgpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBCT09TVF9GQUlMKCJGYWlsZWQgdG8gZmluZCBleHBlY3RlZCBmaWIgZW50cnkiKTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFkZE5leHRIb3BWZXJiTWlzc2luZ1ByZWZpeCkKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlID0gZ2V0SW50ZXJuYWxGYWNlKCk7CisKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRGYWNlSWQoMSk7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZpYiIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoImFkZC1uZXh0aG9wIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICB9OworCisgIGdldEZpYk1hbmFnZXIoKS5vbkZpYlJlcXVlc3QoKmNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitib29sCityZW1vdmVkTmV4dEhvcFdpdGhDb3N0KGNvbnN0IEZpYiYgZmliLCBjb25zdCBOYW1lJiBwcmVmaXgsIHNpemVfdCBvbGRTaXplLCB1aW50MzJfdCBjb3N0KQoreworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZmliLmZpbmRFeGFjdE1hdGNoKHByZWZpeCk7CisKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSkKKyAgICB7CisgICAgICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBob3BzID0gZW50cnktPmdldE5leHRIb3BzKCk7CisgICAgICByZXR1cm4gaG9wcy5zaXplKCkgPT0gb2xkU2l6ZSAtIDEgJiYKKyAgICAgICAgc3RkOjpmaW5kX2lmKGhvcHMuYmVnaW4oKSwgaG9wcy5lbmQoKSwgYmluZCgmZm91bmROZXh0SG9wLCAtMSwgY29zdCwgXzEpKSA9PSBob3BzLmVuZCgpOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkCit0ZXN0UmVtb3ZlTmV4dEhvcChDb21tYW5kRml4dHVyZTxGaWJNYW5hZ2VyRml4dHVyZT4qIGZpeHR1cmUsCisgICAgICAgICAgICAgICAgICBGaWJNYW5hZ2VyJiBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgRmliJiBmaWIsCisgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiB0YXJnZXROYW1lLAorICAgICAgICAgICAgICAgICAgRmFjZUlkIHRhcmdldEZhY2UpCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSh0YXJnZXROYW1lKTsKKyAgcGFyYW1ldGVycy5zZXRGYWNlSWQodGFyZ2V0RmFjZSk7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZpYiIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoInJlbW92ZS1uZXh0aG9wIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZml4dHVyZS0+Z2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBmYWNlLT5vblJlY2VpdmVEYXRhICs9IFtmaXh0dXJlLCBjb21tYW5kLCBlbmNvZGVkUGFyYW1ldGVyc10gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgZml4dHVyZS0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsICJTdWNjZXNzIiwgZW5jb2RlZFBhcmFtZXRlcnMpOworICB9OworCisgIG1hbmFnZXIub25GaWJSZXF1ZXN0KCpjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGZpeHR1cmUtPmRpZENhbGxiYWNrRmlyZSgpKTsKKworICBmaXh0dXJlLT5yZXNldENhbGxiYWNrRmlyZWQoKTsKKyAgZmFjZS0+b25SZWNlaXZlRGF0YS5jbGVhcigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShSZW1vdmVOZXh0SG9wKQoreworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UzID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworCisgIGFkZEZhY2UoZmFjZTEpOworICBhZGRGYWNlKGZhY2UyKTsKKyAgYWRkRmFjZShmYWNlMyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBnZXRJbnRlcm5hbEZhY2UoKTsKKyAgRmliTWFuYWdlciYgbWFuYWdlciA9IGdldEZpYk1hbmFnZXIoKTsKKyAgRmliJiBmaWIgPSBnZXRGaWIoKTsKKworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZmliLmluc2VydCgiL2hlbGxvIikuZmlyc3Q7CisKKyAgZW50cnktPmFkZE5leHRIb3AoZmFjZTEsIDEwMSk7CisgIGVudHJ5LT5hZGROZXh0SG9wKGZhY2UyLCAyMDIpOworICBlbnRyeS0+YWRkTmV4dEhvcChmYWNlMywgMzAzKTsKKworICB0ZXN0UmVtb3ZlTmV4dEhvcCh0aGlzLCBtYW5hZ2VyLCBmaWIsIGZhY2UsICIvaGVsbG8iLCAyKTsKKyAgQk9PU1RfUkVRVUlSRShyZW1vdmVkTmV4dEhvcFdpdGhDb3N0KGZpYiwgIi9oZWxsbyIsIDMsIDIwMikpOworCisgIHRlc3RSZW1vdmVOZXh0SG9wKHRoaXMsIG1hbmFnZXIsIGZpYiwgZmFjZSwgIi9oZWxsbyIsIDMpOworICBCT09TVF9SRVFVSVJFKHJlbW92ZWROZXh0SG9wV2l0aENvc3QoZmliLCAiL2hlbGxvIiwgMiwgMzAzKSk7CisKKyAgdGVzdFJlbW92ZU5leHRIb3AodGhpcywgbWFuYWdlciwgZmliLCBmYWNlLCAiL2hlbGxvIiwgMSk7CisgIC8vIEJPT1NUX1JFUVVJUkUocmVtb3ZlZE5leHRIb3BXaXRoQ29zdChmaWIsICIvaGVsbG8iLCAxLCAxMDEpKTsKKworICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4oZ2V0RmliKCkuZmluZEV4YWN0TWF0Y2goIi9oZWxsbyIpKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFJlbW92ZUZhY2VOb3RGb3VuZCkKK3sKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBnZXRJbnRlcm5hbEZhY2UoKTsKKworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi9oZWxsbyIpOworICBwYXJhbWV0ZXJzLnNldEZhY2VJZCgxKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgicmVtb3ZlLW5leHRob3AiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCBlbmNvZGVkUGFyYW1ldGVycyk7CisgIH07CisKKyAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFJlbW92ZVByZWZpeE5vdEZvdW5kKQoreworICBhZGRGYWNlKG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKSk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBnZXRJbnRlcm5hbEZhY2UoKTsKKworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi9oZWxsbyIpOworICBwYXJhbWV0ZXJzLnNldEZhY2VJZCgxKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgicmVtb3ZlLW5leHRob3AiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGZhY2UtPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCBlbmNvZGVkUGFyYW1ldGVycyk7CisgIH07CisKKyAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFJlbW92ZU1pc3NpbmdQcmVmaXgpCit7CisgIGFkZEZhY2UobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKDEpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9maWIiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJyZW1vdmUtbmV4dGhvcCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgZmFjZS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBnZXRGaWJNYW5hZ2VyKCkub25GaWJSZXF1ZXN0KCpjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmVtb3ZlSW1wbGljaXRGYWNlSWQpCit7CisgIGFkZEZhY2UobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZSA9IGdldEludGVybmFsRmFjZSgpOworCisgIHN0ZDo6dmVjdG9yPENvbnRyb2xQYXJhbWV0ZXJzPiB0ZXN0ZWRQYXJhbWV0ZXJzOworICB0ZXN0ZWRQYXJhbWV0ZXJzLnB1c2hfYmFjayhDb250cm9sUGFyYW1ldGVycygpLnNldE5hbWUoIi9oZWxsbyIpLnNldEZhY2VJZCgwKSk7CisgIHRlc3RlZFBhcmFtZXRlcnMucHVzaF9iYWNrKENvbnRyb2xQYXJhbWV0ZXJzKCkuc2V0TmFtZSgiL2hlbGxvIikpOworCisgIGZvciAoc3RkOjp2ZWN0b3I8Q29udHJvbFBhcmFtZXRlcnM+OjppdGVyYXRvciBwYXJhbWV0ZXJzID0gdGVzdGVkUGFyYW1ldGVycy5iZWdpbigpOworICAgICAgIHBhcmFtZXRlcnMgIT0gdGVzdGVkUGFyYW1ldGVycy5lbmQoKTsgKytwYXJhbWV0ZXJzKSB7CisgICAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy0+d2lyZUVuY29kZSgpKTsKKworICAgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZpYiIpOworICAgIGNvbW1hbmROYW1lLmFwcGVuZCgicmVtb3ZlLW5leHRob3AiKTsKKyAgICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgICAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgICBjb21tYW5kLT5zZXRJbmNvbWluZ0ZhY2VJZCgxKTsKKyAgICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgICAgQ29udHJvbFBhcmFtZXRlcnMgcmVzdWx0UGFyYW1ldGVyczsKKyAgICByZXN1bHRQYXJhbWV0ZXJzLnNldEZhY2VJZCgxKTsKKyAgICByZXN1bHRQYXJhbWV0ZXJzLnNldE5hbWUoIi9oZWxsbyIpOworCisgICAgZmFjZS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZCwgcmVzdWx0UGFyYW1ldGVyc10gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLCAiU3VjY2VzcyIsIHJlc3VsdFBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKyAgICB9OworCisgICAgZ2V0RmliTWFuYWdlcigpLm9uRmliUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKworICAgIGZhY2UtPm9uUmVjZWl2ZURhdGEuY2xlYXIoKTsKKyAgfQorfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShUZXN0RmliRW51bWVyYXRpb25SZXF1ZXN0LCBGaWJNYW5hZ2VyRml4dHVyZSkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA4NzsgaSsrKQorICAgIHsKKyAgICAgIE5hbWUgcHJlZml4KCIvdGVzdCIpOworICAgICAgcHJlZml4LmFwcGVuZFNlZ21lbnQoaSk7CisKKyAgICAgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBkdW1teTEobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKyAgICAgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBkdW1teTIobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBlbnRyeSA9IG1fZmliLmluc2VydChwcmVmaXgpLmZpcnN0OworICAgICAgZW50cnktPmFkZE5leHRIb3AoZHVtbXkxLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkgLSAxKTsKKyAgICAgIGVudHJ5LT5hZGROZXh0SG9wKGR1bW15Miwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpIC0gMik7CisKKyAgICAgIG1fcmVmZXJlbmNlRW50cmllcy5pbnNlcnQoZW50cnkpOworICAgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgTmFtZSBwcmVmaXgoIi90ZXN0MiIpOworICAgICAgcHJlZml4LmFwcGVuZFNlZ21lbnQoaSk7CisKKyAgICAgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBkdW1teTEobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKyAgICAgIHNoYXJlZF9wdHI8RHVtbXlGYWNlPiBkdW1teTIobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICAgICAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBlbnRyeSA9IG1fZmliLmluc2VydChwcmVmaXgpLmZpcnN0OworICAgICAgZW50cnktPmFkZE5leHRIb3AoZHVtbXkxLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgoKSAtIDEpOworICAgICAgZW50cnktPmFkZE5leHRIb3AoZHVtbXkyLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgoKSAtIDIpOworCisgICAgICBtX3JlZmVyZW5jZUVudHJpZXMuaW5zZXJ0KGVudHJ5KTsKKyAgICB9CisKKyAgbmRuOjpFbmNvZGluZ0J1ZmZlciBidWZmZXI7CisKKyAgbV9mYWNlLT5vblJlY2VpdmVEYXRhICs9CisgICAgYmluZCgmRmliRW51bWVyYXRpb25QdWJsaXNoZXJGaXh0dXJlOjpkZWNvZGVGaWJFbnRyeUJsb2NrLCB0aGlzLCBfMSk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9sb2NhbGhvc3QvbmZkL2ZpYi9saXN0IikpOworCisgIG1fbWFuYWdlci5vbkZpYlJlcXVlc3QoKmNvbW1hbmQpOworICBCT09TVF9SRVFVSVJFKG1fZmluaXNoZWQpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2dlbmVyYWwtY29uZmlnLXNlY3Rpb24uY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L2dlbmVyYWwtY29uZmlnLXNlY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTVlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvZ2VuZXJhbC1jb25maWctc2VjdGlvbi5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJtZ210L2dlbmVyYWwtY29uZmlnLXNlY3Rpb24uaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShNZ210R2VuZXJhbENvbmZpZ1NlY3Rpb24sIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShVc2VyQW5kR3JvdXBDb25maWcpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJRyA9CisgICAgImdlbmVyYWxcbiIKKyAgICAie1xuIgorICAgICIgIHVzZXIgbm9ib2R5XG4iCisgICAgIiAgZ3JvdXAgbm9ncm91cFxuIgorICAgICJ9XG4iOworCisgIENvbmZpZ0ZpbGUgY29uZmlnRmlsZTsKKworICBnZW5lcmFsOjpzZXRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworICBCT09TVF9DSEVDS19OT19USFJPVyhjb25maWdGaWxlLnBhcnNlKENPTkZJRywgdHJ1ZSwgInRlc3QtZ2VuZXJhbC1jb25maWctc2VjdGlvbiIpKTsKKworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShEZWZhdWx0Q29uZmlnKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJnZW5lcmFsXG4iCisgICAgIntcbiIKKyAgICAifVxuIjsKKworICBDb25maWdGaWxlIGNvbmZpZ0ZpbGU7CisKKyAgZ2VuZXJhbDo6c2V0Q29uZmlnRmlsZShjb25maWdGaWxlKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coY29uZmlnRmlsZS5wYXJzZShDT05GSUcsIHRydWUsICJ0ZXN0LWdlbmVyYWwtY29uZmlnLXNlY3Rpb24iKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE5vVXNlckNvbmZpZykKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZ2VuZXJhbFxuIgorICAgICJ7XG4iCisgICAgIiAgZ3JvdXAgbm9ncm91cFxuIgorICAgICJ9XG4iOworCisgIENvbmZpZ0ZpbGUgY29uZmlnRmlsZTsKKworICBnZW5lcmFsOjpzZXRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworICBCT09TVF9DSEVDS19OT19USFJPVyhjb25maWdGaWxlLnBhcnNlKENPTkZJRywgdHJ1ZSwgInRlc3QtZ2VuZXJhbC1jb25maWctc2VjdGlvbiIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9Hcm91cENvbmZpZykKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAiZ2VuZXJhbFxuIgorICAgICJ7XG4iCisgICAgIiAgdXNlciBub2JvZHlcbiIKKyAgICAifVxuIjsKKworICBDb25maWdGaWxlIGNvbmZpZ0ZpbGU7CisKKyAgZ2VuZXJhbDo6c2V0Q29uZmlnRmlsZShjb25maWdGaWxlKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coY29uZmlnRmlsZS5wYXJzZShDT05GSUcsIHRydWUsICJ0ZXN0LWdlbmVyYWwtY29uZmlnLXNlY3Rpb24iKSk7Cit9CisKK3N0YXRpYyBib29sCitjaGVja0V4Y2VwdGlvbk1lc3NhZ2UoY29uc3QgQ29uZmlnRmlsZTo6RXJyb3ImIGVycm9yLCBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWQpCit7CisgIHJldHVybiBlcnJvci53aGF0KCkgPT0gZXhwZWN0ZWQ7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEludmFsaWRVc2VyQ29uZmlnKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJnZW5lcmFsXG4iCisgICAgIntcbiIKKyAgICAiICB1c2VyXG4iCisgICAgIn1cbiI7CisKKyAgQ29uZmlnRmlsZSBjb25maWdGaWxlOworICBnZW5lcmFsOjpzZXRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIkludmFsaWQgdmFsdWUgZm9yIFwidXNlclwiIGluIFwiZ2VuZXJhbFwiIHNlY3Rpb24iOworICBCT09TVF9SRVFVSVJFX0VYQ0VQVElPTihjb25maWdGaWxlLnBhcnNlKENPTkZJRywgdHJ1ZSwgInRlc3QtZ2VuZXJhbC1jb25maWctc2VjdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmY2hlY2tFeGNlcHRpb25NZXNzYWdlLCBfMSwgZXhwZWN0ZWQpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSW52YWxpZEdyb3VwQ29uZmlnKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJnZW5lcmFsXG4iCisgICAgIntcbiIKKyAgICAiICBncm91cFxuIgorICAgICJ9XG4iOworCisgIENvbmZpZ0ZpbGUgY29uZmlnRmlsZTsKKyAgZ2VuZXJhbDo6c2V0Q29uZmlnRmlsZShjb25maWdGaWxlKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJJbnZhbGlkIHZhbHVlIGZvciBcImdyb3VwXCIgaW4gXCJnZW5lcmFsXCIgc2VjdGlvbiI7CisgIEJPT1NUX1JFUVVJUkVfRVhDRVBUSU9OKGNvbmZpZ0ZpbGUucGFyc2UoQ09ORklHLCB0cnVlLCAidGVzdC1nZW5lcmFsLWNvbmZpZy1zZWN0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZjaGVja0V4Y2VwdGlvbk1lc3NhZ2UsIF8xLCBleHBlY3RlZCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKKworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvaW50ZXJuYWwtZmFjZS5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvaW50ZXJuYWwtZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxNWMwZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9pbnRlcm5hbC1mYWNlLmNwcApAQCAtMCwwICsxLDI0MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm1nbXQvaW50ZXJuYWwtZmFjZS5ocHAiCisjaW5jbHVkZSAidGVzdHMvZGFlbW9uL2ZhY2UvZHVtbXktZmFjZS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTkZEX0xPR19JTklUKCJJbnRlcm5hbEZhY2VUZXN0Iik7CisKK2NsYXNzIEludGVybmFsRmFjZUZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKworICBJbnRlcm5hbEZhY2VGaXh0dXJlKCkKKyAgICA6IG1fb25JbnRlcmVzdEZpcmVkKGZhbHNlKSwKKyAgICAgIG1fbm9PbkludGVyZXN0RmlyZWQoZmFsc2UpCisgIHsKKworICB9CisKKyAgdm9pZAorICB2YWxpZGF0ZU9uSW50ZXJlc3RDYWxsYmFjayhjb25zdCBOYW1lJiBuYW1lLCBjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpCisgIHsKKyAgICBtX29uSW50ZXJlc3RGaXJlZCA9IHRydWU7CisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlTm9PbkludGVyZXN0Q2FsbGJhY2soY29uc3QgTmFtZSYgbmFtZSwgY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KQorICB7CisgICAgbV9ub09uSW50ZXJlc3RGaXJlZCA9IHRydWU7CisgIH0KKworICB2b2lkCisgIGFkZEZhY2Uoc2hhcmVkX3B0cjxGYWNlPiBmYWNlKQorICB7CisgICAgbV9mYWNlcy5wdXNoX2JhY2soZmFjZSk7CisgIH0KKworICBib29sCisgIGRpZE9uSW50ZXJlc3RGaXJlKCkKKyAgeworICAgIHJldHVybiBtX29uSW50ZXJlc3RGaXJlZDsKKyAgfQorCisgIGJvb2wKKyAgZGlkTm9PbkludGVyZXN0RmlyZSgpCisgIHsKKyAgICByZXR1cm4gbV9ub09uSW50ZXJlc3RGaXJlZDsKKyAgfQorCisgIHZvaWQKKyAgcmVzZXRPbkludGVyZXN0RmlyZWQoKQorICB7CisgICAgbV9vbkludGVyZXN0RmlyZWQgPSBmYWxzZTsKKyAgfQorCisgIHZvaWQKKyAgcmVzZXROb09uSW50ZXJlc3RGaXJlZCgpCisgIHsKKyAgICBtX25vT25JbnRlcmVzdEZpcmVkID0gZmFsc2U7CisgIH0KKworcHJvdGVjdGVkOgorICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8RmFjZT4gPiBtX2ZhY2VzOworICBib29sIG1fb25JbnRlcmVzdEZpcmVkOworICBib29sIG1fbm9PbkludGVyZXN0RmlyZWQ7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoTWdtdEludGVybmFsRmFjZSwgSW50ZXJuYWxGYWNlRml4dHVyZSkKKwordm9pZAordmFsaWRhdGVQdXREYXRhKGJvb2wmIGNhbGxlZCwgY29uc3QgTmFtZSYgZXhwZWN0ZWROYW1lLCBjb25zdCBEYXRhJiBkYXRhKQoreworICBjYWxsZWQgPSB0cnVlOworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZE5hbWUsIGRhdGEuZ2V0TmFtZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUHV0RGF0YSkKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlKG5ldyBJbnRlcm5hbEZhY2UpOworCisgIGJvb2wgZGlkUHV0RGF0YSA9IGZhbHNlOworICBOYW1lIGRhdGFOYW1lKCIvaGVsbG8iKTsKKyAgZmFjZS0+b25SZWNlaXZlRGF0YSArPSBiaW5kKCZ2YWxpZGF0ZVB1dERhdGEsIHJlZihkaWRQdXREYXRhKSwgZGF0YU5hbWUsIF8xKTsKKworICBEYXRhIHRlc3REYXRhKGRhdGFOYW1lKTsKKyAgbV9rZXlDaGFpbi5zaWduKHRlc3REYXRhKTsKKyAgZmFjZS0+cHV0KHRlc3REYXRhKTsKKworICBCT09TVF9SRVFVSVJFKGRpZFB1dERhdGEpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKGZhY2UtPmNsb3NlKCksIEludGVybmFsRmFjZTo6RXJyb3IpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTZW5kSW50ZXJlc3RIaXRFbmQpCit7CisgIGFkZEZhY2UobWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpKTsKKworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gZmFjZShuZXcgSW50ZXJuYWxGYWNlKTsKKworICBmYWNlLT5zZXRJbnRlcmVzdEZpbHRlcigiL2xvY2FsaG9zdC9uZmQvZmliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmSW50ZXJuYWxGYWNlRml4dHVyZTo6dmFsaWRhdGVPbkludGVyZXN0Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgXzEsIF8yKSk7CisKKyAgLy8gZ2VuZXJhdGUgY29tbWFuZCB3aG9zZSBuYW1lIGlzIGNhbm9uaWNhbGx5CisgIC8vIG9yZGVyZWQgYWZ0ZXIgL2xvY2FsaG9zdC9uZmQvZmliIHNvIHRoYXQKKyAgLy8gd2UgaGl0IHRoZSBlbmQgb2YgdGhlIHN0ZDo6bWFwCisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliL2VuZCIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kID0gbWFrZUludGVyZXN0KGNvbW1hbmROYW1lKTsKKyAgZmFjZS0+c2VuZEludGVyZXN0KCpjb21tYW5kKTsKKyAgZ19pby5ydW5fb25lKCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRPbkludGVyZXN0RmlyZSgpKTsKKyAgQk9PU1RfUkVRVUlSRShkaWROb09uSW50ZXJlc3RGaXJlKCkgPT0gZmFsc2UpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTZW5kSW50ZXJlc3RIaXRCZWdpbikKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlKG5ldyBJbnRlcm5hbEZhY2UpOworCisgIGZhY2UtPnNldEludGVyZXN0RmlsdGVyKCIvbG9jYWxob3N0L25mZC9maWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZJbnRlcm5hbEZhY2VGaXh0dXJlOjp2YWxpZGF0ZU5vT25JbnRlcmVzdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMikpOworCisgIC8vIGdlbmVyYXRlIGNvbW1hbmQgd2hvc2UgbmFtZSBpcyBjYW5vbmljYWxseQorICAvLyBvcmRlcmVkIGJlZm9yZSAvbG9jYWxob3N0L25mZC9maWIgc28gdGhhdAorICAvLyB3ZSBoaXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RkOjptYXAKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZCIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kID0gbWFrZUludGVyZXN0KGNvbW1hbmROYW1lKTsKKyAgZmFjZS0+c2VuZEludGVyZXN0KCpjb21tYW5kKTsKKyAgZ19pby5ydW5fb25lKCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWROb09uSW50ZXJlc3RGaXJlKCkgPT0gZmFsc2UpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTZW5kSW50ZXJlc3RIaXRFeGFjdCkKK3sKKyAgYWRkRmFjZShtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCkpOworCisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBmYWNlKG5ldyBJbnRlcm5hbEZhY2UpOworCisgIGZhY2UtPnNldEludGVyZXN0RmlsdGVyKCIvbG9jYWxob3N0L25mZC9laWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZJbnRlcm5hbEZhY2VGaXh0dXJlOjp2YWxpZGF0ZU5vT25JbnRlcmVzdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMikpOworCisgIGZhY2UtPnNldEludGVyZXN0RmlsdGVyKCIvbG9jYWxob3N0L25mZC9maWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZJbnRlcm5hbEZhY2VGaXh0dXJlOjp2YWxpZGF0ZU9uSW50ZXJlc3RDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMikpOworCisgIGZhY2UtPnNldEludGVyZXN0RmlsdGVyKCIvbG9jYWxob3N0L25mZC9naWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZJbnRlcm5hbEZhY2VGaXh0dXJlOjp2YWxpZGF0ZU5vT25JbnRlcmVzdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMikpOworCisgIC8vIGdlbmVyYXRlIGNvbW1hbmQgd2hvc2UgbmFtZSBleGFjdGx5IG1hdGNoZXMKKyAgLy8gL2xvY2FsaG9zdC9uZmQvZmliCisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliIik7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQgPSBtYWtlSW50ZXJlc3QoY29tbWFuZE5hbWUpOworICBmYWNlLT5zZW5kSW50ZXJlc3QoKmNvbW1hbmQpOworICBnX2lvLnJ1bl9vbmUoKTsKKworICBCT09TVF9SRVFVSVJFKGRpZE9uSW50ZXJlc3RGaXJlKCkpOworICBCT09TVF9SRVFVSVJFKGRpZE5vT25JbnRlcmVzdEZpcmUoKSA9PSBmYWxzZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNlbmRJbnRlcmVzdEhpdFByZXZpb3VzKQoreworICBhZGRGYWNlKG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKSk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UobmV3IEludGVybmFsRmFjZSk7CisKKyAgZmFjZS0+c2V0SW50ZXJlc3RGaWx0ZXIoIi9sb2NhbGhvc3QvbmZkL2ZpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkludGVybmFsRmFjZUZpeHR1cmU6OnZhbGlkYXRlT25JbnRlcmVzdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMikpOworCisgIGZhY2UtPnNldEludGVyZXN0RmlsdGVyKCIvbG9jYWxob3N0L25mZC9maWIvenp6enp6enp6enp6ei8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZJbnRlcm5hbEZhY2VGaXh0dXJlOjp2YWxpZGF0ZU5vT25JbnRlcmVzdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMikpOworCisgIC8vIGdlbmVyYXRlIGNvbW1hbmQgd2hvc2UgbmFtZSBleGFjdGx5IG1hdGNoZXMKKyAgLy8gYW4gSW50ZXJlc3QgZmlsdGVyCisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmliL3ByZXZpb3VzIik7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQgPSBtYWtlSW50ZXJlc3QoY29tbWFuZE5hbWUpOworICBmYWNlLT5zZW5kSW50ZXJlc3QoKmNvbW1hbmQpOworICBnX2lvLnJ1bl9vbmUoKTsKKworICBCT09TVF9SRVFVSVJFKGRpZE9uSW50ZXJlc3RGaXJlKCkpOworICBCT09TVF9SRVFVSVJFKGRpZE5vT25JbnRlcmVzdEZpcmUoKSA9PSBmYWxzZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEludGVyZXN0R29uZSkKK3sKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IGZhY2UgPSBtYWtlX3NoYXJlZDxJbnRlcm5hbEZhY2U+KCk7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZUludGVyZXN0KCJuZG46L2xvY2FsaG9zdC9uZmQvZ29uZSIpOworICBmYWNlLT5zZW5kSW50ZXJlc3QoKmludGVyZXN0KTsKKworICBpbnRlcmVzdC5yZXNldCgpOworICBCT09TVF9DSEVDS19OT19USFJPVyhnX2lvLnBvbGwoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvbWFsZm9ybWVkLm5kbmNlcnQgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvbWFsZm9ybWVkLm5kbmNlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiMmZiYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9tYWxmb3JtZWQubmRuY2VydApAQCAtMCwwICsxIEBACitkZWZpbml0ZWx5IG5vdCBhIGtleQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vbWdtdC9tYW5hZ2VyLWJhc2UuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L21hbmFnZXItYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhNzA3NwotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9tYW5hZ2VyLWJhc2UuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAibWdtdC9tYW5hZ2VyLWJhc2UuaHBwIgorI2luY2x1ZGUgIm1nbXQvaW50ZXJuYWwtZmFjZS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTkZEX0xPR19JTklUKCJNYW5hZ2VyQmFzZVRlc3QiKTsKKworY2xhc3MgTWFuYWdlckJhc2VUZXN0IDogcHVibGljIE1hbmFnZXJCYXNlLCBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKKworcHVibGljOgorCisgIE1hbmFnZXJCYXNlVGVzdCgpCisgICAgOiBNYW5hZ2VyQmFzZShtYWtlX3NoYXJlZDxJbnRlcm5hbEZhY2U+KCksICJURVNULVBSSVZJTEVHRSIsIG1fa2V5Q2hhaW4pLAorICAgICAgbV9jYWxsYmFja0ZpcmVkKGZhbHNlKQorICB7CisKKyAgfQorCisgIHZvaWQKKyAgdGVzdFNldFJlc3BvbnNlKENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpCisgIHsKKyAgICBzZXRSZXNwb25zZShyZXNwb25zZSwgY29kZSwgdGV4dCk7CisgIH0KKworICB2b2lkCisgIHRlc3RTZW5kUmVzcG9uc2UoY29uc3QgTmFtZSYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrJiBib2R5KQorICB7CisgICAgc2VuZFJlc3BvbnNlKG5hbWUsIGNvZGUsIHRleHQsIGJvZHkpOworICB9CisKKyAgdm9pZAorICB0ZXN0U2VuZFJlc3BvbnNlKGNvbnN0IE5hbWUmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkKKyAgeworICAgIHNlbmRSZXNwb25zZShuYW1lLCBjb2RlLCB0ZXh0KTsKKyAgfQorCisgIHZvaWQKKyAgdGVzdFNlbmRSZXNwb25zZShjb25zdCBOYW1lJiBuYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRyb2xSZXNwb25zZSYgcmVzcG9uc2UpCisgIHsKKyAgICBzZW5kUmVzcG9uc2UobmFtZSwgcmVzcG9uc2UpOworICB9CisKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+CisgIGdldEludGVybmFsRmFjZSgpCisgIHsKKyAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxJbnRlcm5hbEZhY2U+KG1fZmFjZSk7CisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKGNvbnN0IERhdGEmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBleHBlY3RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkVGV4dCkKKyAgeworICAgIG1fY2FsbGJhY2tGaXJlZCA9IHRydWU7CisgICAgQmxvY2sgY29udHJvbFJhdyA9IHJlc3BvbnNlLmdldENvbnRlbnQoKS5ibG9ja0Zyb21WYWx1ZSgpOworCisgICAgQ29udHJvbFJlc3BvbnNlIGNvbnRyb2w7CisgICAgY29udHJvbC53aXJlRGVjb2RlKGNvbnRyb2xSYXcpOworCisgICAgTkZEX0xPR19ERUJVRygicmVjZWl2ZWQgY29udHJvbCByZXNwb25zZSIKKyAgICAgICAgICAgICAgICAgIDw8ICIgbmFtZTogIiA8PCByZXNwb25zZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgY29kZTogIiA8PCBjb250cm9sLmdldENvZGUoKQorICAgICAgICAgICAgICAgICAgPDwgIiB0ZXh0OiAiIDw8IGNvbnRyb2wuZ2V0VGV4dCgpKTsKKworICAgIEJPT1NUX1JFUVVJUkUocmVzcG9uc2UuZ2V0TmFtZSgpID09IGV4cGVjdGVkTmFtZSk7CisgICAgQk9PU1RfUkVRVUlSRShjb250cm9sLmdldENvZGUoKSA9PSBleHBlY3RlZENvZGUpOworICAgIEJPT1NUX1JFUVVJUkUoY29udHJvbC5nZXRUZXh0KCkgPT0gZXhwZWN0ZWRUZXh0KTsKKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2UoY29uc3QgRGF0YSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9jayYgZXhwZWN0ZWRCb2R5KQorICB7CisgICAgbV9jYWxsYmFja0ZpcmVkID0gdHJ1ZTsKKyAgICBCbG9jayBjb250cm9sUmF3ID0gcmVzcG9uc2UuZ2V0Q29udGVudCgpLmJsb2NrRnJvbVZhbHVlKCk7CisKKyAgICBDb250cm9sUmVzcG9uc2UgY29udHJvbDsKKyAgICBjb250cm9sLndpcmVEZWNvZGUoY29udHJvbFJhdyk7CisKKyAgICBORkRfTE9HX0RFQlVHKCJyZWNlaXZlZCBjb250cm9sIHJlc3BvbnNlIgorICAgICAgICAgICAgICAgICAgPDwgIiBuYW1lOiAiIDw8IHJlc3BvbnNlLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiBjb2RlOiAiIDw8IGNvbnRyb2wuZ2V0Q29kZSgpCisgICAgICAgICAgICAgICAgICA8PCAiIHRleHQ6ICIgPDwgY29udHJvbC5nZXRUZXh0KCkpOworCisgICAgQk9PU1RfUkVRVUlSRShyZXNwb25zZS5nZXROYW1lKCkgPT0gZXhwZWN0ZWROYW1lKTsKKyAgICBCT09TVF9SRVFVSVJFKGNvbnRyb2wuZ2V0Q29kZSgpID09IGV4cGVjdGVkQ29kZSk7CisgICAgQk9PU1RfUkVRVUlSRShjb250cm9sLmdldFRleHQoKSA9PSBleHBlY3RlZFRleHQpOworCisgICAgQk9PU1RfUkVRVUlSRShjb250cm9sLmdldEJvZHkoKS52YWx1ZV9zaXplKCkgPT0gZXhwZWN0ZWRCb2R5LnZhbHVlX3NpemUoKSk7CisKKyAgICBCT09TVF9DSEVDSyhtZW1jbXAoY29udHJvbC5nZXRCb2R5KCkudmFsdWUoKSwgZXhwZWN0ZWRCb2R5LnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQm9keS52YWx1ZV9zaXplKCkpID09IDApOworICB9CisKKyAgYm9vbAorICBkaWRDYWxsYmFja0ZpcmUoKQorICB7CisgICAgcmV0dXJuIG1fY2FsbGJhY2tGaXJlZDsKKyAgfQorCitwcml2YXRlOgorCisgIGJvb2wgbV9jYWxsYmFja0ZpcmVkOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShNZ210TWFuYWdlckJhc2UsIE1hbmFnZXJCYXNlVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2V0UmVzcG9uc2UpCit7CisgIENvbnRyb2xSZXNwb25zZSByZXNwb25zZSgyMDAsICJPSyIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlLmdldENvZGUoKSwgMjAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVzcG9uc2UuZ2V0VGV4dCgpLCAiT0siKTsKKworICB0ZXN0U2V0UmVzcG9uc2UocmVzcG9uc2UsIDEwMCwgInRlc3QiKTsKKworICBCT09TVF9DSEVDS19FUVVBTChyZXNwb25zZS5nZXRDb2RlKCksIDEwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlLmdldFRleHQoKSwgInRlc3QiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2VuZFJlc3BvbnNlNEFyZykKK3sKKyAgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSgiL3Rlc3QvYm9keSIpOworCisgIGdldEludGVybmFsRmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBwYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgIi9yZXNwb25zZSIsIDEwMCwgInRlc3QiLCBwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisgIH07CisKKyAgdGVzdFNlbmRSZXNwb25zZSgiL3Jlc3BvbnNlIiwgMTAwLCAidGVzdCIsIHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2VuZFJlc3BvbnNlM0FyZykKK3sKKyAgZ2V0SW50ZXJuYWxGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXNdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCAiL3Jlc3BvbnNlIiwgMTAwLCAidGVzdCIpOworICB9OworCisgIHRlc3RTZW5kUmVzcG9uc2UoIi9yZXNwb25zZSIsIDEwMCwgInRlc3QiKTsKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNlbmRSZXNwb25zZTJBcmcpCit7CisgIGdldEludGVybmFsRmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgIi9yZXNwb25zZSIsIDEwMCwgInRlc3QiKTsKKyAgfTsKKworICBDb250cm9sUmVzcG9uc2UgcmVzcG9uc2UoMTAwLCAidGVzdCIpOworCisgIHRlc3RTZW5kUmVzcG9uc2UoIi9yZXNwb25zZSIsIDEwMCwgInRlc3QiKTsKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvc3RhdHVzLXNlcnZlci5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvc3RhdHVzLXNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhNjlhNAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9zdGF0dXMtc2VydmVyLmNwcApAQCAtMCwwICsxLDEwNSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm1nbXQvc3RhdHVzLXNlcnZlci5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmhwcCIKKyNpbmNsdWRlICJtZ210L2ludGVybmFsLWZhY2UuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2RhZW1vbi9mYWNlL2R1bW15LWZhY2UuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShNZ210U3RhdHVzU2VydmVyLCBCYXNlRml4dHVyZSkKKworc2hhcmVkX3B0cjxjb25zdCBEYXRhPiBnX3Jlc3BvbnNlOworCit2b2lkCitpbnRlcmNlcHRSZXNwb25zZShjb25zdCBEYXRhJiBkYXRhKQoreworICBnX3Jlc3BvbnNlID0gZGF0YS5zaGFyZWRfZnJvbV90aGlzKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFN0YXR1cykKK3sKKyAgLy8gaW5pdGlhbGl6ZQorICB0aW1lOjpzeXN0ZW1fY2xvY2s6OlRpbWVQb2ludCB0MSA9IHRpbWU6OnN5c3RlbV9jbG9jazo6bm93KCk7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIHNoYXJlZF9wdHI8SW50ZXJuYWxGYWNlPiBpbnRlcm5hbEZhY2UgPSBtYWtlX3NoYXJlZDxJbnRlcm5hbEZhY2U+KCk7CisgIGludGVybmFsRmFjZS0+b25SZWNlaXZlRGF0YSArPSAmaW50ZXJjZXB0UmVzcG9uc2U7CisgIG5kbjo6S2V5Q2hhaW4ga2V5Q2hhaW47CisgIFN0YXR1c1NlcnZlciBzdGF0dXNTZXJ2ZXIoaW50ZXJuYWxGYWNlLCByZWYoZm9yd2FyZGVyKSwga2V5Q2hhaW4pOworICB0aW1lOjpzeXN0ZW1fY2xvY2s6OlRpbWVQb2ludCB0MiA9IHRpbWU6OnN5c3RlbV9jbG9jazo6bm93KCk7CisKKyAgLy8gcG9wdWxhdGUgdGFibGVzCisgIGZvcndhcmRlci5nZXRGaWIoKS5pbnNlcnQoIm5kbjovZmliMSIpOworICBmb3J3YXJkZXIuZ2V0UGl0KCkuaW5zZXJ0KCptYWtlSW50ZXJlc3QoIm5kbjovcGl0MSIpKTsKKyAgZm9yd2FyZGVyLmdldFBpdCgpLmluc2VydCgqbWFrZUludGVyZXN0KCJuZG46L3BpdDIiKSk7CisgIGZvcndhcmRlci5nZXRQaXQoKS5pbnNlcnQoKm1ha2VJbnRlcmVzdCgibmRuOi9waXQzIikpOworICBmb3J3YXJkZXIuZ2V0UGl0KCkuaW5zZXJ0KCptYWtlSW50ZXJlc3QoIm5kbjovcGl0NCIpKTsKKyAgZm9yd2FyZGVyLmdldE1lYXN1cmVtZW50cygpLmdldCgibmRuOi9tZWFzdXJlbWVudHMxIik7CisgIGZvcndhcmRlci5nZXRNZWFzdXJlbWVudHMoKS5nZXQoIm5kbjovbWVhc3VyZW1lbnRzMiIpOworICBmb3J3YXJkZXIuZ2V0TWVhc3VyZW1lbnRzKCkuZ2V0KCJuZG46L21lYXN1cmVtZW50czMiKTsKKyAgQk9PU1RfQ0hFQ0tfR0UoZm9yd2FyZGVyLmdldEZpYigpLnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0dFKGZvcndhcmRlci5nZXRQaXQoKS5zaXplKCksIDQpOworICBCT09TVF9DSEVDS19HRShmb3J3YXJkZXIuZ2V0TWVhc3VyZW1lbnRzKCkuc2l6ZSgpLCAzKTsKKworICAvLyByZXF1ZXN0CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IHJlcXVlc3QgPSBtYWtlSW50ZXJlc3QoIm5kbjovbG9jYWxob3N0L25mZC9zdGF0dXMiKTsKKyAgcmVxdWVzdC0+c2V0TXVzdEJlRnJlc2godHJ1ZSk7CisgIHJlcXVlc3QtPnNldENoaWxkU2VsZWN0b3IoMSk7CisKKyAgZ19yZXNwb25zZS5yZXNldCgpOworICB0aW1lOjpzeXN0ZW1fY2xvY2s6OlRpbWVQb2ludCB0MyA9IHRpbWU6OnN5c3RlbV9jbG9jazo6bm93KCk7CisgIGludGVybmFsRmFjZS0+c2VuZEludGVyZXN0KCpyZXF1ZXN0KTsKKyAgZ19pby5ydW5fb25lKCk7CisgIHRpbWU6OnN5c3RlbV9jbG9jazo6VGltZVBvaW50IHQ0ID0gdGltZTo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihnX3Jlc3BvbnNlKSk7CisKKyAgLy8gdmVyaWZ5CisgIG5kbjo6bmZkOjpGb3J3YXJkZXJTdGF0dXMgc3RhdHVzOworICBCT09TVF9SRVFVSVJFX05PX1RIUk9XKHN0YXR1cy53aXJlRGVjb2RlKGdfcmVzcG9uc2UtPmdldENvbnRlbnQoKSkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXROZmRWZXJzaW9uKCksIE5GRF9WRVJTSU9OX0JVSUxEX1NUUklORyk7CisgIEJPT1NUX0NIRUNLX0dFKHRpbWU6OnRvVW5peFRpbWVzdGFtcChzdGF0dXMuZ2V0U3RhcnRUaW1lc3RhbXAoKSksIHRpbWU6OnRvVW5peFRpbWVzdGFtcCh0MSkpOworICBCT09TVF9DSEVDS19MRSh0aW1lOjp0b1VuaXhUaW1lc3RhbXAoc3RhdHVzLmdldFN0YXJ0VGltZXN0YW1wKCkpLCB0aW1lOjp0b1VuaXhUaW1lc3RhbXAodDIpKTsKKyAgQk9PU1RfQ0hFQ0tfR0UodGltZTo6dG9Vbml4VGltZXN0YW1wKHN0YXR1cy5nZXRDdXJyZW50VGltZXN0YW1wKCkpLCB0aW1lOjp0b1VuaXhUaW1lc3RhbXAodDMpKTsKKyAgQk9PU1RfQ0hFQ0tfTEUodGltZTo6dG9Vbml4VGltZXN0YW1wKHN0YXR1cy5nZXRDdXJyZW50VGltZXN0YW1wKCkpLCB0aW1lOjp0b1VuaXhUaW1lc3RhbXAodDQpKTsKKworICAvLyBTdGF0dXNTZXJ2ZXIgdW5kZXIgdGVzdCBpc24ndCBhZGRlZCB0byBGb3J3YXJkZXIsCisgIC8vIHNvIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHdvbid0IGFmZmVjdCB0YWJsZSBzaXplCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXROTmFtZVRyZWVFbnRyaWVzKCksIGZvcndhcmRlci5nZXROYW1lVHJlZSgpLnNpemUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXRORmliRW50cmllcygpLCBmb3J3YXJkZXIuZ2V0RmliKCkuc2l6ZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdHVzLmdldE5QaXRFbnRyaWVzKCksIGZvcndhcmRlci5nZXRQaXQoKS5zaXplKCkpOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0dXMuZ2V0Tk1lYXN1cmVtZW50c0VudHJpZXMoKSwgZm9yd2FyZGVyLmdldE1lYXN1cmVtZW50cygpLnNpemUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXR1cy5nZXROQ3NFbnRyaWVzKCksIGZvcndhcmRlci5nZXRDcygpLnNpemUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLW1hbmFnZXIuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L3N0cmF0ZWd5LWNob2ljZS1tYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBjMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L3N0cmF0ZWd5LWNob2ljZS1tYW5hZ2VyLmNwcApAQCAtMCwwICsxLDY0NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgIm1nbXQvc3RyYXRlZ3ktY2hvaWNlLW1hbmFnZXIuaHBwIgorI2luY2x1ZGUgImZhY2UvZmFjZS5ocHAiCisjaW5jbHVkZSAibWdtdC9pbnRlcm5hbC1mYWNlLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9uYW1lLXRyZWUuaHBwIgorI2luY2x1ZGUgInRhYmxlL3N0cmF0ZWd5LWNob2ljZS5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICJmdy9zdHJhdGVneS5ocHAiCisjaW5jbHVkZSAidGVzdHMvZGFlbW9uL2ZhY2UvZHVtbXktZmFjZS5ocHAiCisjaW5jbHVkZSAidGVzdHMvZGFlbW9uL2Z3L2R1bW15LXN0cmF0ZWd5LmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtc3RyYXRlZ3ktY2hvaWNlLmhwcD4KKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICJ2YWxpZGF0aW9uLWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTkZEX0xPR19JTklUKCJNZ210U3RyYXRlZ3lDaG9pY2VNYW5hZ2VyIik7CisKK2NsYXNzIFN0cmF0ZWd5Q2hvaWNlTWFuYWdlckZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKworICBTdHJhdGVneUNob2ljZU1hbmFnZXJGaXh0dXJlKCkKKyAgICA6IG1fc3RyYXRlZ3lDaG9pY2UobV9mb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKSkKKyAgICAsIG1fZmFjZShtYWtlX3NoYXJlZDxJbnRlcm5hbEZhY2U+KCkpCisgICAgLCBtX21hbmFnZXIobV9zdHJhdGVneUNob2ljZSwgbV9mYWNlLCBtX2tleUNoYWluKQorICAgICwgbV9jYWxsYmFja0ZpcmVkKGZhbHNlKQorICB7CisgICAgbV9zdHJhdGVneUNob2ljZS5pbnN0YWxsKG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihtX2ZvcndhcmRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEiKSk7CisgICAgbV9zdHJhdGVneUNob2ljZS5pbnNlcnQoIm5kbjovIiwgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYSIpOworICB9CisKKyAgdmlydHVhbAorICB+U3RyYXRlZ3lDaG9pY2VNYW5hZ2VyRml4dHVyZSgpCisgIHsKKworICB9CisKKyAgdm9pZAorICB2YWxpZGF0ZUNvbnRyb2xSZXNwb25zZUNvbW1vbihjb25zdCBEYXRhJiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZSYgZXhwZWN0ZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZFRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xSZXNwb25zZSYgY29udHJvbCkKKyAgeworICAgIG1fY2FsbGJhY2tGaXJlZCA9IHRydWU7CisgICAgQmxvY2sgY29udHJvbFJhdyA9IHJlc3BvbnNlLmdldENvbnRlbnQoKS5ibG9ja0Zyb21WYWx1ZSgpOworCisgICAgY29udHJvbC53aXJlRGVjb2RlKGNvbnRyb2xSYXcpOworCisgICAgTkZEX0xPR19ERUJVRygicmVjZWl2ZWQgY29udHJvbCByZXNwb25zZSIKKyAgICAgICAgICAgICAgICAgIDw8ICIgTmFtZTogIiA8PCByZXNwb25zZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgY29kZTogIiA8PCBjb250cm9sLmdldENvZGUoKQorICAgICAgICAgICAgICAgICAgPDwgIiB0ZXh0OiAiIDw8IGNvbnRyb2wuZ2V0VGV4dCgpKTsKKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlLmdldE5hbWUoKSwgZXhwZWN0ZWROYW1lKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjb250cm9sLmdldENvZGUoKSwgZXhwZWN0ZWRDb2RlKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjb250cm9sLmdldFRleHQoKSwgZXhwZWN0ZWRUZXh0KTsKKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2UoY29uc3QgRGF0YSYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWUmIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRUZXh0KQorICB7CisgICAgQ29udHJvbFJlc3BvbnNlIGNvbnRyb2w7CisgICAgdmFsaWRhdGVDb250cm9sUmVzcG9uc2VDb21tb24ocmVzcG9uc2UsIGV4cGVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZENvZGUsIGV4cGVjdGVkVGV4dCwgY29udHJvbCk7CisKKyAgICBpZiAoIWNvbnRyb2wuZ2V0Qm9keSgpLmVtcHR5KCkpCisgICAgICB7CisgICAgICAgIEJPT1NUX0ZBSUwoImZvdW5kIHVuZXhwZWN0ZWQgY29udHJvbCByZXNwb25zZSBib2R5Iik7CisgICAgICB9CisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKGNvbnN0IERhdGEmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lJiBleHBlY3RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2smIGV4cGVjdGVkQm9keSkKKyAgeworICAgIENvbnRyb2xSZXNwb25zZSBjb250cm9sOworICAgIHZhbGlkYXRlQ29udHJvbFJlc3BvbnNlQ29tbW9uKHJlc3BvbnNlLCBleHBlY3RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2RlLCBleHBlY3RlZFRleHQsIGNvbnRyb2wpOworCisgICAgQk9PU1RfUkVRVUlSRSghY29udHJvbC5nZXRCb2R5KCkuZW1wdHkoKSk7CisgICAgQk9PU1RfUkVRVUlSRShjb250cm9sLmdldEJvZHkoKS52YWx1ZV9zaXplKCkgPT0gZXhwZWN0ZWRCb2R5LnZhbHVlX3NpemUoKSk7CisKKyAgICBCT09TVF9DSEVDSyhtZW1jbXAoY29udHJvbC5nZXRCb2R5KCkudmFsdWUoKSwgZXhwZWN0ZWRCb2R5LnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQm9keS52YWx1ZV9zaXplKCkpID09IDApOworCisgIH0KKworICB2b2lkCisgIHZhbGlkYXRlTGlzdChjb25zdCBEYXRhJiBkYXRhLCBjb25zdCBuZG46Om5mZDo6U3RyYXRlZ3lDaG9pY2UmIGV4cGVjdGVkQ2hvaWNlKQorICB7CisgICAgbV9jYWxsYmFja0ZpcmVkID0gdHJ1ZTsKKyAgICBuZG46Om5mZDo6U3RyYXRlZ3lDaG9pY2UgY2hvaWNlKGRhdGEuZ2V0Q29udGVudCgpLmJsb2NrRnJvbVZhbHVlKCkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGNob2ljZS5nZXRTdHJhdGVneSgpLCBleHBlY3RlZENob2ljZS5nZXRTdHJhdGVneSgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjaG9pY2UuZ2V0TmFtZSgpLCBleHBlY3RlZENob2ljZS5nZXROYW1lKCkpOworICB9CisKKyAgYm9vbAorICBkaWRDYWxsYmFja0ZpcmUoKQorICB7CisgICAgcmV0dXJuIG1fY2FsbGJhY2tGaXJlZDsKKyAgfQorCisgIHZvaWQKKyAgcmVzZXRDYWxsYmFja0ZpcmVkKCkKKyAgeworICAgIG1fY2FsbGJhY2tGaXJlZCA9IGZhbHNlOworICB9CisKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+JgorICBnZXRGYWNlKCkKKyAgeworICAgIHJldHVybiBtX2ZhY2U7CisgIH0KKworICBTdHJhdGVneUNob2ljZU1hbmFnZXImCisgIGdldE1hbmFnZXIoKQorICB7CisgICAgcmV0dXJuIG1fbWFuYWdlcjsKKyAgfQorCisgIFN0cmF0ZWd5Q2hvaWNlJgorICBnZXRTdHJhdGVneUNob2ljZSgpCisgIHsKKyAgICByZXR1cm4gbV9zdHJhdGVneUNob2ljZTsKKyAgfQorCisgIHZvaWQKKyAgYWRkSW50ZXJlc3RSdWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWdleCwKKyAgICAgICAgICAgICAgICAgIG5kbjo6SWRlbnRpdHlDZXJ0aWZpY2F0ZSYgY2VydGlmaWNhdGUpCisgIHsKKyAgICBtX21hbmFnZXIuYWRkSW50ZXJlc3RSdWxlKHJlZ2V4LCBjZXJ0aWZpY2F0ZSk7CisgIH0KKworcHJvdGVjdGVkOgorICBGb3J3YXJkZXIgbV9mb3J3YXJkZXI7CisgIFN0cmF0ZWd5Q2hvaWNlJiBtX3N0cmF0ZWd5Q2hvaWNlOworICBzaGFyZWRfcHRyPEludGVybmFsRmFjZT4gbV9mYWNlOworICBTdHJhdGVneUNob2ljZU1hbmFnZXIgbV9tYW5hZ2VyOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisKK3ByaXZhdGU6CisgIGJvb2wgbV9jYWxsYmFja0ZpcmVkOworfTsKKworY2xhc3MgQWxsU3RyYXRlZ2llc0ZpeHR1cmUgOiBwdWJsaWMgU3RyYXRlZ3lDaG9pY2VNYW5hZ2VyRml4dHVyZQoreworcHVibGljOgorICBBbGxTdHJhdGVnaWVzRml4dHVyZSgpCisgIHsKKyAgICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwobWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKG1fZm9yd2FyZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYiIpKTsKKworICAgIGNvbnN0IE5hbWUgc3RyYXRlZ3lDVmVyc2lvbjEoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYy8lRkQlMDEiKTsKKyAgICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwobWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKG1fZm9yd2FyZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3lDVmVyc2lvbjEpKTsKKworICAgIGNvbnN0IE5hbWUgc3RyYXRlZ3lDVmVyc2lvbjIoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYy8lRkQlMDIiKTsKKyAgICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwobWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKG1fZm9yd2FyZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3lDVmVyc2lvbjIpKTsKKyAgfQorCisgIHZpcnR1YWwKKyAgfkFsbFN0cmF0ZWdpZXNGaXh0dXJlKCkKKyAgeworCisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmUgOiBwdWJsaWMgQ29tbWFuZEZpeHR1cmU8VD4KK3sKK3B1YmxpYzoKKyAgQXV0aG9yaXplZENvbW1hbmRGaXh0dXJlKCkKKyAgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlZ2V4ID0gIl48bG9jYWxob3N0PjxuZmQ+PHN0cmF0ZWd5LWNob2ljZT4iOworICAgIFQ6OmFkZEludGVyZXN0UnVsZShyZWdleCwgKkNvbW1hbmRGaXh0dXJlPFQ+OjptX2NlcnRpZmljYXRlKTsKKyAgfQorCisgIHZpcnR1YWwKKyAgfkF1dGhvcml6ZWRDb21tYW5kRml4dHVyZSgpCisgIHsKKworICB9Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoTWdtdFN0cmF0ZWd5Q2hvaWNlTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemVkQ29tbWFuZEZpeHR1cmU8QWxsU3RyYXRlZ2llc0ZpeHR1cmU+KQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShTaG9ydE5hbWUsIEFsbFN0cmF0ZWdpZXNGaXh0dXJlKQoreworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0PigiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlIikpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBnZXRGYWNlKCktPnNlbmRJbnRlcmVzdCgqY29tbWFuZCk7CisgIGdfaW8ucnVuX29uZSgpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShNYWxmb3JtZWRDb21tbWFuZCwgQWxsU3RyYXRlZ2llc0ZpeHR1cmUpCit7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UiKSk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICB9OworCisgIGdldE1hbmFnZXIoKS5vblN0cmF0ZWd5Q2hvaWNlUmVxdWVzdCgqY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVuc2lnbmVkQ29tbWFuZCwgQWxsU3RyYXRlZ2llc0ZpeHR1cmUpCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSgiL3Rlc3QiKTsKKyAgcGFyYW1ldGVycy5zZXRTdHJhdGVneSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvYmVzdC1yb3V0ZSIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJzZXQiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAxLCAiU2lnbmF0dXJlIHJlcXVpcmVkIik7CisgIH07CisKKyAgZ2V0TWFuYWdlcigpLm9uU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0KCpjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVW5hdXRob3JpemVkQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVuYXV0aG9yaXplZENvbW1hbmRGaXh0dXJlPFN0cmF0ZWd5Q2hvaWNlTWFuYWdlckZpeHR1cmU+KQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi90ZXN0Iik7CisgIHBhcmFtZXRlcnMuc2V0U3RyYXRlZ3koIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jlc3Qtcm91dGUiKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgic2V0Iik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmRdIChjb25zdCBEYXRhJiByZXNwb25zZSkgeworICAgIHRoaXMtPnZhbGlkYXRlQ29udHJvbFJlc3BvbnNlKHJlc3BvbnNlLCBjb21tYW5kLT5nZXROYW1lKCksIDQwMywgIlVuYXV0aG9yaXplZCBjb21tYW5kIik7CisgIH07CisKKyAgZ2V0TWFuYWdlcigpLm9uU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0KCpjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVW5zdXBwb3J0ZWRWZXJiKQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi90ZXN0Iik7CisgIHBhcmFtZXRlcnMuc2V0U3RyYXRlZ3koIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYiIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJ1bnN1cHBvcnRlZCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA1MDEsICJVbnN1cHBvcnRlZCBjb21tYW5kIik7CisgIH07CisKKyAgZ2V0TWFuYWdlcigpLm9uVmFsaWRhdGVkU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0KGNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCYWRPcHRpb25QYXJzZSkKK3sKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgic2V0Iik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgiTm90UmVhbGx5UGFyYW1ldGVycyIpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICB9OworCisgIGdldE1hbmFnZXIoKS5vblZhbGlkYXRlZFN0cmF0ZWd5Q2hvaWNlUmVxdWVzdChjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2V0U3RyYXRlZ2llcykKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXROYW1lKCIvdGVzdCIpOworICBwYXJhbWV0ZXJzLnNldFN0cmF0ZWd5KCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWIiKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgic2V0Iik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKworICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCBlbmNvZGVkUGFyYW1ldGVycyk7CisgIH07CisKKyAgZ2V0TWFuYWdlcigpLm9uVmFsaWRhdGVkU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0KGNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworICBmdzo6U3RyYXRlZ3kmIHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3lDaG9pY2UoKS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIi90ZXN0Iik7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc3RyYXRlZ3kuZ2V0TmFtZSgpLCAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNldFN0cmF0ZWd5U3BlY2lmaWVkVmVyc2lvbikKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXROYW1lKCIvdGVzdCIpOworICBwYXJhbWV0ZXJzLnNldFN0cmF0ZWd5KCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWMvJUZEJTAxIik7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoInNldCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kLCBlbmNvZGVkUGFyYW1ldGVyc10gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsICJTdWNjZXNzIiwgZW5jb2RlZFBhcmFtZXRlcnMpOworICB9OworCisgIGdldE1hbmFnZXIoKS5vblZhbGlkYXRlZFN0cmF0ZWd5Q2hvaWNlUmVxdWVzdChjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgZnc6OlN0cmF0ZWd5JiBzdHJhdGVneSA9IGdldFN0cmF0ZWd5Q2hvaWNlKCkuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCIvdGVzdCIpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHN0cmF0ZWd5LmdldE5hbWUoKSwgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYy8lRkQlMDEiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2V0U3RyYXRlZ3lMYXRlc3RWZXJzaW9uKQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi90ZXN0Iik7CisgIHBhcmFtZXRlcnMuc2V0U3RyYXRlZ3koIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYyIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJzZXQiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHJlc3BvbnNlUGFyYW1ldGVyczsKKyAgcmVzcG9uc2VQYXJhbWV0ZXJzLnNldE5hbWUoIi90ZXN0Iik7CisgIHJlc3BvbnNlUGFyYW1ldGVycy5zZXRTdHJhdGVneSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1jLyVGRCUwMiIpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZCwgcmVzcG9uc2VQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCByZXNwb25zZVBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKyAgfTsKKworICBnZXRNYW5hZ2VyKCkub25WYWxpZGF0ZWRTdHJhdGVneUNob2ljZVJlcXVlc3QoY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIGZ3OjpTdHJhdGVneSYgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneUNob2ljZSgpLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgiL3Rlc3QiKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzdHJhdGVneS5nZXROYW1lKCksICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWMvJUZEJTAyIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFNldFN0cmF0ZWdpZXNNaXNzaW5nTmFtZSkKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRTdHJhdGVneSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iIik7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoInNldCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA0MDAsICJNYWxmb3JtZWQgY29tbWFuZCIpOworICB9OworCisgIGdldE1hbmFnZXIoKS5vblZhbGlkYXRlZFN0cmF0ZWd5Q2hvaWNlUmVxdWVzdChjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2V0U3RyYXRlZ2llc01pc3NpbmdTdHJhdGVneSkKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXROYW1lKCIvdGVzdCIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJzZXQiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBnZXRNYW5hZ2VyKCkub25WYWxpZGF0ZWRTdHJhdGVneUNob2ljZVJlcXVlc3QoY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisgIGZ3OjpTdHJhdGVneSYgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneUNob2ljZSgpLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgiL3Rlc3QiKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzdHJhdGVneS5nZXROYW1lKCksICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2V0VW5zdXBwb3J0ZWRTdHJhdGVneSkKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXROYW1lKCIvdGVzdCIpOworICBwYXJhbWV0ZXJzLnNldFN0cmF0ZWd5KCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS91bml0LXRlc3QtZG9lc25vdGV4aXN0Iik7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoInNldCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLCA1MDQsICJVbnN1cHBvcnRlZCBzdHJhdGVneSIpOworICB9OworCisgIGdldE1hbmFnZXIoKS5vblZhbGlkYXRlZFN0cmF0ZWd5Q2hvaWNlUmVxdWVzdChjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKyAgZnc6OlN0cmF0ZWd5JiBzdHJhdGVneSA9IGdldFN0cmF0ZWd5Q2hvaWNlKCkuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCIvdGVzdCIpOworICBCT09TVF9DSEVDS19FUVVBTChzdHJhdGVneS5nZXROYW1lKCksICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEiKTsKK30KKworY2xhc3MgRGVmYXVsdFN0cmF0ZWd5T25seUZpeHR1cmUgOiBwdWJsaWMgU3RyYXRlZ3lDaG9pY2VNYW5hZ2VyRml4dHVyZQoreworcHVibGljOgorICBEZWZhdWx0U3RyYXRlZ3lPbmx5Rml4dHVyZSgpCisgICAgOiBTdHJhdGVneUNob2ljZU1hbmFnZXJGaXh0dXJlKCkKKyAgeworCisgIH0KKworICB2aXJ0dWFsCisgIH5EZWZhdWx0U3RyYXRlZ3lPbmx5Rml4dHVyZSgpCisgIHsKKworICB9Cit9OworCisKKy8vLyBcdG9kbyBJJ20gbm90IHN1cmUgdGhpcyBjb2RlIGJyYW5jaCAoY29kZSA0MDUpIGNhbiBoYXBwZW4uIFRoZSBtYW5hZ2VyIHRlc3RzIGZvciB0aGUgc3RyYXRlZ3kgZmlyc3QgYW5kIHdpbGwgcmV0dXJuIDUwNC4KKy8vIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFNldE5vdEluc3RhbGxlZCwgRGVmYXVsdFN0cmF0ZWd5T25seUZpeHR1cmUpCisvLyB7CisvLyAgIEJPT1NUX1JFUVVJUkUoIWdldFN0cmF0ZWd5Q2hvaWNlKCkuaGFzU3RyYXRlZ3koIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYiIpKTsKKy8vICAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKy8vICAgcGFyYW1ldGVycy5zZXROYW1lKCIvdGVzdCIpOworLy8gICBwYXJhbWV0ZXJzLnNldFN0cmF0ZWd5KCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWIiKTsKKworLy8gICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKy8vICAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlIik7CisvLyAgIGNvbW1hbmROYW1lLmFwcGVuZCgic2V0Iik7CisvLyAgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKy8vICAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKy8vICAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworLy8gICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0KKy8vICAgICBiaW5kKCZTdHJhdGVneUNob2ljZU1hbmFnZXJGaXh0dXJlOjp2YWxpZGF0ZUNvbnRyb2xSZXNwb25zZSwgdGhpcywgXzEsCisvLyAgICAgICAgICBjb21tYW5kLT5nZXROYW1lKCksIDQwNSwgIlN0cmF0ZWd5IG5vdCBpbnN0YWxsZWQiKTsKKworLy8gICBnZXRNYW5hZ2VyKCkub25WYWxpZGF0ZWRTdHJhdGVneUNob2ljZVJlcXVlc3QoY29tbWFuZCk7CisKKy8vICAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisvLyAgIGZ3OjpTdHJhdGVneSYgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneUNob2ljZSgpLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgiL3Rlc3QiKTsKKy8vICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RyYXRlZ3kuZ2V0TmFtZSgpLCAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hIik7CisvLyB9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFVuc2V0KQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldE5hbWUoIi90ZXN0Iik7CisKKyAgQk9PU1RfUkVRVUlSRShtX3N0cmF0ZWd5Q2hvaWNlLmluc2VydCgiL3Rlc3QiLCAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iIikpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKG1fc3RyYXRlZ3lDaG9pY2UuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCIvdGVzdCIpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iIik7CisKKyAgQmxvY2sgZW5jb2RlZFBhcmFtZXRlcnMocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOworCisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZSIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoInVuc2V0Iik7CisgIGNvbW1hbmROYW1lLmFwcGVuZChlbmNvZGVkUGFyYW1ldGVycyk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gY29tbWFuZChtYWtlX3NoYXJlZDxJbnRlcmVzdD4oY29tbWFuZE5hbWUpKTsKKyAgZ2VuZXJhdGVDb21tYW5kKCpjb21tYW5kKTsKKworICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0gW3RoaXMsIGNvbW1hbmQsIGVuY29kZWRQYXJhbWV0ZXJzXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwgIlN1Y2Nlc3MiLCBlbmNvZGVkUGFyYW1ldGVycyk7CisgIH07CisKKyAgZ2V0TWFuYWdlcigpLm9uVmFsaWRhdGVkU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0KGNvbW1hbmQpOworCisgIEJPT1NUX1JFUVVJUkUoZGlkQ2FsbGJhY2tGaXJlKCkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG1fc3RyYXRlZ3lDaG9pY2UuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCIvdGVzdCIpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShVbnNldFJvb3QpCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZSgiLyIpOworCisgIEJsb2NrIGVuY29kZWRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKCJ1bnNldCIpOworICBjb21tYW5kTmFtZS5hcHBlbmQoZW5jb2RlZFBhcmFtZXRlcnMpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisgIGdlbmVyYXRlQ29tbWFuZCgqY29tbWFuZCk7CisKKyAgZ2V0RmFjZSgpLT5vblJlY2VpdmVEYXRhICs9IFt0aGlzLCBjb21tYW5kXSAoY29uc3QgRGF0YSYgcmVzcG9uc2UpIHsKKyAgICB0aGlzLT52YWxpZGF0ZUNvbnRyb2xSZXNwb25zZShyZXNwb25zZSwgY29tbWFuZC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMywgIkNhbm5vdCB1bnNldCByb290IHByZWZpeCBzdHJhdGVneSIpOworICB9OworCisgIGdldE1hbmFnZXIoKS5vblZhbGlkYXRlZFN0cmF0ZWd5Q2hvaWNlUmVxdWVzdChjb21tYW5kKTsKKworICBCT09TVF9SRVFVSVJFKGRpZENhbGxiYWNrRmlyZSgpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChtX3N0cmF0ZWd5Q2hvaWNlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgiL3Rlc3QiKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVW5zZXRNaXNzaW5nTmFtZSkKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKworICBCT09TVF9SRVFVSVJFKG1fc3RyYXRlZ3lDaG9pY2UuaW5zZXJ0KCIvdGVzdCIsICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWIiKSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwobV9zdHJhdGVneUNob2ljZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIi90ZXN0IikuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWIiKTsKKworICBCbG9jayBlbmNvZGVkUGFyYW1ldGVycyhwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlIik7CisgIGNvbW1hbmROYW1lLmFwcGVuZCgidW5zZXQiKTsKKyAgY29tbWFuZE5hbWUuYXBwZW5kKGVuY29kZWRQYXJhbWV0ZXJzKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBjb21tYW5kKG1ha2Vfc2hhcmVkPEludGVyZXN0Pihjb21tYW5kTmFtZSkpOworICBnZW5lcmF0ZUNvbW1hbmQoKmNvbW1hbmQpOworCisgIGdldEZhY2UoKS0+b25SZWNlaXZlRGF0YSArPSBbdGhpcywgY29tbWFuZF0gKGNvbnN0IERhdGEmIHJlc3BvbnNlKSB7CisgICAgdGhpcy0+dmFsaWRhdGVDb250cm9sUmVzcG9uc2UocmVzcG9uc2UsIGNvbW1hbmQtPmdldE5hbWUoKSwgNDAwLCAiTWFsZm9ybWVkIGNvbW1hbmQiKTsKKyAgfTsKKworICBnZXRNYW5hZ2VyKCkub25WYWxpZGF0ZWRTdHJhdGVneUNob2ljZVJlcXVlc3QoY29tbWFuZCk7CisKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobV9zdHJhdGVneUNob2ljZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIi90ZXN0IikuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFB1Ymxpc2gpCit7CisgIE5hbWUgY29tbWFuZE5hbWUoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZS9saXN0Iik7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGNvbW1hbmQobWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KGNvbW1hbmROYW1lKSk7CisKKyAgbmRuOjpuZmQ6OlN0cmF0ZWd5Q2hvaWNlIGV4cGVjdGVkQ2hvaWNlOworICBleHBlY3RlZENob2ljZS5zZXRTdHJhdGVneSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hIik7CisgIGV4cGVjdGVkQ2hvaWNlLnNldE5hbWUoIi8iKTsKKworICBnZXRGYWNlKCktPm9uUmVjZWl2ZURhdGEgKz0KKyAgICBiaW5kKCZTdHJhdGVneUNob2ljZU1hbmFnZXJGaXh0dXJlOjp2YWxpZGF0ZUxpc3QsIHRoaXMsIF8xLCBleHBlY3RlZENob2ljZSk7CisKKyAgbV9tYW5hZ2VyLm9uU3RyYXRlZ3lDaG9pY2VSZXF1ZXN0KCpjb21tYW5kKTsKKyAgQk9PU1RfUkVRVUlSRShkaWRDYWxsYmFja0ZpcmUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLXB1Ymxpc2hlci5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvc3RyYXRlZ3ktY2hvaWNlLXB1Ymxpc2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1YmM0YQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC9zdHJhdGVneS1jaG9pY2UtcHVibGlzaGVyLmNwcApAQCAtMCwwICsxLDE2OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfVEVTVFNfTkZEX01HTVRfU1RSQVRFR1lfQ0hPSUNFX1BVQkxJU0hFUl9IUFAKKyNkZWZpbmUgTkZEX1RFU1RTX05GRF9NR01UX1NUUkFURUdZX0NIT0lDRV9QVUJMSVNIRVJfSFBQCisKKyNpbmNsdWRlICJtZ210L3N0cmF0ZWd5LWNob2ljZS1wdWJsaXNoZXIuaHBwIgorI2luY2x1ZGUgIm1nbXQvYXBwLWZhY2UuaHBwIgorI2luY2x1ZGUgIm1nbXQvaW50ZXJuYWwtZmFjZS5ocHAiCisjaW5jbHVkZSAiZncvZm9yd2FyZGVyLmhwcCIKKyNpbmNsdWRlICIuLi9mdy9kdW1teS1zdHJhdGVneS5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLXN0cmF0ZWd5LWNob2ljZS5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworY2xhc3MgU3RyYXRlZ3lDaG9pY2VQdWJsaXNoZXJGaXh0dXJlIDogQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKworICBTdHJhdGVneUNob2ljZVB1Ymxpc2hlckZpeHR1cmUoKQorICAgIDogbV9zdHJhdGVneUNob2ljZShtX2ZvcndhcmRlci5nZXRTdHJhdGVneUNob2ljZSgpKQorICAgICwgbV9mYWNlKG1ha2Vfc2hhcmVkPEludGVybmFsRmFjZT4oKSkKKyAgICAsIG1fcHVibGlzaGVyKG1fc3RyYXRlZ3lDaG9pY2UsICptX2ZhY2UsICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS1jaG9pY2UvbGlzdCIsIG1fa2V5Q2hhaW4pCisgICAgLCBTVFJBVEVHWV9BKG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KGJvb3N0OjpyZWYobV9mb3J3YXJkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvZHVtbXktc3RyYXRlZ3ktYSIpKQorICAgICwgU1RSQVRFR1lfQihtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5Pihib29zdDo6cmVmKG1fZm9yd2FyZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2R1bW15LXN0cmF0ZWd5LWIiKSkKKyAgICAsIG1fZmluaXNoZWQoZmFsc2UpCisgIHsKKyAgICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwoU1RSQVRFR1lfQSk7CisgICAgbV9zdHJhdGVneUNob2ljZS5pbnN0YWxsKFNUUkFURUdZX0IpOworCisgICAgbmRuOjpuZmQ6OlN0cmF0ZWd5Q2hvaWNlIGV4cGVjdGVkUm9vdEVudHJ5OworICAgIGV4cGVjdGVkUm9vdEVudHJ5LnNldFN0cmF0ZWd5KFNUUkFURUdZX0EtPmdldE5hbWUoKSk7CisgICAgZXhwZWN0ZWRSb290RW50cnkuc2V0TmFtZSgiLyIpOworCisgICAgbV9zdHJhdGVneUNob2ljZS5pbnNlcnQoIi8iLCBTVFJBVEVHWV9BLT5nZXROYW1lKCkpOworICAgIG1fZXhwZWN0ZWRFbnRyaWVzWyIvIl0gPSBleHBlY3RlZFJvb3RFbnRyeTsKKyAgfQorCisgIHZvaWQKKyAgdmFsaWRhdGVQdWJsaXNoKGNvbnN0IERhdGEmIGRhdGEpCisgIHsKKyAgICBCbG9jayBwYXlsb2FkID0gZGF0YS5nZXRDb250ZW50KCk7CisKKyAgICBtX2J1ZmZlci5hcHBlbmRCeXRlQXJyYXkocGF5bG9hZC52YWx1ZSgpLCBwYXlsb2FkLnZhbHVlX3NpemUoKSk7CisKKyAgICBCT09TVF9DSEVDS19OT19USFJPVyhkYXRhLmdldE5hbWUoKVstMV0udG9TZWdtZW50KCkpOworICAgIGlmIChkYXRhLmdldEZpbmFsQmxvY2tJZCgpICE9IGRhdGEuZ2V0TmFtZSgpWy0xXSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgLy8gd3JhcCB0aGUgU3RyYXRlZ3kgQ2hvaWNlIGVudHJpZXMgaW4gYSBzaW5nbGUgQ29udGVudCBUTFYgZm9yIGVhc3kgcGFyc2luZworICAgIG1fYnVmZmVyLnByZXBlbmRWYXJOdW1iZXIobV9idWZmZXIuc2l6ZSgpKTsKKyAgICBtX2J1ZmZlci5wcmVwZW5kVmFyTnVtYmVyKHRsdjo6Q29udGVudCk7CisKKyAgICBuZG46OkJsb2NrIHBhcnNlcihtX2J1ZmZlci5idWYoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICBwYXJzZXIucGFyc2UoKTsKKworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwocGFyc2VyLmVsZW1lbnRzX3NpemUoKSwgbV9leHBlY3RlZEVudHJpZXMuc2l6ZSgpKTsKKworICAgIGZvciAoQmxvY2s6OmVsZW1lbnRfY29uc3RfaXRlcmF0b3IgaSA9IHBhcnNlci5lbGVtZW50c19iZWdpbigpOworICAgICAgICAgaSAhPSBwYXJzZXIuZWxlbWVudHNfZW5kKCk7CisgICAgICAgICArK2kpCisgICAgICB7CisgICAgICAgIGlmIChpLT50eXBlKCkgIT0gbmRuOjp0bHY6Om5mZDo6U3RyYXRlZ3lDaG9pY2UpCisgICAgICAgICAgeworICAgICAgICAgICAgQk9PU1RfRkFJTCgiZXhwZWN0ZWQgU3RyYXRlZ3lDaG9pY2UsIGdvdCB0eXBlICMiIDw8IGktPnR5cGUoKSk7CisgICAgICAgICAgfQorCisgICAgICAgIG5kbjo6bmZkOjpTdHJhdGVneUNob2ljZSBlbnRyeSgqaSk7CisKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIG5kbjo6bmZkOjpTdHJhdGVneUNob2ljZT46OmNvbnN0X2l0ZXJhdG9yIGV4cGVjdGVkRW50cnlQb3MgPQorICAgICAgICAgIG1fZXhwZWN0ZWRFbnRyaWVzLmZpbmQoZW50cnkuZ2V0TmFtZSgpLnRvVXJpKCkpOworCisgICAgICAgIEJPT1NUX1JFUVVJUkUoZXhwZWN0ZWRFbnRyeVBvcyAhPSBtX2V4cGVjdGVkRW50cmllcy5lbmQoKSk7CisgICAgICAgIGNvbnN0IG5kbjo6bmZkOjpTdHJhdGVneUNob2ljZSYgZXhwZWN0ZWRFbnRyeSA9IGV4cGVjdGVkRW50cnlQb3MtPnNlY29uZDsKKworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS5nZXRTdHJhdGVneSgpLCBleHBlY3RlZEVudHJ5LmdldFN0cmF0ZWd5KCkpOworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS5nZXROYW1lKCksIGV4cGVjdGVkRW50cnkuZ2V0TmFtZSgpKTsKKworICAgICAgICBtX21hdGNoZWRFbnRyaWVzLmluc2VydChlbnRyeS5nZXROYW1lKCkudG9VcmkoKSk7CisgICAgICB9CisKKyAgICBCT09TVF9DSEVDS19FUVVBTChtX21hdGNoZWRFbnRyaWVzLnNpemUoKSwgbV9leHBlY3RlZEVudHJpZXMuc2l6ZSgpKTsKKworICAgIG1fZmluaXNoZWQgPSB0cnVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgRm9yd2FyZGVyIG1fZm9yd2FyZGVyOworICBTdHJhdGVneUNob2ljZSYgbV9zdHJhdGVneUNob2ljZTsKKyAgc2hhcmVkX3B0cjxJbnRlcm5hbEZhY2U+IG1fZmFjZTsKKyAgU3RyYXRlZ3lDaG9pY2VQdWJsaXNoZXIgbV9wdWJsaXNoZXI7CisKKyAgc2hhcmVkX3B0cjxEdW1teVN0cmF0ZWd5PiBTVFJBVEVHWV9BOworICBzaGFyZWRfcHRyPER1bW15U3RyYXRlZ3k+IFNUUkFURUdZX0I7CisKKyAgbmRuOjpFbmNvZGluZ0J1ZmZlciBtX2J1ZmZlcjsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgbmRuOjpuZmQ6OlN0cmF0ZWd5Q2hvaWNlPiBtX2V4cGVjdGVkRW50cmllczsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG1fbWF0Y2hlZEVudHJpZXM7CisKKyAgYm9vbCBtX2ZpbmlzaGVkOworCisgIG5kbjo6S2V5Q2hhaW4gbV9rZXlDaGFpbjsKK307CisKKworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoTWdtdFN0cmF0ZWd5Q2hvaWNlUHVibGlzaGVyLCBTdHJhdGVneUNob2ljZVB1Ymxpc2hlckZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFB1Ymxpc2gpCit7CisgIG1fc3RyYXRlZ3lDaG9pY2UuaW5zZXJ0KCIvdGVzdC9hIiwgU1RSQVRFR1lfQS0+Z2V0TmFtZSgpKTsKKyAgbV9zdHJhdGVneUNob2ljZS5pbnNlcnQoIi90ZXN0L2IiLCBTVFJBVEVHWV9CLT5nZXROYW1lKCkpOworCisgIG5kbjo6bmZkOjpTdHJhdGVneUNob2ljZSBleHBlY3RlZEVudHJ5QTsKKyAgZXhwZWN0ZWRFbnRyeUEuc2V0U3RyYXRlZ3koU1RSQVRFR1lfQS0+Z2V0TmFtZSgpKTsKKyAgZXhwZWN0ZWRFbnRyeUEuc2V0TmFtZSgiL3Rlc3QvYSIpOworCisgIG5kbjo6bmZkOjpTdHJhdGVneUNob2ljZSBleHBlY3RlZEVudHJ5QjsKKyAgZXhwZWN0ZWRFbnRyeUIuc2V0U3RyYXRlZ3koU1RSQVRFR1lfQi0+Z2V0TmFtZSgpKTsKKyAgZXhwZWN0ZWRFbnRyeUIuc2V0TmFtZSgiL3Rlc3QvYiIpOworCisgIG1fZXhwZWN0ZWRFbnRyaWVzWyIvdGVzdC9hIl0gPSBleHBlY3RlZEVudHJ5QTsKKyAgbV9leHBlY3RlZEVudHJpZXNbIi90ZXN0L2IiXSA9IGV4cGVjdGVkRW50cnlCOworCisgIG1fZmFjZS0+b25SZWNlaXZlRGF0YSArPQorICAgIGJpbmQoJlN0cmF0ZWd5Q2hvaWNlUHVibGlzaGVyRml4dHVyZTo6dmFsaWRhdGVQdWJsaXNoLCB0aGlzLCBfMSk7CisKKyAgbV9wdWJsaXNoZXIucHVibGlzaCgpOworICBCT09TVF9SRVFVSVJFKG1fZmluaXNoZWQpOworfQorCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfVEVTVFNfTkZEX01HTVRfU1RSQVRFR1lfQ0hPSUNFX1BVQkxJU0hFUl9IUFAKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vbWdtdC90YWJsZXMtY29uZmlnLXNlY3Rpb24uY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi9tZ210L3RhYmxlcy1jb25maWctc2VjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyOTI4NwotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9kYWVtb24vbWdtdC90YWJsZXMtY29uZmlnLXNlY3Rpb24uY3BwCkBAIC0wLDAgKzEsMzk5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAibWdtdC90YWJsZXMtY29uZmlnLXNlY3Rpb24uaHBwIgorI2luY2x1ZGUgImZ3L2ZvcndhcmRlci5ocHAiCisKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9kYWVtb24vZncvZHVtbXktc3RyYXRlZ3kuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK05GRF9MT0dfSU5JVCgiTWdtdFRhYmxlc0NvbmZpZ1NlY3Rpb24iKTsKKworY2xhc3MgVGFibGVzQ29uZmlnU2VjdGlvbkZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKworICBUYWJsZXNDb25maWdTZWN0aW9uRml4dHVyZSgpCisgICAgOiBtX2NzKG1fZm9yd2FyZGVyLmdldENzKCkpCisgICAgLCBtX3BpdChtX2ZvcndhcmRlci5nZXRQaXQoKSkKKyAgICAsIG1fZmliKG1fZm9yd2FyZGVyLmdldEZpYigpKQorICAgICwgbV9zdHJhdGVneUNob2ljZShtX2ZvcndhcmRlci5nZXRTdHJhdGVneUNob2ljZSgpKQorICAgICwgbV9tZWFzdXJlbWVudHMobV9mb3J3YXJkZXIuZ2V0TWVhc3VyZW1lbnRzKCkpCisgICAgLCBtX3RhYmxlc0NvbmZpZyhtX2NzLCBtX3BpdCwgbV9maWIsIG1fc3RyYXRlZ3lDaG9pY2UsIG1fbWVhc3VyZW1lbnRzKQorICB7CisgICAgbV90YWJsZXNDb25maWcuc2V0Q29uZmlnRmlsZShtX2NvbmZpZyk7CisgIH0KKworICB2b2lkCisgIHJ1bkNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgQ09ORklHLCBib29sIGlzRHJ5UnVuKQorICB7CisgICAgbV9jb25maWcucGFyc2UoQ09ORklHLCBpc0RyeVJ1biwgImR1bW15LWNvbmZpZyIpOworICB9CisKKyAgYm9vbAorICB2YWxpZGF0ZUV4Y2VwdGlvbihjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGV4Y2VwdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkTXNnKQorICB7CisgICAgaWYgKGV4Y2VwdGlvbi53aGF0KCkgIT0gZXhwZWN0ZWRNc2cpCisgICAgICB7CisgICAgICAgIE5GRF9MT0dfREVCVUcoImV4Y2VwdGlvbi53aGF0KCk6ICIgPDwgZXhjZXB0aW9uLndoYXQoKSk7CisgICAgICAgIE5GRF9MT0dfREVCVUcoIm1zZzogICAgICAgICAgICA6ICIgPDwgZXhwZWN0ZWRNc2cpOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIEZvcndhcmRlciBtX2ZvcndhcmRlcjsKKworICBDcyYgbV9jczsKKyAgUGl0JiBtX3BpdDsKKyAgRmliJiBtX2ZpYjsKKyAgU3RyYXRlZ3lDaG9pY2UmIG1fc3RyYXRlZ3lDaG9pY2U7CisgIE1lYXN1cmVtZW50cyYgbV9tZWFzdXJlbWVudHM7CisKKyAgVGFibGVzQ29uZmlnU2VjdGlvbiBtX3RhYmxlc0NvbmZpZzsKKyAgQ29uZmlnRmlsZSBtX2NvbmZpZzsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUZXN0VGFibGVDb25maWdTZWN0aW9uLCBUYWJsZXNDb25maWdTZWN0aW9uRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ29uZmlndXJlVGFibGVzV2l0aERlZmF1bHRzKQoreworICBjb25zdCBzaXplX3QgaW5pdGlhbExpbWl0ID0gbV9jcy5nZXRMaW1pdCgpOworCisgIG1fdGFibGVzQ29uZmlnLmVuc3VyZVRhYmxlc0FyZUNvbmZpZ3VyZWQoKTsKKyAgQk9PU1RfQ0hFQ0tfTkUoaW5pdGlhbExpbWl0LCBtX2NzLmdldExpbWl0KCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbXB0eVRhYmxlc1NlY3Rpb24pCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJRyA9CisgICAgInRhYmxlc1xuIgorICAgICJ7XG4iCisgICAgIn1cbiI7CisKKyAgY29uc3Qgc2l6ZV90IG5Dc01heFBhY2tldHMgPSBtX2NzLmdldExpbWl0KCk7CisKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhydW5Db25maWcoQ09ORklHLCB0cnVlKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1fY3MuZ2V0TGltaXQoKSwgbkNzTWF4UGFja2V0cyk7CisKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhydW5Db25maWcoQ09ORklHLCBmYWxzZSkpOworICBCT09TVF9DSEVDS19ORShtX2NzLmdldExpbWl0KCksIG5Dc01heFBhY2tldHMpOworCisgIGNvbnN0IHNpemVfdCBkZWZhdWx0TGltaXQgPSBtX2NzLmdldExpbWl0KCk7CisKKyAgbV90YWJsZXNDb25maWcuZW5zdXJlVGFibGVzQXJlQ29uZmlndXJlZCgpOworICBCT09TVF9DSEVDS19FUVVBTChkZWZhdWx0TGltaXQsIG1fY3MuZ2V0TGltaXQoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFZhbGlkQ3NNYXhQYWNrZXRzKQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJ0YWJsZXNcbiIKKyAgICAie1xuIgorICAgICIgIGNzX21heF9wYWNrZXRzIDEwMVxuIgorICAgICJ9XG4iOworCisgIEJPT1NUX1JFUVVJUkVfTkUobV9jcy5nZXRMaW1pdCgpLCAxMDEpOworCisgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1cocnVuQ29uZmlnKENPTkZJRywgdHJ1ZSkpOworICBCT09TVF9DSEVDS19ORShtX2NzLmdldExpbWl0KCksIDEwMSk7CisKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhydW5Db25maWcoQ09ORklHLCBmYWxzZSkpOworICBCT09TVF9DSEVDS19FUVVBTChtX2NzLmdldExpbWl0KCksIDEwMSk7CisKKyAgbV90YWJsZXNDb25maWcuZW5zdXJlVGFibGVzQXJlQ29uZmlndXJlZCgpOworICBCT09TVF9DSEVDS19FUVVBTChtX2NzLmdldExpbWl0KCksIDEwMSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1pc3NpbmdWYWx1ZUNzTWF4UGFja2V0cykKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAidGFibGVzXG4iCisgICAgIntcbiIKKyAgICAiICBjc19tYXhfcGFja2V0c1xuIgorICAgICJ9XG4iOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkTXNnID0KKyAgICAiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFwiY3NfbWF4X3BhY2tldHNcIiBpbiBcInRhYmxlc1wiIHNlY3Rpb24iOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihydW5Db25maWcoQ09ORklHLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVGFibGVzQ29uZmlnU2VjdGlvbkZpeHR1cmU6OnZhbGlkYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfMSwgZXhwZWN0ZWRNc2cpKTsKKworICBCT09TVF9DSEVDS19FWENFUFRJT04ocnVuQ29uZmlnKENPTkZJRywgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZUYWJsZXNDb25maWdTZWN0aW9uRml4dHVyZTo6dmFsaWRhdGVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBleHBlY3RlZE1zZykpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJbnZhbGlkVmFsdWVDc01heFBhY2tldHMpCit7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJRyA9CisgICAgInRhYmxlc1xuIgorICAgICJ7XG4iCisgICAgIiAgY3NfbWF4X3BhY2tldHMgaW52YWxpZFxuIgorICAgICJ9XG4iOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkTXNnID0KKyAgICAiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFwiY3NfbWF4X3BhY2tldHNcIiBpbiBcInRhYmxlc1wiIHNlY3Rpb24iOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihydW5Db25maWcoQ09ORklHLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVGFibGVzQ29uZmlnU2VjdGlvbkZpeHR1cmU6OnZhbGlkYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfMSwgZXhwZWN0ZWRNc2cpKTsKKworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihydW5Db25maWcoQ09ORklHLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlRhYmxlc0NvbmZpZ1NlY3Rpb25GaXh0dXJlOjp2YWxpZGF0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgXzEsIGV4cGVjdGVkTXNnKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENvbmZpZ1N0cmF0ZWd5KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJ0YWJsZXNcbiIKKyAgICAie1xuIgorICAgICJzdHJhdGVneV9jaG9pY2VcbiIKKyAgICAie1xuIgorICAgICIgIC8gL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hXG4iCisgICAgIiAgL2EgL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iXG4iCisgICAgIn1cbiIKKyAgICAifVxuIjsKKworICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwobWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKG1fZm9yd2FyZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEiKSk7CisgIG1fc3RyYXRlZ3lDaG9pY2UuaW5zdGFsbChtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PihyZWYobV9mb3J3YXJkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYiIpKTsKKworICBydW5Db25maWcoQ09ORklHLCB0cnVlKTsKKyAgeworICAgIGZ3OjpTdHJhdGVneSYgcm9vdFN0cmF0ZWd5ID0gbV9zdHJhdGVneUNob2ljZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIi8iKTsKKyAgICBCT09TVF9SRVFVSVJFX05FKHJvb3RTdHJhdGVneS5nZXROYW1lKCksICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEiKTsKKyAgICBCT09TVF9SRVFVSVJFX05FKHJvb3RTdHJhdGVneS5nZXROYW1lKCksICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWIiKTsKKworICAgIGZ3OjpTdHJhdGVneSYgYVN0cmF0ZWd5ID0gbV9zdHJhdGVneUNob2ljZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIi9hIik7CisgICAgQk9PU1RfUkVRVUlSRV9ORShhU3RyYXRlZ3kuZ2V0TmFtZSgpLCAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iIik7CisgICAgQk9PU1RfUkVRVUlSRV9ORShhU3RyYXRlZ3kuZ2V0TmFtZSgpLCAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hIik7CisgIH0KKworICBydW5Db25maWcoQ09ORklHLCBmYWxzZSk7CisgIHsKKyAgICBmdzo6U3RyYXRlZ3kmIHJvb3RTdHJhdGVneSA9IG1fc3RyYXRlZ3lDaG9pY2UuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCIvIik7CisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChyb290U3RyYXRlZ3kuZ2V0TmFtZSgpLCAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hIik7CisKKyAgICBmdzo6U3RyYXRlZ3kmIGFTdHJhdGVneSA9IG1fc3RyYXRlZ3lDaG9pY2UuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCIvYSIpOworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoYVN0cmF0ZWd5LmdldE5hbWUoKSwgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYiIpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENvbmZpZ1ZlcnNpb25lZFN0cmF0ZWd5KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJ0YWJsZXNcbiIKKyAgICAie1xuIgorICAgICJzdHJhdGVneV9jaG9pY2VcbiIKKyAgICAie1xuIgorICAgICIgIC90ZXN0L2xhdGVzdCAvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWFcbiIKKyAgICAiICAvdGVzdC9vbGQgL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hLyVGRCUwMVxuIgorICAgICJ9XG4iCisgICAgIn1cbiI7CisKKworICBhdXRvIHZlcnNpb24xID0gbWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKG1fZm9yd2FyZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEvJUZEJTAxIik7CisKKyAgYXV0byB2ZXJzaW9uMiA9IG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihtX2ZvcndhcmRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hLyVGRCUwMiIpOworICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwodmVyc2lvbjEpOworICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwodmVyc2lvbjIpOworCisgIHJ1bkNvbmZpZyhDT05GSUcsIHRydWUpOworICB7CisgICAgZnc6OlN0cmF0ZWd5JiB0ZXN0TGF0ZXN0U3RyYXRlZ3kgPSBtX3N0cmF0ZWd5Q2hvaWNlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgiL3Rlc3QvbGF0ZXN0Iik7CisgICAgQk9PU1RfUkVRVUlSRV9ORSh0ZXN0TGF0ZXN0U3RyYXRlZ3kuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYS8lRkQlMDEiKTsKKyAgICBCT09TVF9SRVFVSVJFX05FKHRlc3RMYXRlc3RTdHJhdGVneS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hLyVGRCUwMiIpOworCisgICAgZnc6OlN0cmF0ZWd5JiB0ZXN0T2xkU3RyYXRlZ3kgPSBtX3N0cmF0ZWd5Q2hvaWNlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgiL3Rlc3Qvb2xkIik7CisgICAgQk9PU1RfUkVRVUlSRV9ORSh0ZXN0T2xkU3RyYXRlZ3kuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYS8lRkQlMDEiKTsKKyAgICBCT09TVF9SRVFVSVJFX05FKHRlc3RPbGRTdHJhdGVneS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hLyVGRCUwMiIpOworICB9CisKKyAgcnVuQ29uZmlnKENPTkZJRywgZmFsc2UpOworICB7CisgICAgZnc6OlN0cmF0ZWd5JiB0ZXN0TGF0ZXN0U3RyYXRlZ3kgPSBtX3N0cmF0ZWd5Q2hvaWNlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgiL3Rlc3QvbGF0ZXN0Iik7CisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTCh0ZXN0TGF0ZXN0U3RyYXRlZ3kuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYS8lRkQlMDIiKTsKKworICAgIGZ3OjpTdHJhdGVneSYgdGVzdE9sZFN0cmF0ZWd5ID0gbV9zdHJhdGVneUNob2ljZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIi90ZXN0L29sZCIpOworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwodGVzdE9sZFN0cmF0ZWd5LmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEvJUZEJTAxIik7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSW52YWxpZFN0cmF0ZWd5KQoreworICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUcgPQorICAgICJ0YWJsZXNcbiIKKyAgICAie1xuIgorICAgICJzdHJhdGVneV9jaG9pY2VcbiIKKyAgICAie1xuIgorICAgICIgIC8gL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1kb2Vzbm90ZXhpc3RcbiIKKyAgICAifVxuIgorICAgICJ9XG4iOworCisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRNc2cgPQorICAgICJJbnZhbGlkIHN0cmF0ZWd5IGNob2ljZSBcIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3QtZG9lc25vdGV4aXN0XCIgIgorICAgICJmb3IgcHJlZml4IFwiL1wiIGluIFwic3RyYXRlZ3lfY2hvaWNlXCIgc2VjdGlvbiI7CisKKyAgQk9PU1RfQ0hFQ0tfRVhDRVBUSU9OKHJ1bkNvbmZpZyhDT05GSUcsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZUYWJsZXNDb25maWdTZWN0aW9uRml4dHVyZTo6dmFsaWRhdGVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBleHBlY3RlZE1zZykpOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihydW5Db25maWcoQ09ORklHLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBDb25maWdGaWxlOjpFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJlRhYmxlc0NvbmZpZ1NlY3Rpb25GaXh0dXJlOjp2YWxpZGF0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgXzEsIGV4cGVjdGVkTXNnKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1pc3NpbmdTdHJhdGVneVByZWZpeCkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAidGFibGVzXG4iCisgICAgIntcbiIKKyAgICAic3RyYXRlZ3lfY2hvaWNlXG4iCisgICAgIntcbiIKKyAgICAiICAvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWFcbiIKKyAgICAifVxuIgorICAgICJ9XG4iOworCisKKyAgbV9zdHJhdGVneUNob2ljZS5pbnN0YWxsKG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihtX2ZvcndhcmRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1hIikpOworCisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRNc2cgPSAiSW52YWxpZCBzdHJhdGVneSBjaG9pY2UgXCJcIiBmb3IgcHJlZml4ICIKKyAgICAiXCIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWFcIiBpbiBcInN0cmF0ZWd5X2Nob2ljZVwiIHNlY3Rpb24iOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihydW5Db25maWcoQ09ORklHLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVGFibGVzQ29uZmlnU2VjdGlvbkZpeHR1cmU6OnZhbGlkYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfMSwgZXhwZWN0ZWRNc2cpKTsKKworICBCT09TVF9DSEVDS19FWENFUFRJT04ocnVuQ29uZmlnKENPTkZJRywgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZUYWJsZXNDb25maWdTZWN0aW9uRml4dHVyZTo6dmFsaWRhdGVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBleHBlY3RlZE1zZykpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShEdXBsaWNhdGVTdHJhdGVneSkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAidGFibGVzXG4iCisgICAgIntcbiIKKyAgICAic3RyYXRlZ3lfY2hvaWNlXG4iCisgICAgIntcbiIKKyAgICAiICAvIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYVxuIgorICAgICIgIC9hIC9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYlxuIgorICAgICIgIC8gL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3kvdGVzdC1zdHJhdGVneS1iXG4iCisgICAgIn1cbiIKKyAgICAifVxuIjsKKworICBtX3N0cmF0ZWd5Q2hvaWNlLmluc3RhbGwobWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKG1fZm9yd2FyZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9jYWxob3N0L25mZC9zdHJhdGVneS90ZXN0LXN0cmF0ZWd5LWEiKSk7CisgIG1fc3RyYXRlZ3lDaG9pY2UuaW5zdGFsbChtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PihyZWYobV9mb3J3YXJkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L3Rlc3Qtc3RyYXRlZ3ktYiIpKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZE1zZyA9CisgICAgIkR1cGxpY2F0ZSBzdHJhdGVneSBjaG9pY2UgZm9yIHByZWZpeCBcIi9cIiBpbiBcInN0cmF0ZWd5X2Nob2ljZVwiIHNlY3Rpb24iOworCisgIEJPT1NUX0NIRUNLX0VYQ0VQVElPTihydW5Db25maWcoQ09ORklHLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGU6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmVGFibGVzQ29uZmlnU2VjdGlvbkZpeHR1cmU6OnZhbGlkYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfMSwgZXhwZWN0ZWRNc2cpKTsKKworICBCT09TVF9DSEVDS19FWENFUFRJT04ocnVuQ29uZmlnKENPTkZJRywgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnRmlsZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZUYWJsZXNDb25maWdTZWN0aW9uRml4dHVyZTo6dmFsaWRhdGVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBleHBlY3RlZE1zZykpOworfQorCitjbGFzcyBJZ25vcmVOb3RUYWJsZXNTZWN0aW9uCit7CitwdWJsaWM6CisgIHZvaWQKKyAgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25OYW1lLAorICAgICAgICAgICAgIGNvbnN0IENvbmZpZ1NlY3Rpb24mIHNlY3Rpb24sCisgICAgICAgICAgICAgYm9vbCBpc0RyeVJ1bikKKworICB7CisgICAgLy8gSWdub3JlICJub3RfdGFibGVzIiBzZWN0aW9uCisgICAgaWYgKHNlY3Rpb25OYW1lID09ICJub3RfdGFibGVzIikKKyAgICAgIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgfQorICB9Cit9OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNaXNzaW5nVGFibGVzU2VjdGlvbikKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHID0KKyAgICAibm90X3RhYmxlc1xuIgorICAgICJ7XG4iCisgICAgIiAgc29tZV9vdGhlcl9maWVsZCAwXG4iCisgICAgIn1cbiI7CisKKyAgQ29uZmlnRmlsZSBwYXNzaXZlQ29uZmlnKChJZ25vcmVOb3RUYWJsZXNTZWN0aW9uKCkpKTsKKworICBjb25zdCBzaXplX3QgaW5pdGlhbExpbWl0ID0gbV9jcy5nZXRMaW1pdCgpOworCisgIHBhc3NpdmVDb25maWcucGFyc2UoQ09ORklHLCB0cnVlLCAiZHVtbXktY29uZmlnIik7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoaW5pdGlhbExpbWl0LCBtX2NzLmdldExpbWl0KCkpOworCisgIHBhc3NpdmVDb25maWcucGFyc2UoQ09ORklHLCBmYWxzZSwgImR1bW15LWNvbmZpZyIpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGluaXRpYWxMaW1pdCwgbV9jcy5nZXRMaW1pdCgpKTsKKworICBtX3RhYmxlc0NvbmZpZy5lbnN1cmVUYWJsZXNBcmVDb25maWd1cmVkKCk7CisgIEJPT1NUX0NIRUNLX05FKGluaXRpYWxMaW1pdCwgbV9jcy5nZXRMaW1pdCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vbWdtdC92YWxpZGF0aW9uLWNvbW1vbi5jcHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvdmFsaWRhdGlvbi1jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjVjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvdmFsaWRhdGlvbi1jb21tb24uY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJ2YWxpZGF0aW9uLWNvbW1vbi5ocHAiCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworY29uc3QgTmFtZSBDb21tYW5kSWRlbnRpdHlHbG9iYWxGaXh0dXJlOjpzX2lkZW50aXR5TmFtZSgiL3VuaXQtdGVzdC9Db21tYW5kRml4dHVyZS9pZCIpOworc2hhcmVkX3B0cjxuZG46OklkZW50aXR5Q2VydGlmaWNhdGU+IENvbW1hbmRJZGVudGl0eUdsb2JhbEZpeHR1cmU6OnNfY2VydGlmaWNhdGU7CisKK0NvbW1hbmRJZGVudGl0eUdsb2JhbEZpeHR1cmU6OkNvbW1hbmRJZGVudGl0eUdsb2JhbEZpeHR1cmUoKQoreworICBCT09TVF9BU1NFUlQoIXN0YXRpY19jYXN0PGJvb2w+KHNfY2VydGlmaWNhdGUpKTsKKyAgc19jZXJ0aWZpY2F0ZSA9IG1fa2V5cy5nZXRDZXJ0aWZpY2F0ZShtX2tleXMuY3JlYXRlSWRlbnRpdHkoc19pZGVudGl0eU5hbWUpKTsKK30KKworQ29tbWFuZElkZW50aXR5R2xvYmFsRml4dHVyZTo6fkNvbW1hbmRJZGVudGl0eUdsb2JhbEZpeHR1cmUoKQoreworICBzX2NlcnRpZmljYXRlLnJlc2V0KCk7CisgIG1fa2V5cy5kZWxldGVJZGVudGl0eShzX2lkZW50aXR5TmFtZSk7Cit9CisKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKENvbW1hbmRJZGVudGl0eUdsb2JhbEZpeHR1cmUpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vbWdtdC92YWxpZGF0aW9uLWNvbW1vbi5ocHAgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvdmFsaWRhdGlvbi1jb21tb24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjEzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL21nbXQvdmFsaWRhdGlvbi1jb21tb24uaHBwCkBAIC0wLDAgKzEsMTI1IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIE5GRF9URVNUU19ORkRfTUdNVF9WQUxJREFUSU9OX0NPTU1PTl9IUFAKKyNkZWZpbmUgTkZEX1RFU1RTX05GRF9NR01UX1ZBTElEQVRJT05fQ09NTU9OX0hQUAorCisjaW5jbHVkZSAiY29tbW9uLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvY29tbWFuZC1pbnRlcmVzdC1nZW5lcmF0b3IuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKKy8vIGNsYXNzIFZhbGlkYXRlZE1hbmFnZW1lbnRGaXh0dXJlCisvLyB7CisvLyBwdWJsaWM6CisvLyAgIFZhbGlkYXRlZE1hbmFnZW1lbnRGaXh0dXJlKCkKKy8vICAgICA6IG1fdmFsaWRhdG9yKG1ha2Vfc2hhcmVkPG5kbjo6Q29tbWFuZEludGVyZXN0VmFsaWRhdG9yPigpKQorLy8gICB7CisvLyAgIH0KKworLy8gICB2aXJ0dWFsCisvLyAgIH5WYWxpZGF0ZWRNYW5hZ2VtZW50Rml4dHVyZSgpCisvLyAgIHsKKy8vICAgfQorCisvLyBwcm90ZWN0ZWQ6CisvLyAgIHNoYXJlZF9wdHI8bmRuOjpDb21tYW5kSW50ZXJlc3RWYWxpZGF0b3I+IG1fdmFsaWRhdG9yOworLy8gfTsKKworLy8vIGEgZ2xvYmFsIGZpeHR1cmUgdGhhdCBob2xkcyB0aGUgaWRlbnRpdHkgZm9yIENvbW1hbmRGaXh0dXJlCitjbGFzcyBDb21tYW5kSWRlbnRpdHlHbG9iYWxGaXh0dXJlCit7CitwdWJsaWM6CisgIENvbW1hbmRJZGVudGl0eUdsb2JhbEZpeHR1cmUoKTsKKworICB+Q29tbWFuZElkZW50aXR5R2xvYmFsRml4dHVyZSgpOworCisgIHN0YXRpYyBjb25zdCBOYW1lJiBnZXRJZGVudGl0eU5hbWUoKQorICB7CisgICAgcmV0dXJuIHNfaWRlbnRpdHlOYW1lOworICB9CisKKyAgc3RhdGljIHNoYXJlZF9wdHI8bmRuOjpJZGVudGl0eUNlcnRpZmljYXRlPiBnZXRDZXJ0aWZpY2F0ZSgpCisgIHsKKyAgICBCT09TVF9BU1NFUlQoc3RhdGljX2Nhc3Q8Ym9vbD4oc19jZXJ0aWZpY2F0ZSkpOworICAgIHJldHVybiBzX2NlcnRpZmljYXRlOworICB9CisKK3ByaXZhdGU6CisgIG5kbjo6S2V5Q2hhaW4gbV9rZXlzOworICBzdGF0aWMgY29uc3QgTmFtZSBzX2lkZW50aXR5TmFtZTsKKyAgc3RhdGljIHNoYXJlZF9wdHI8bmRuOjpJZGVudGl0eUNlcnRpZmljYXRlPiBzX2NlcnRpZmljYXRlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENvbW1hbmRGaXh0dXJlIDogcHVibGljIFQKK3sKK3B1YmxpYzoKKyAgdmlydHVhbAorICB+Q29tbWFuZEZpeHR1cmUoKQorICB7CisgIH0KKworICB2b2lkCisgIGdlbmVyYXRlQ29tbWFuZChJbnRlcmVzdCYgaW50ZXJlc3QpCisgIHsKKyAgICBtX2dlbmVyYXRvci5nZW5lcmF0ZVdpdGhJZGVudGl0eShpbnRlcmVzdCwgZ2V0SWRlbnRpdHlOYW1lKCkpOworICB9CisKKyAgY29uc3QgTmFtZSYKKyAgZ2V0SWRlbnRpdHlOYW1lKCkgY29uc3QKKyAgeworICAgIHJldHVybiBDb21tYW5kSWRlbnRpdHlHbG9iYWxGaXh0dXJlOjpnZXRJZGVudGl0eU5hbWUoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIENvbW1hbmRGaXh0dXJlKCkKKyAgICA6IG1fY2VydGlmaWNhdGUoQ29tbWFuZElkZW50aXR5R2xvYmFsRml4dHVyZTo6Z2V0Q2VydGlmaWNhdGUoKSkKKyAgeworICB9CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxuZG46OklkZW50aXR5Q2VydGlmaWNhdGU+IG1fY2VydGlmaWNhdGU7CisgIG5kbjo6Q29tbWFuZEludGVyZXN0R2VuZXJhdG9yIG1fZ2VuZXJhdG9yOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbmF1dGhvcml6ZWRDb21tYW5kRml4dHVyZSA6IHB1YmxpYyBDb21tYW5kRml4dHVyZTxUPgoreworcHVibGljOgorICBVbmF1dGhvcml6ZWRDb21tYW5kRml4dHVyZSgpCisgIHsKKyAgfQorCisgIHZpcnR1YWwKKyAgflVuYXV0aG9yaXplZENvbW1hbmRGaXh0dXJlKCkKKyAgeworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCisKKyNlbmRpZiAvLyBORkRfVEVTVFNfTkZEX01HTVRfVkFMSURBVElPTl9DT01NT05fSFBQCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL2NzLmNwcCBiL05GRC90ZXN0cy9kYWVtb24vdGFibGUvY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzJmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL2NzLmNwcApAQCAtMCwwICsxLDEwMjggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogXGF1dGhvciBJbHlhIE1vaXNlZW5rbyA8aWxpYW1vQHVjbGEuZWR1PgorICoqLworCisjaW5jbHVkZSAidGFibGUvY3MuaHBwIgorI2luY2x1ZGUgInRhYmxlL2NzLWVudHJ5LmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitjbGFzcyBDc0FjY2Vzc29yIDogcHVibGljIENzCit7CitwdWJsaWM6CisgIGJvb2wKKyAgZXZpY3RJdGVtX2FjY2Vzc29yKCkKKyAgeworICAgIHJldHVybiBldmljdEl0ZW0oKTsKKyAgfQorfTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRhYmxlQ3MsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXRMaW1pdCkKK3sKKyAgQ3MgY3MoMSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3MuaW5zZXJ0KCptYWtlRGF0YSgiLzEiKSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5pbnNlcnQoKm1ha2VEYXRhKCIvMiIpKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMSk7CisKKyAgY3Muc2V0TGltaXQoMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLmluc2VydCgqbWFrZURhdGEoIi8zIikpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3MuaW5zZXJ0KCptYWtlRGF0YSgiLzQiKSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5pbnNlcnQoKm1ha2VEYXRhKCIvNSIpKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMyk7CisKKyAgY3Muc2V0TGltaXQoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEluc2VydGlvbikKK3sKKyAgQ3MgY3M7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3MuaW5zZXJ0KCptYWtlRGF0YSgiL2luc2VydGlvbiIpKSwgdHJ1ZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEluc2VydGlvbjIpCit7CisgIENzIGNzOworCisgIGNzLmluc2VydCgqbWFrZURhdGEoIi9hIikpOworICBjcy5pbnNlcnQoKm1ha2VEYXRhKCIvYiIpKTsKKyAgY3MuaW5zZXJ0KCptYWtlRGF0YSgiL2MiKSk7CisgIGNzLmluc2VydCgqbWFrZURhdGEoIi9kIikpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgNCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKER1cGxpY2F0ZUluc2VydGlvbikKK3sKKyAgQ3MgY3M7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhMCA9IG1ha2VEYXRhKCIvaW5zZXJ0L3NtdGgiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3MuaW5zZXJ0KCpkYXRhMCksIHRydWUpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKCIvaW5zZXJ0L2R1cGxpY2F0ZSIpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5pbnNlcnQoKmRhdGEpLCB0cnVlKTsKKworICBjcy5pbnNlcnQoKmRhdGEpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDIpOworfQorCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKER1cGxpY2F0ZUluc2VydGlvbjIpCit7CisgIENzIGNzOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKCIvaW5zZXJ0L2R1cGxpY2F0ZSIpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5pbnNlcnQoKmRhdGEpLCB0cnVlKTsKKworICBjcy5pbnNlcnQoKmRhdGEpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDEpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTIgPSBtYWtlRGF0YSgiL2luc2VydC9vcmlnaW5hbCIpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5pbnNlcnQoKmRhdGEyKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEluc2VydEFuZEZpbmQpCit7CisgIENzIGNzOworCisgIE5hbWUgbmFtZSgiL2luc2VydC9hbmQvZmluZCIpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKG5hbWUpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5pbnNlcnQoKmRhdGEpLCB0cnVlKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PihuYW1lKTsKKworICBjb25zdCBEYXRhKiBmb3VuZCA9IGNzLmZpbmQoKmludGVyZXN0KTsKKworICBCT09TVF9SRVFVSVJFKGZvdW5kICE9IDApOworICBCT09TVF9DSEVDS19FUVVBTChkYXRhLT5nZXROYW1lKCksIGZvdW5kLT5nZXROYW1lKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJbnNlcnRBbmROb3RGaW5kKQoreworICBDcyBjczsKKworICBOYW1lIG5hbWUoIi9pbnNlcnQvYW5kL2ZpbmQiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhID0gbWFrZURhdGEobmFtZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLmluc2VydCgqZGF0YSksIHRydWUpOworCisgIE5hbWUgbmFtZTIoIi9ub3QvZmluZCIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PihuYW1lMik7CisKKyAgY29uc3QgRGF0YSogZm91bmQgPSBjcy5maW5kKCppbnRlcmVzdCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm91bmQsIHN0YXRpY19jYXN0PGNvbnN0IERhdGEqPigwKSk7Cit9CisKKworQk9PU1RfQVVUT19URVNUX0NBU0UoSW5zZXJ0QW5kRXJhc2UpCit7CisgIENzQWNjZXNzb3IgY3M7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhID0gbWFrZURhdGEoIi9pbnNlcnRhbmRlbGV0ZSIpOworICBjcy5pbnNlcnQoKmRhdGEpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDEpOworCisgIGNzLmV2aWN0SXRlbV9hY2Nlc3NvcigpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTdGFsZW5lc3NRdWV1ZSkKK3sKKyAgQ3NBY2Nlc3NvciBjczsKKworICBOYW1lIG5hbWUyKCIvaW5zZXJ0L2ZyZXNoIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTIgPSBtYWtlRGF0YShuYW1lMik7CisgIGRhdGEyLT5zZXRGcmVzaG5lc3NQZXJpb2QodGltZTo6bWlsbGlzZWNvbmRzKDUwMDApKTsKKyAgc2lnbkRhdGEoZGF0YTIpOworICBjcy5pbnNlcnQoKmRhdGEyKTsKKworICBOYW1lIG5hbWUoIi9pbnNlcnQvZXhwaXJlIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKG5hbWUpOworICBkYXRhLT5zZXRGcmVzaG5lc3NQZXJpb2QodGltZTo6bWlsbGlzZWNvbmRzKDUwMCkpOworICBzaWduRGF0YShkYXRhKTsKKyAgY3MuaW5zZXJ0KCpkYXRhKTsKKworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDIpOworCisgIHNsZWVwKDMpOworCisgIGNzLmV2aWN0SXRlbV9hY2Nlc3NvcigpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDEpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KG5hbWUyKTsKKyAgY29uc3QgRGF0YSogZm91bmQgPSBjcy5maW5kKCppbnRlcmVzdCk7CisgIEJPT1NUX1JFUVVJUkUoZm91bmQgIT0gMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvdW5kLT5nZXROYW1lKCksIG5hbWUyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQnVnMjA0MykgLy8gZXZpY3Rpb24gb3JkZXIgb2YgdW5zb2xpY2l0ZWQgcGFja2V0cworeworICBDcyBjcygzKTsKKworICBjcy5pbnNlcnQoKm1ha2VEYXRhKCIvYSIpLCB0cnVlKTsKKyAgY3MuaW5zZXJ0KCptYWtlRGF0YSgiL2IiKSwgdHJ1ZSk7CisgIGNzLmluc2VydCgqbWFrZURhdGEoIi9jIiksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDMpOworCisgIGNzLmluc2VydCgqbWFrZURhdGEoIi9kIiksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDMpOworCisgIGNvbnN0IERhdGEqIG9sZGVzdERhdGEgPSBjcy5maW5kKEludGVyZXN0KCIvYSIpKTsKKyAgY29uc3QgRGF0YSogbmV3ZXN0RGF0YSA9IGNzLmZpbmQoSW50ZXJlc3QoIi9jIikpOworICBCT09TVF9DSEVDSyhvbGRlc3REYXRhID09IDApOworICBCT09TVF9DSEVDSyhuZXdlc3REYXRhICE9IDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShVbnNvbGljaXRlZFdpdGhTb2xpY2l0ZWRFdmljdGlvbk9yZGVyKQoreworICBDcyBjcygzKTsKKworICBjcy5pbnNlcnQoKm1ha2VEYXRhKCIvYSIpLCB0cnVlKTsKKyAgY3MuaW5zZXJ0KCptYWtlRGF0YSgiL2IiKSwgZmFsc2UpOworICBjcy5pbnNlcnQoKm1ha2VEYXRhKCIvYyIpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3Muc2l6ZSgpLCAzKTsKKworICBjcy5pbnNlcnQoKm1ha2VEYXRhKCIvZCIpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3Muc2l6ZSgpLCAzKTsKKworICBjb25zdCBEYXRhKiBvbGRlc3REYXRhID0gY3MuZmluZChJbnRlcmVzdCgiL2EiKSk7CisgIGNvbnN0IERhdGEqIG5ld2VzdERhdGEgPSBjcy5maW5kKEludGVyZXN0KCIvYyIpKTsKKyAgQk9PU1RfQ0hFQ0sob2xkZXN0RGF0YSA9PSAwKTsKKyAgQk9PU1RfQ0hFQ0sobmV3ZXN0RGF0YSAhPSAwKTsKK30KKworLy9ldmVuIG1heCBzaXplCitCT09TVF9BVVRPX1RFU1RfQ0FTRShSZXBsYWNlbWVudEV2ZW5TaXplKQoreworICBDcyBjcyg0KTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlRGF0YSgiL2EiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEyID0gbWFrZURhdGEoIi9iIik7CisgIGNzLmluc2VydCgqZGF0YTIpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTMgPSBtYWtlRGF0YSgiL2MiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhMyk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNCA9IG1ha2VEYXRhKCIvZCIpOworICBjcy5pbnNlcnQoKmRhdGE0KTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE1ID0gbWFrZURhdGEoIi9lIik7CisgIGNzLmluc2VydCgqZGF0YTUpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgNCk7Cit9CisKKy8vb2RkIG1heCBzaXplCitCT09TVF9BVVRPX1RFU1RfQ0FTRShSZXBsYWNlbWVudDIpCit7CisgIENzIGNzKDMpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKCIvYSIpOworICBjcy5pbnNlcnQoKmRhdGEpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTIgPSBtYWtlRGF0YSgiL2IiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhMik7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhMyA9IG1ha2VEYXRhKCIvYyIpOworICBjcy5pbnNlcnQoKmRhdGEzKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE0ID0gbWFrZURhdGEoIi9kIik7CisgIGNzLmluc2VydCgqZGF0YTQpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMyk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEluc2VydEFuZEVyYXNlQnlOYW1lKQoreworICBDc0FjY2Vzc29yIGNzOworCisgIE5hbWUgbmFtZSgiL2luc2VydGFuZHJlbW92ZWJ5bmFtZSIpOworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlRGF0YShuYW1lKTsKKyAgY3MuaW5zZXJ0KCpkYXRhKTsKKworICBuZG46OkNvbnN0QnVmZmVyUHRyIGRpZ2VzdDEgPSBuZG46OmNyeXB0bzo6c2hhMjU2KGRhdGEtPndpcmVFbmNvZGUoKS53aXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+d2lyZUVuY29kZSgpLnNpemUoKSk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhMiA9IG1ha2VEYXRhKCIvYSIpOworICBjcy5pbnNlcnQoKmRhdGEyKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEzID0gbWFrZURhdGEoIi96Iik7CisgIGNzLmluc2VydCgqZGF0YTMpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMyk7CisKKyAgbmFtZS5hcHBlbmRJbXBsaWNpdFNoYTI1NkRpZ2VzdChkaWdlc3QxKTsKKyAgY3MuZXJhc2UobmFtZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKERpZ2VzdENhbGN1bGF0aW9uKQoreworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlRGF0YSgiL2RpZ2VzdC9jb21wdXRlIik7CisKKyAgbmRuOjpDb25zdEJ1ZmZlclB0ciBkaWdlc3QxID0gbmRuOjpjcnlwdG86OnNoYTI1NihkYXRhLT53aXJlRW5jb2RlKCkud2lyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPndpcmVFbmNvZGUoKS5zaXplKCkpOworICBCT09TVF9DSEVDS19FUVVBTChkaWdlc3QxLT5zaXplKCksIDMyKTsKKworICBjczo6RW50cnkqIGVudHJ5ID0gbmV3IGNzOjpFbnRyeSgpOworICBlbnRyeS0+c2V0RGF0YSgqZGF0YSwgZmFsc2UpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMX0NPTExFQ1RJT05TKGRpZ2VzdDEtPmJlZ2luKCksIGRpZ2VzdDEtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Z2V0RnVsbE5hbWUoKVstMV0udmFsdWVfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmdldEZ1bGxOYW1lKClbLTFdLnZhbHVlX2VuZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSW5zZXJ0Q2Fub25pY2FsKQoreworICBDcyBjczsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlRGF0YSgiL2EiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEyID0gbWFrZURhdGEoIi9iIik7CisgIGNzLmluc2VydCgqZGF0YTIpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTMgPSBtYWtlRGF0YSgiL2MiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhMyk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNCA9IG1ha2VEYXRhKCIvZCIpOworICBjcy5pbnNlcnQoKmRhdGE0KTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE1ID0gbWFrZURhdGEoIi9jL2MvMS8yLzMvNC81LzYiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhNSk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNiA9IG1ha2VEYXRhKCIvYy9jLzEvMi8zIik7CisgIGNzLmluc2VydCgqZGF0YTYpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTcgPSBtYWtlRGF0YSgiL2MvYy8xIik7CisgIGNzLmluc2VydCgqZGF0YTcpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFcmFzZUNhbm9uaWNhbCkKK3sKKyAgQ3MgY3M7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhID0gbWFrZURhdGEoIi9hIik7CisgIGNzLmluc2VydCgqZGF0YSk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhMiA9IG1ha2VEYXRhKCIvYiIpOworICBjcy5pbnNlcnQoKmRhdGEyKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEzID0gbWFrZURhdGEoIi9jIik7CisgIGNzLmluc2VydCgqZGF0YTMpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTQgPSBtYWtlRGF0YSgiL2QiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhNCk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNSA9IG1ha2VEYXRhKCIvYy9jLzEvMi8zLzQvNS82Iik7CisgIGNzLmluc2VydCgqZGF0YTUpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTYgPSBtYWtlRGF0YSgiL2MvYy8xLzIvMyIpOworICBjcy5pbnNlcnQoKmRhdGE2KTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE3ID0gbWFrZURhdGEoIi9jL2MvMSIpOworICBjcy5pbnNlcnQoKmRhdGE3KTsKKworICBuZG46OkNvbnN0QnVmZmVyUHRyIGRpZ2VzdDEgPSBuZG46OmNyeXB0bzo6c2hhMjU2KGRhdGEtPndpcmVFbmNvZGUoKS53aXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+d2lyZUVuY29kZSgpLnNpemUoKSk7CisKKyAgTmFtZSBuYW1lKCIvYSIpOworICBuYW1lLmFwcGVuZEltcGxpY2l0U2hhMjU2RGlnZXN0KGRpZ2VzdDEtPmJ1ZigpLCBkaWdlc3QxLT5zaXplKCkpOworICBjcy5lcmFzZShuYW1lKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3Muc2l6ZSgpLCA2KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSW1wbGljaXREaWdlc3RTZWxlY3RvcikKK3sKKyAgQ3NBY2Nlc3NvciBjczsKKworICBOYW1lIG5hbWUoIi9kaWdlc3Qvd29ya3MiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhID0gbWFrZURhdGEobmFtZSk7CisgIGNzLmluc2VydCgqZGF0YSk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhMiA9IG1ha2VEYXRhKCIvYSIpOworICBjcy5pbnNlcnQoKmRhdGEyKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEzID0gbWFrZURhdGEoIi96L3oveiIpOworICBjcy5pbnNlcnQoKmRhdGEzKTsKKworICBuZG46OkNvbnN0QnVmZmVyUHRyIGRpZ2VzdDEgPSBuZG46OmNyeXB0bzo6c2hhMjU2KGRhdGEtPndpcmVFbmNvZGUoKS53aXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+d2lyZUVuY29kZSgpLnNpemUoKSk7CisgIHVpbnQ4X3QgZGlnZXN0MlszMl0gPSB7MCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxfTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigpOworICBpbnRlcmVzdC0+c2V0TmFtZShOYW1lKG5hbWUpLmFwcGVuZChkaWdlc3QxLT5idWYoKSwgZGlnZXN0MS0+c2l6ZSgpKSk7CisgIGludGVyZXN0LT5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDApOworICBpbnRlcmVzdC0+c2V0TWF4U3VmZml4Q29tcG9uZW50cygwKTsKKworICBjb25zdCBEYXRhKiBmb3VuZCA9IGNzLmZpbmQoKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfTkUoZm91bmQsIHN0YXRpY19jYXN0PGNvbnN0IERhdGEqPigwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvdW5kLT5nZXROYW1lKCksIG5hbWUpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MiA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigpOworICBpbnRlcmVzdDItPnNldE5hbWUoTmFtZShuYW1lKS5hcHBlbmQoZGlnZXN0MiwgMzIpKTsKKyAgaW50ZXJlc3QyLT5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDApOworICBpbnRlcmVzdDItPnNldE1heFN1ZmZpeENvbXBvbmVudHMoMCk7CisKKyAgY29uc3QgRGF0YSogbm90Zm91bmQgPSBjcy5maW5kKCppbnRlcmVzdDIpOworICBCT09TVF9DSEVDS19FUVVBTChub3Rmb3VuZCwgc3RhdGljX2Nhc3Q8Y29uc3QgRGF0YSo+KDApKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2hpbGRTZWxlY3RvcikKK3sKKyAgQ3MgY3M7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhID0gbWFrZURhdGEoIi9hIik7CisgIGNzLmluc2VydCgqZGF0YSk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhMiA9IG1ha2VEYXRhKCIvYiIpOworICBjcy5pbnNlcnQoKmRhdGEyKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE0ID0gbWFrZURhdGEoIi9kIik7CisgIGNzLmluc2VydCgqZGF0YTQpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTUgPSBtYWtlRGF0YSgiL2MvYyIpOworICBjcy5pbnNlcnQoKmRhdGE1KTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE2ID0gbWFrZURhdGEoIi9jL2YiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhNik7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNyA9IG1ha2VEYXRhKCIvYy9uIik7CisgIGNzLmluc2VydCgqZGF0YTcpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvYyIpOworICBpbnRlcmVzdC0+c2V0Q2hpbGRTZWxlY3RvcigxKTsKKworICBjb25zdCBEYXRhKiBmb3VuZCA9IGNzLmZpbmQoKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm91bmQtPmdldE5hbWUoKSwgIi9jL24iKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDIgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9jIik7CisgIGludGVyZXN0Mi0+c2V0Q2hpbGRTZWxlY3RvcigwKTsKKworICBjb25zdCBEYXRhKiBmb3VuZDIgPSBjcy5maW5kKCppbnRlcmVzdDIpOworICBCT09TVF9DSEVDS19FUVVBTChmb3VuZDItPmdldE5hbWUoKSwgIi9jL2MiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2hpbGRTZWxlY3RvcjIpCit7CisgIENzIGNzOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKCIvYS9iLzEiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEyID0gbWFrZURhdGEoIi9hL2IvMiIpOworICBjcy5pbnNlcnQoKmRhdGEyKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEzID0gbWFrZURhdGEoIi9hL3ovMSIpOworICBjcy5pbnNlcnQoKmRhdGEzKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE0ID0gbWFrZURhdGEoIi9hL3ovMiIpOworICBjcy5pbnNlcnQoKmRhdGE0KTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigiL2EiKTsKKyAgaW50ZXJlc3QtPnNldENoaWxkU2VsZWN0b3IoMSk7CisKKyAgY29uc3QgRGF0YSogZm91bmQgPSBjcy5maW5kKCppbnRlcmVzdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvdW5kLT5nZXROYW1lKCksICIvYS96LzEiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTXVzdEJlRnJlc2hTZWxlY3RvcikKK3sKKyAgQ3MgY3M7CisKKyAgTmFtZSBuYW1lKCIvaW5zZXJ0L25vbmZyZXNoIik7CisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKG5hbWUpOworICBkYXRhLT5zZXRGcmVzaG5lc3NQZXJpb2QodGltZTo6bWlsbGlzZWNvbmRzKDUwMCkpOworICBzaWduRGF0YShkYXRhKTsKKyAgY3MuaW5zZXJ0KCpkYXRhKTsKKworICBzbGVlcCgxKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PihuYW1lKTsKKyAgaW50ZXJlc3QtPnNldE11c3RCZUZyZXNoKHRydWUpOworCisgIGNvbnN0IERhdGEqIGZvdW5kID0gY3MuZmluZCgqaW50ZXJlc3QpOworICBCT09TVF9DSEVDS19FUVVBTChmb3VuZCwgc3RhdGljX2Nhc3Q8Y29uc3QgRGF0YSo+KDApKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUHVibGlzaGVyS2V5U2VsZWN0b3IpCit7CisgIENzIGNzOworCisgIE5hbWUgbmFtZSgiL2luc2VydC93aXRoa2V5Iik7CisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKG5hbWUpOworICBjcy5pbnNlcnQoKmRhdGEpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KG5hbWUpOworICBOYW1lIGtleU5hbWUoIi9zb21ld2hlcmUva2V5Iik7CisKKyAgbmRuOjpLZXlMb2NhdG9yIGxvY2F0b3Ioa2V5TmFtZSk7CisgIGludGVyZXN0LT5zZXRQdWJsaXNoZXJQdWJsaWNLZXlMb2NhdG9yKGxvY2F0b3IpOworCisgIGNvbnN0IERhdGEqIGZvdW5kID0gY3MuZmluZCgqaW50ZXJlc3QpOworICBCT09TVF9DSEVDS19FUVVBTChmb3VuZCwgc3RhdGljX2Nhc3Q8Y29uc3QgRGF0YSo+KDApKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUHVibGlzaGVyS2V5U2VsZWN0b3IyKQoreworICBDcyBjczsKKyAgTmFtZSBuYW1lKCIvaW5zZXJ0L3dpdGhrZXkiKTsKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhID0gbWFrZURhdGEobmFtZSk7CisgIGNzLmluc2VydCgqZGF0YSk7CisKKyAgTmFtZSBuYW1lMigiL2luc2VydC93aXRoa2V5MiIpOworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEyID0gbWFrZV9zaGFyZWQ8RGF0YT4obmFtZTIpOworCisgIE5hbWUga2V5TmFtZSgiL3NvbWV3aGVyZS9rZXkiKTsKKyAgY29uc3QgbmRuOjpLZXlMb2NhdG9yIGxvY2F0b3Ioa2V5TmFtZSk7CisKKyAgbmRuOjpTaWduYXR1cmVTaGEyNTZXaXRoUnNhIGZha2VTaWduYXR1cmU7CisgIGZha2VTaWduYXR1cmUuc2V0VmFsdWUobmRuOjpkYXRhQmxvY2sodGx2OjpTaWduYXR1cmVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigwKSwgMCkpOworCisgIGZha2VTaWduYXR1cmUuc2V0S2V5TG9jYXRvcihsb2NhdG9yKTsKKyAgZGF0YTItPnNldFNpZ25hdHVyZShmYWtlU2lnbmF0dXJlKTsKKyAgZGF0YTItPndpcmVFbmNvZGUoKTsKKworICBjcy5pbnNlcnQoKmRhdGEyKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PihuYW1lMik7CisgIGludGVyZXN0LT5zZXRQdWJsaXNoZXJQdWJsaWNLZXlMb2NhdG9yKGxvY2F0b3IpOworCisgIGNvbnN0IERhdGEqIGZvdW5kID0gY3MuZmluZCgqaW50ZXJlc3QpOworICBCT09TVF9DSEVDS19ORShmb3VuZCwgc3RhdGljX2Nhc3Q8Y29uc3QgRGF0YSo+KDApKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm91bmQtPmdldE5hbWUoKSwgZGF0YTItPmdldE5hbWUoKSk7Cit9CisKKworLy8vIEB0b2RvIEV4cGVjdGVkIGZhaWx1cmVzLCBuZWVkcyB0byBiZSBmaXhlZCBhcyBwYXJ0IG9mIElzc3VlICMyMTE4CitCT09TVF9BVVRPX1RFU1RfQ0FTRV9FWFBFQ1RFRF9GQUlMVVJFUyhNaW5NYXhDb21wb25lbnRzU2VsZWN0b3IsIDEpCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNaW5NYXhDb21wb25lbnRzU2VsZWN0b3IpCit7CisgIENzIGNzOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG1ha2VEYXRhKCIvYSIpOworICBjcy5pbnNlcnQoKmRhdGEpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTIgPSBtYWtlRGF0YSgiL2IiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhMik7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNCA9IG1ha2VEYXRhKCIvZCIpOworICBjcy5pbnNlcnQoKmRhdGE0KTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE1ID0gbWFrZURhdGEoIi9jL2MvMS8yLzMvNC81LzYiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhNSk7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNiA9IG1ha2VEYXRhKCIvYy9jLzYvNy84LzkiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhNik7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNyA9IG1ha2VEYXRhKCIvYy9jLzEvMi8zIik7CisgIGNzLmluc2VydCgqZGF0YTcpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTggPSBtYWtlRGF0YSgiL2MvYy8xIik7CisgIGNzLmluc2VydCgqZGF0YTgpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvYy9jIik7CisgIGludGVyZXN0LT5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDMpOworICBpbnRlcmVzdC0+c2V0Q2hpbGRTZWxlY3RvcigwKTsKKworICBjb25zdCBEYXRhKiBmb3VuZCA9IGNzLmZpbmQoKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm91bmQtPmdldE5hbWUoKSwgIi9jL2MvMS8yLzMvNC81LzYiKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDIgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9jL2MiKTsKKyAgaW50ZXJlc3QyLT5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDQpOworICBpbnRlcmVzdDItPnNldENoaWxkU2VsZWN0b3IoMSk7CisKKyAgY29uc3QgRGF0YSogZm91bmQyID0gY3MuZmluZCgqaW50ZXJlc3QyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm91bmQyLT5nZXROYW1lKCksICIvYy9jLzYvNy84LzkiKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDMgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oIi9jL2MiKTsKKyAgaW50ZXJlc3QzLT5zZXRNYXhTdWZmaXhDb21wb25lbnRzKDIpOworICBpbnRlcmVzdDMtPnNldENoaWxkU2VsZWN0b3IoMSk7CisKKyAgY29uc3QgRGF0YSogZm91bmQzID0gY3MuZmluZCgqaW50ZXJlc3QzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZm91bmQzLT5nZXROYW1lKCksICIvYy9jLzEiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRXhjbHVkZVNlbGVjdG9yKQoreworICBDcyBjczsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlRGF0YSgiL2EiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEyID0gbWFrZURhdGEoIi9iIik7CisgIGNzLmluc2VydCgqZGF0YTIpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTMgPSBtYWtlRGF0YSgiL2MvYSIpOworICBjcy5pbnNlcnQoKmRhdGEzKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE0ID0gbWFrZURhdGEoIi9kIik7CisgIGNzLmluc2VydCgqZGF0YTQpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YTUgPSBtYWtlRGF0YSgiL2MvYyIpOworICBjcy5pbnNlcnQoKmRhdGE1KTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGE2ID0gbWFrZURhdGEoIi9jL2YiKTsKKyAgY3MuaW5zZXJ0KCpkYXRhNik7CisKKyAgc2hhcmVkX3B0cjxEYXRhPiBkYXRhNyA9IG1ha2VEYXRhKCIvYy9uIik7CisgIGNzLmluc2VydCgqZGF0YTcpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvYyIpOworICBpbnRlcmVzdC0+c2V0Q2hpbGRTZWxlY3RvcigxKTsKKyAgRXhjbHVkZSBlOworICBlLmV4Y2x1ZGVPbmUgKE5hbWU6OkNvbXBvbmVudCgibiIpKTsKKyAgaW50ZXJlc3QtPnNldEV4Y2x1ZGUoZSk7CisKKyAgY29uc3QgRGF0YSogZm91bmQgPSBjcy5maW5kKCppbnRlcmVzdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvdW5kLT5nZXROYW1lKCksICIvYy9mIik7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QyID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCIvYyIpOworICBpbnRlcmVzdDItPnNldENoaWxkU2VsZWN0b3IoMCk7CisKKyAgRXhjbHVkZSBlMjsKKyAgZTIuZXhjbHVkZU9uZSAoTmFtZTo6Q29tcG9uZW50KCJhIikpOworICBpbnRlcmVzdDItPnNldEV4Y2x1ZGUoZTIpOworCisgIGNvbnN0IERhdGEqIGZvdW5kMiA9IGNzLmZpbmQoKmludGVyZXN0Mik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZvdW5kMi0+Z2V0TmFtZSgpLCAiL2MvYyIpOworCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MyA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigiL2MiKTsKKyAgaW50ZXJlc3QzLT5zZXRDaGlsZFNlbGVjdG9yKDApOworCisgIEV4Y2x1ZGUgZTM7CisgIGUzLmV4Y2x1ZGVPbmUgKE5hbWU6OkNvbXBvbmVudCgiYyIpKTsKKyAgaW50ZXJlc3QzLT5zZXRFeGNsdWRlKGUzKTsKKworICBjb25zdCBEYXRhKiBmb3VuZDMgPSBjcy5maW5kKCppbnRlcmVzdDMpOworICBCT09TVF9DSEVDS19FUVVBTChmb3VuZDMtPmdldE5hbWUoKSwgIi9jL2EiKTsKK30KKworLy8KKworY2xhc3MgRmluZEZpeHR1cmUgOiBwcm90ZWN0ZWQgQmFzZUZpeHR1cmUKK3sKK3Byb3RlY3RlZDoKKyAgdm9pZAorICBpbnNlcnQodWludDMyX3QgaWQsIGNvbnN0IE5hbWUmIG5hbWUpCisgIHsKKyAgICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlRGF0YShuYW1lKTsKKyAgICBkYXRhLT5zZXRGcmVzaG5lc3NQZXJpb2QodGltZTo6bWlsbGlzZWNvbmRzKDk5OTk5KSk7CisgICAgZGF0YS0+c2V0Q29udGVudChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmaWQpLCBzaXplb2YoaWQpKTsKKyAgICBzaWduRGF0YShkYXRhKTsKKworICAgIG1fY3MuaW5zZXJ0KCpkYXRhKTsKKyAgfQorCisgIEludGVyZXN0JgorICBzdGFydEludGVyZXN0KGNvbnN0IE5hbWUmIG5hbWUpCisgIHsKKyAgICBtX2ludGVyZXN0ID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KG5hbWUpOworICAgIHJldHVybiAqbV9pbnRlcmVzdDsKKyAgfQorCisgIHVpbnQzMl90CisgIGZpbmQoKQorICB7CisgICAgY29uc3QgRGF0YSogZm91bmQgPSBtX2NzLmZpbmQoKm1faW50ZXJlc3QpOworICAgIGlmIChmb3VuZCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgQmxvY2smIGNvbnRlbnQgPSBmb3VuZC0+Z2V0Q29udGVudCgpOworICAgIGlmIChjb250ZW50LnZhbHVlX3NpemUoKSAhPSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oY29udGVudC52YWx1ZSgpKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIENzIG1fY3M7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IG1faW50ZXJlc3Q7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoRmluZCwgRmluZEZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVtcHR5RGF0YU5hbWUpCit7CisgIGluc2VydCgxLCAibmRuOi8iKTsKKworICBzdGFydEludGVyZXN0KCJuZG46LyIpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbXB0eUludGVyZXN0TmFtZSkKK3sKKyAgaW5zZXJ0KDEsICJuZG46L0EiKTsKKworICBzdGFydEludGVyZXN0KCJuZG46LyIpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShMZWZ0bW9zdCkKK3sKKyAgaW5zZXJ0KDEsICJuZG46L0EiKTsKKyAgaW5zZXJ0KDIsICJuZG46L0IvcC8xIik7CisgIGluc2VydCgzLCAibmRuOi9CL3AvMiIpOworICBpbnNlcnQoNCwgIm5kbjovQi9xLzEiKTsKKyAgaW5zZXJ0KDUsICJuZG46L0IvcS8yIik7CisgIGluc2VydCg2LCAibmRuOi9DIik7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi9CIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFJpZ2h0bW9zdCkKK3sKKyAgaW5zZXJ0KDEsICJuZG46L0EiKTsKKyAgaW5zZXJ0KDIsICJuZG46L0IvcC8xIik7CisgIGluc2VydCgzLCAibmRuOi9CL3AvMiIpOworICBpbnNlcnQoNCwgIm5kbjovQi9xLzEiKTsKKyAgaW5zZXJ0KDUsICJuZG46L0IvcS8yIik7CisgIGluc2VydCg2LCAibmRuOi9DIik7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi9CIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmluZCgpLCA0KTsKK30KKworLy8vIEB0b2RvIEV4cGVjdGVkIGZhaWx1cmVzLCBuZWVkcyB0byBiZSBmaXhlZCBhcyBwYXJ0IG9mIElzc3VlICMyMTE4CitCT09TVF9BVVRPX1RFU1RfQ0FTRV9FWFBFQ1RFRF9GQUlMVVJFUyhMZWZ0bW9zdF9FeGFjdE5hbWUxLCAxKQorQk9PU1RfQVVUT19URVNUX0NBU0UoTGVmdG1vc3RfRXhhY3ROYW1lMSkKK3sKKyAgaW5zZXJ0KDEsICJuZG46LyIpOworICBpbnNlcnQoMiwgIm5kbjovQS9CIik7CisgIGluc2VydCgzLCAibmRuOi9BL0MiKTsKKyAgaW5zZXJ0KDQsICJuZG46L0EiKTsKKyAgaW5zZXJ0KDUsICJuZG46L0QiKTsKKworICAvLyBJbnR1aXRpdmVseSB5b3Ugd291bGQgdGhpbmsgRGF0YSA0IHNob3VsZCBiZSBiZXR3ZWVuIERhdGEgMSBhbmQgMiwKKyAgLy8gYnV0IERhdGEgNCBoYXMgZnVsbCBOYW1lIG5kbjovQS88MzItb2N0ZXQgaGFzaD4uCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovQSIpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShMZWZ0bW9zdF9FeGFjdE5hbWUzMykKK3sKKyAgaW5zZXJ0KDEsICJuZG46LyIpOworICBpbnNlcnQoMiwgIm5kbjovQSIpOworICBpbnNlcnQoMywgIm5kbjovQS9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIiKTsgLy8gMzMgJ0IncworICBpbnNlcnQoNCwgIm5kbjovQS9DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MiKTsgLy8gMzMgJ0MncworICBpbnNlcnQoNSwgIm5kbjovRCIpOworCisgIC8vIERhdGEgMiBpcyByZXR1cm5lZCwgYmVjYXVzZSA8MzItb2N0ZXQgaGFzaD4gaXMgbGVzcyB0aGFuIERhdGEgMy4KKyAgc3RhcnRJbnRlcmVzdCgibmRuOi9BIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMik7Cit9CisKKy8vLyBAdG9kbyBFeHBlY3RlZCBmYWlsdXJlcywgbmVlZHMgdG8gYmUgZml4ZWQgYXMgcGFydCBvZiBJc3N1ZSAjMjExOAorQk9PU1RfQVVUT19URVNUX0NBU0VfRVhQRUNURURfRkFJTFVSRVMoTWluU3VmZml4Q29tcG9uZW50cywgMikKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1pblN1ZmZpeENvbXBvbmVudHMpCit7CisgIGluc2VydCgxLCAibmRuOi9BLzEvMi8zLzQiKTsKKyAgaW5zZXJ0KDIsICJuZG46L0IvMS8yLzMiKTsKKyAgaW5zZXJ0KDMsICJuZG46L0MvMS8yIik7CisgIGluc2VydCg0LCAibmRuOi9ELzEiKTsKKyAgaW5zZXJ0KDUsICJuZG46L0UiKTsKKyAgaW5zZXJ0KDYsICJuZG46LyIpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDApOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDYpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDEpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDYpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDIpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDUpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDMpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDQpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDQpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDMpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDUpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDIpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDYpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDEpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDcpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDApOworfQorCisvLy8gQHRvZG8gRXhwZWN0ZWQgZmFpbHVyZXMsIG5lZWRzIHRvIGJlIGZpeGVkIGFzIHBhcnQgb2YgSXNzdWUgIzIxMTgKK0JPT1NUX0FVVE9fVEVTVF9DQVNFX0VYUEVDVEVEX0ZBSUxVUkVTKE1heFN1ZmZpeENvbXBvbmVudHMsIDUpCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNYXhTdWZmaXhDb21wb25lbnRzKQoreworICBpbnNlcnQoMSwgIm5kbjovIik7CisgIGluc2VydCgyLCAibmRuOi9BIik7CisgIGluc2VydCgzLCAibmRuOi9BL0IiKTsKKyAgaW5zZXJ0KDQsICJuZG46L0EvQi9DIik7CisgIGluc2VydCg1LCAibmRuOi9BL0IvQy9EIik7CisgIGluc2VydCg2LCAibmRuOi9BL0IvQy9EL0UiKTsKKyAgLy8gT3JkZXIgaXMgNiw1LDQsMywyLDEsIGJlY2F1c2UgPDMyLW9jdGV0IGhhc2g+IGlzIGdyZWF0ZXIgdGhhbiBhIDEtb2N0ZXQgY29tcG9uZW50LgorCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0TWF4U3VmZml4Q29tcG9uZW50cygwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmluZCgpLCAwKTsKKworICBzdGFydEludGVyZXN0KCJuZG46LyIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMSk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi8iKQorICAgIC5zZXRNYXhTdWZmaXhDb21wb25lbnRzKDIpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDIpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0TWF4U3VmZml4Q29tcG9uZW50cygzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmluZCgpLCAzKTsKKworICBzdGFydEludGVyZXN0KCJuZG46LyIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgNCk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi8iKQorICAgIC5zZXRNYXhTdWZmaXhDb21wb25lbnRzKDUpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDUpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovIikKKyAgICAuc2V0TWF4U3VmZml4Q29tcG9uZW50cyg2KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmluZCgpLCA2KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRGlnZXN0T3JkZXIpCit7CisgIGluc2VydCgxLCAibmRuOi9BIik7CisgIGluc2VydCgyLCAibmRuOi9BIik7CisgIC8vIFdlIGRvbid0IGtub3cgd2hpY2ggY29tZXMgZmlyc3QsIGJ1dCB0aGVyZSBtdXN0IGJlIHNvbWUgb3JkZXIKKworICBzdGFydEludGVyZXN0KCJuZG46L0EiKQorICAgIC5zZXRDaGlsZFNlbGVjdG9yKDApOworICB1aW50MzJfdCBsZWZ0bW9zdCA9IGZpbmQoKTsKKworICBzdGFydEludGVyZXN0KCJuZG46L0EiKQorICAgIC5zZXRDaGlsZFNlbGVjdG9yKDEpOworICB1aW50MzJfdCByaWdodG1vc3QgPSBmaW5kKCk7CisKKyAgQk9PU1RfQ0hFQ0tfTkUobGVmdG1vc3QsIHJpZ2h0bW9zdCk7Cit9CisKKy8vLyBAdG9kbyBFeHBlY3RlZCBmYWlsdXJlcywgbmVlZHMgdG8gYmUgZml4ZWQgYXMgcGFydCBvZiBJc3N1ZSAjMjExOAorQk9PU1RfQVVUT19URVNUX0NBU0VfRVhQRUNURURfRkFJTFVSRVMoRGlnZXN0RXhjbHVkZSwgMSkKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKERpZ2VzdEV4Y2x1ZGUpCit7CisgIGluc2VydCgxLCAibmRuOi9BL0IiKTsKKyAgaW5zZXJ0KDIsICJuZG46L0EiKTsKKyAgaW5zZXJ0KDMsICJuZG46L0EvQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDIik7IC8vIDMzICdDJ3MKKworICBzdGFydEludGVyZXN0KCJuZG46L0EiKQorICAgIC5zZXRFeGNsdWRlKEV4Y2x1ZGUoKS5leGNsdWRlQmVmb3JlKG5hbWU6OkNvbXBvbmVudChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigKKyAgICAgICAgIlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkYiCisgICAgICAgICJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkYiKSwgMzEpKSk7IC8vIDMxIDB4RkYncworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDIpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjovQSIpCisgICAgLnNldENoaWxkU2VsZWN0b3IoMSkKKyAgICAuc2V0RXhjbHVkZShFeGNsdWRlKCkuZXhjbHVkZUFmdGVyKG5hbWU6OkNvbXBvbmVudChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigKKyAgICAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICAgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAgICAiXHgwMCIpLCAzMykpKTsgLy8gMzMgMHgwMCdzCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEV4YWN0TmFtZTMyKQoreworICBpbnNlcnQoMSwgIm5kbjovQS9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQiIpOyAvLyAzMiAnQidzCisgIGluc2VydCgyLCAibmRuOi9BL0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDIik7IC8vIDMyICdDJ3MKKworICBzdGFydEludGVyZXN0KCJuZG46L0EvQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmluZCgpLCAxKTsKK30KKworLy8vIEB0b2RvIEV4cGVjdGVkIGZhaWx1cmVzLCBuZWVkcyB0byBiZSBmaXhlZCBhcyBwYXJ0IG9mIElzc3VlICMyMTE4CitCT09TVF9BVVRPX1RFU1RfQ0FTRV9FWFBFQ1RFRF9GQUlMVVJFUyhNaW5TdWZmaXhDb21wb25lbnRzMzIsIDIpCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNaW5TdWZmaXhDb21wb25lbnRzMzIpCit7CisgIGluc2VydCgxLCAibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eC9BLzEvMi8zLzQiKTsgLy8gMzIgJ3gncworICBpbnNlcnQoMiwgIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgvQi8xLzIvMyIpOworICBpbnNlcnQoMywgIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgvQy8xLzIiKTsKKyAgaW5zZXJ0KDQsICJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4L0QvMSIpOworICBpbnNlcnQoNSwgIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgvRSIpOworICBpbnNlcnQoNiwgIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgiKTsKKworICBzdGFydEludGVyZXN0KCJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDApOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDYpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgiKQorICAgIC5zZXRDaGlsZFNlbGVjdG9yKDEpCisgICAgLnNldE1pblN1ZmZpeENvbXBvbmVudHMoMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgNik7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldENoaWxkU2VsZWN0b3IoMSkKKyAgICAuc2V0TWluU3VmZml4Q29tcG9uZW50cygyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmluZCgpLCA1KTsKKworICBzdGFydEludGVyZXN0KCJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDMpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDQpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgiKQorICAgIC5zZXRDaGlsZFNlbGVjdG9yKDEpCisgICAgLnNldE1pblN1ZmZpeENvbXBvbmVudHMoNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMyk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldENoaWxkU2VsZWN0b3IoMSkKKyAgICAuc2V0TWluU3VmZml4Q29tcG9uZW50cyg1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmluZCgpLCAyKTsKKworICBzdGFydEludGVyZXN0KCJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IikKKyAgICAuc2V0Q2hpbGRTZWxlY3RvcigxKQorICAgIC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKDYpOworICBCT09TVF9DSEVDS19FUVVBTChmaW5kKCksIDEpOworCisgIHN0YXJ0SW50ZXJlc3QoIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgiKQorICAgIC5zZXRDaGlsZFNlbGVjdG9yKDEpCisgICAgLnNldE1pblN1ZmZpeENvbXBvbmVudHMoNyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMCk7Cit9CisKKy8vLyBAdG9kbyBFeHBlY3RlZCBmYWlsdXJlcywgbmVlZHMgdG8gYmUgZml4ZWQgYXMgcGFydCBvZiBJc3N1ZSAjMjExOAorQk9PU1RfQVVUT19URVNUX0NBU0VfRVhQRUNURURfRkFJTFVSRVMoTWF4U3VmZml4Q29tcG9uZW50czMyLCA1KQorQk9PU1RfQVVUT19URVNUX0NBU0UoTWF4U3VmZml4Q29tcG9uZW50czMyKQoreworICBpbnNlcnQoMSwgIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgvIik7IC8vIDMyICd4J3MKKyAgaW5zZXJ0KDIsICJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4L0EiKTsKKyAgaW5zZXJ0KDMsICJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4L0EvQiIpOworICBpbnNlcnQoNCwgIm5kbjoveHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgvQS9CL0MiKTsKKyAgaW5zZXJ0KDUsICJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4L0EvQi9DL0QiKTsKKyAgaW5zZXJ0KDYsICJuZG46L3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4L0EvQi9DL0QvRSIpOworICAvLyBPcmRlciBpcyA2LDUsNCwzLDIsMSwgYmVjYXVzZSA8MzItb2N0ZXQgaGFzaD4gaXMgZ3JlYXRlciB0aGFuIGEgMS1vY3RldCBjb21wb25lbnQuCisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMCk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMSk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMik7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgMyk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgNCk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgNSk7CisKKyAgc3RhcnRJbnRlcmVzdCgibmRuOi94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIpCisgICAgLnNldE1heFN1ZmZpeENvbXBvbmVudHMoNik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpbmQoKSwgNik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKSAvLyBGaW5kCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEl0ZXJhdG9yKQoreworICBDcyBjczsKKworICBOYW1lIG5hbWVBKCIvQSIpOworICBOYW1lIG5hbWVBQigiL0EvQiIpOworICBOYW1lIG5hbWVBQkMoIi9BL0IvQyIpOworICBOYW1lIG5hbWVEKCIvRCIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzLnNpemUoKSwgMCk7CisgIEJPT1NUX0NIRUNLKGNzLmJlZ2luKCkgPT0gY3MuZW5kKCkpOworCisgIGNzLmluc2VydCgqbWFrZURhdGEobmFtZUFCQykpOworICBCT09TVF9DSEVDS19FUVVBTChjcy5zaXplKCksIDEpOworICBCT09TVF9DSEVDSyhjcy5iZWdpbigpICE9IGNzLmVuZCgpKTsKKyAgQk9PU1RfQ0hFQ0soY3MuYmVnaW4oKS0+Z2V0TmFtZSgpID09IG5hbWVBQkMpOworICBCT09TVF9DSEVDSygoKmNzLmJlZ2luKCkpLmdldE5hbWUoKSA9PSBuYW1lQUJDKTsKKworICBhdXRvIGkgPSBjcy5iZWdpbigpOworICBhdXRvIGogPSBjcy5iZWdpbigpOworICBCT09TVF9DSEVDSygrK2kgPT0gY3MuZW5kKCkpOworICBCT09TVF9DSEVDSyhqKysgPT0gY3MuYmVnaW4oKSk7CisgIEJPT1NUX0NIRUNLKGogPT0gY3MuZW5kKCkpOworCisgIGNzLmluc2VydCgqbWFrZURhdGEobmFtZUEpKTsKKyAgY3MuaW5zZXJ0KCptYWtlRGF0YShuYW1lQUIpKTsKKyAgY3MuaW5zZXJ0KCptYWtlRGF0YShuYW1lRCkpOworCisgIHN0ZDo6c2V0PE5hbWU+IGV4cGVjdGVkID0ge25hbWVBLCBuYW1lQUIsIG5hbWVBQkMsIG5hbWVEfTsKKyAgc3RkOjpzZXQ8TmFtZT4gYWN0dWFsOworICBmb3IgKGNvbnN0IGF1dG8mIGNzRW50cnkgOiBjcykgeworICAgIGFjdHVhbC5pbnNlcnQoY3NFbnRyeS5nZXROYW1lKCkpOworICB9CisgIEJPT1NUX0NIRUNLX0VRVUFMX0NPTExFQ1RJT05TKGFjdHVhbC5iZWdpbigpLCBhY3R1YWwuZW5kKCksIGV4cGVjdGVkLmJlZ2luKCksIGV4cGVjdGVkLmVuZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpIC8vIFRhYmxlQ3MKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9kZWFkLW5vbmNlLWxpc3QuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9kZWFkLW5vbmNlLWxpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGQ1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL2RlYWQtbm9uY2UtbGlzdC5jcHAKQEAgLTAsMCArMSwxNjIgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ0YWJsZS9kZWFkLW5vbmNlLWxpc3QuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2xpbWl0ZWQtaW8uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUYWJsZURlYWROb25jZUxpc3QsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCYXNpYykKK3sKKyAgTmFtZSBuYW1lQSgibmRuOi9BIik7CisgIE5hbWUgbmFtZUIoIm5kbjovQiIpOworICBjb25zdCB1aW50MzJfdCBub25jZTEgPSAweDUzYjRlYWE4OworICBjb25zdCB1aW50MzJfdCBub25jZTIgPSAweDFmNDYzNzJiOworCisgIERlYWROb25jZUxpc3QgZG5sOworICBCT09TVF9DSEVDS19FUVVBTChkbmwuc2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZG5sLmhhcyhuYW1lQSwgbm9uY2UxKSwgZmFsc2UpOworCisgIGRubC5hZGQobmFtZUEsIG5vbmNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGRubC5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChkbmwuaGFzKG5hbWVBLCBub25jZTEpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZG5sLmhhcyhuYW1lQSwgbm9uY2UyKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChkbmwuaGFzKG5hbWVCLCBub25jZTEpLCBmYWxzZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1pbkxpZmV0aW1lKQoreworICBCT09TVF9DSEVDS19USFJPVyhEZWFkTm9uY2VMaXN0IGRubCh0aW1lOjptaWxsaXNlY29uZHM6Onplcm8oKSksIHN0ZDo6aW52YWxpZF9hcmd1bWVudCk7Cit9CisKKy8vLyBBIEZpeHR1cmUgdGhhdCBwZXJpb2RpY2FsbHkgaW5zZXJ0cyBOb25jZXMKK2NsYXNzIFBlcmlvZGljYWxJbnNlcnRpb25GaXh0dXJlIDogcHVibGljIEJhc2VGaXh0dXJlCit7Citwcm90ZWN0ZWQ6CisgIFBlcmlvZGljYWxJbnNlcnRpb25GaXh0dXJlKCkKKyAgICA6IGRubChMSUZFVElNRSkKKyAgICAsIG5hbWUoIm5kbjovTiIpCisgICAgLCBhZGROb25jZUJhdGNoKDApCisgICAgLCBhZGROb25jZUludGVydmFsKExJRkVUSU1FIC8gRGVhZE5vbmNlTGlzdDo6RVhQRUNURURfTUFSS19DT1VOVCkKKyAgeworICAgIHRoaXMtPmFkZE5vbmNlKCk7CisgIH0KKworICB+UGVyaW9kaWNhbEluc2VydGlvbkZpeHR1cmUoKQorICB7CisgICAgc2NoZWR1bGVyOjpjYW5jZWwoYWRkTm9uY2VFdmVudCk7CisgIH0KKworICB2b2lkCisgIHNldFJhdGUoc2l6ZV90IG5Ob25jZXNQZXJMaWZldGltZSkKKyAgeworICAgIGFkZE5vbmNlQmF0Y2ggPSBuTm9uY2VzUGVyTGlmZXRpbWUgLyBEZWFkTm9uY2VMaXN0OjpFWFBFQ1RFRF9NQVJLX0NPVU5UOworICB9CisKKyAgdm9pZAorICBhZGROb25jZSgpCisgIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFkZE5vbmNlQmF0Y2g7ICsraSkgeworICAgICAgZG5sLmFkZChuYW1lLCArK2xhc3ROb25jZSk7CisgICAgfQorCisgICAgc2NoZWR1bGVyOjpjYW5jZWwoYWRkTm9uY2VFdmVudCk7IC8vIGF2b2lkIGRvdWJsZSBzY2hlZHVsZXMKKyAgICBpZiAoYWRkTm9uY2VJbnRlcnZhbCA+IHRpbWU6Om5hbm9zZWNvbmRzOjp6ZXJvKCkpIHsKKyAgICAgIGFkZE5vbmNlRXZlbnQgPSBzY2hlZHVsZXI6OnNjaGVkdWxlKGFkZE5vbmNlSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZQZXJpb2RpY2FsSW5zZXJ0aW9uRml4dHVyZTo6YWRkTm9uY2UsIHRoaXMpKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3QgdGltZTo6bmFub3NlY29uZHMgTElGRVRJTUU7CisgIERlYWROb25jZUxpc3QgZG5sOworICBOYW1lIG5hbWU7CisgIHVpbnQzMl90IGxhc3ROb25jZTsKKyAgc2l6ZV90IGFkZE5vbmNlQmF0Y2g7CisgIHRpbWU6Om5hbm9zZWNvbmRzIGFkZE5vbmNlSW50ZXJ2YWw7CisgIHNjaGVkdWxlcjo6RXZlbnRJZCBhZGROb25jZUV2ZW50OworfTsKK2NvbnN0IHRpbWU6Om5hbm9zZWNvbmRzIFBlcmlvZGljYWxJbnNlcnRpb25GaXh0dXJlOjpMSUZFVElNRSA9IHRpbWU6Om1pbGxpc2Vjb25kcygyMDApOworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShMaWZldGltZSwgUGVyaW9kaWNhbEluc2VydGlvbkZpeHR1cmUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGRubC5nZXRMaWZldGltZSgpLCBMSUZFVElNRSk7CisKKyAgTGltaXRlZElvIGxpbWl0ZWRJbzsKKworICBjb25zdCBpbnQgUkFURSA9IERlYWROb25jZUxpc3Q6OklOSVRJQUxfQ0FQQUNJVFkgLyAyOworICB0aGlzLT5zZXRSYXRlKFJBVEUpOworICBsaW1pdGVkSW8uZGVmZXIoTElGRVRJTUUgKiAxMCk7CisKKyAgTmFtZSBuYW1lQygibmRuOi9DIik7CisgIGNvbnN0IHVpbnQzMl90IG5vbmNlQyA9IDB4MjUzOTA2NTY7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGRubC5oYXMobmFtZUMsIG5vbmNlQyksIGZhbHNlKTsKKyAgZG5sLmFkZChuYW1lQywgbm9uY2VDKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZG5sLmhhcyhuYW1lQywgbm9uY2VDKSwgdHJ1ZSk7CisKKyAgbGltaXRlZElvLmRlZmVyKExJRkVUSU1FIC8gMik7IC8vIC01MCUsIGVudHJ5IHNob3VsZCBleGlzdAorICBCT09TVF9DSEVDS19FUVVBTChkbmwuaGFzKG5hbWVDLCBub25jZUMpLCB0cnVlKTsKKworICBsaW1pdGVkSW8uZGVmZXIoTElGRVRJTUUpOyAvLyArNTAlLCBlbnRyeSBzaG91bGQgYmUgZ29uZQorICBCT09TVF9DSEVDS19FUVVBTChkbmwuaGFzKG5hbWVDLCBub25jZUMpLCBmYWxzZSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKENhcGFjaXR5RG93biwgUGVyaW9kaWNhbEluc2VydGlvbkZpeHR1cmUpCit7CisgIExpbWl0ZWRJbyBsaW1pdGVkSW87CisKKyAgc3NpemVfdCBjYXAwID0gZG5sLm1fY2FwYWNpdHk7CisKKyAgY29uc3QgaW50IFJBVEUgPSBEZWFkTm9uY2VMaXN0OjpJTklUSUFMX0NBUEFDSVRZIC8gMzsKKyAgdGhpcy0+c2V0UmF0ZShSQVRFKTsKKyAgbGltaXRlZElvLmRlZmVyKExJRkVUSU1FICogMTApOworCisgIHNzaXplX3QgY2FwMSA9IGRubC5tX2NhcGFjaXR5OworICBCT09TVF9DSEVDS19MVChzdGQ6OmFicyhjYXAxIC0gUkFURSksIHN0ZDo6YWJzKGNhcDAgLSBSQVRFKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKENhcGFjaXR5VXAsIFBlcmlvZGljYWxJbnNlcnRpb25GaXh0dXJlKQoreworICBMaW1pdGVkSW8gbGltaXRlZElvOworCisgIHNzaXplX3QgY2FwMCA9IGRubC5tX2NhcGFjaXR5OworCisgIGNvbnN0IGludCBSQVRFID0gRGVhZE5vbmNlTGlzdDo6SU5JVElBTF9DQVBBQ0lUWSAqIDM7CisgIHRoaXMtPnNldFJhdGUoUkFURSk7CisgIGxpbWl0ZWRJby5kZWZlcihMSUZFVElNRSAqIDEwKTsKKworICBzc2l6ZV90IGNhcDEgPSBkbmwubV9jYXBhY2l0eTsKKyAgQk9PU1RfQ0hFQ0tfTFQoc3RkOjphYnMoY2FwMSAtIFJBVEUpLCBzdGQ6OmFicyhjYXAwIC0gUkFURSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9maWIuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9maWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTA4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL2ZpYi5jcHAKQEAgLTAsMCArMSw0MzYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ0YWJsZS9maWIuaHBwIgorI2luY2x1ZGUgInRlc3RzL2RhZW1vbi9mYWNlL2R1bW15LWZhY2UuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUYWJsZUZpYiwgQmFzZUZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVudHJ5KQoreworICBOYW1lIHByZWZpeCgibmRuOi9weFdoZkZ6YSIpOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UxID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworICBzaGFyZWRfcHRyPEZhY2U+IGZhY2UyID0gbWFrZV9zaGFyZWQ8RHVtbXlGYWNlPigpOworCisgIGZpYjo6RW50cnkgZW50cnkocHJlZml4KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkuZ2V0UHJlZml4KCksIHByZWZpeCk7CisKKyAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHMxID0gZW50cnkuZ2V0TmV4dEhvcHMoKTsKKyAgLy8gW10KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHMxLnNpemUoKSwgMCk7CisKKyAgZW50cnkuYWRkTmV4dEhvcChmYWNlMSwgMjApOworICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBuZXh0aG9wczIgPSBlbnRyeS5nZXROZXh0SG9wcygpOworICAvLyBbKGZhY2UxLDIwKV0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHMyLnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5leHRob3BzMi5iZWdpbigpLT5nZXRGYWNlKCksIGZhY2UxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHMyLmJlZ2luKCktPmdldENvc3QoKSwgMjApOworCisgIGVudHJ5LmFkZE5leHRIb3AoZmFjZTEsIDMwKTsKKyAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHMzID0gZW50cnkuZ2V0TmV4dEhvcHMoKTsKKyAgLy8gWyhmYWNlMSwzMCldCisgIEJPT1NUX0NIRUNLX0VRVUFMKG5leHRob3BzMy5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChuZXh0aG9wczMuYmVnaW4oKS0+Z2V0RmFjZSgpLCBmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5leHRob3BzMy5iZWdpbigpLT5nZXRDb3N0KCksIDMwKTsKKworICBlbnRyeS5hZGROZXh0SG9wKGZhY2UyLCA0MCk7CisgIGNvbnN0IGZpYjo6TmV4dEhvcExpc3QmIG5leHRob3BzNCA9IGVudHJ5LmdldE5leHRIb3BzKCk7CisgIC8vIFsoZmFjZTEsMzApLCAoZmFjZTIsNDApXQorICBCT09TVF9DSEVDS19FUVVBTChuZXh0aG9wczQuc2l6ZSgpLCAyKTsKKyAgaW50IGkgPSAtMTsKKyAgZm9yIChmaWI6Ok5leHRIb3BMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IG5leHRob3BzNC5iZWdpbigpOworICAgIGl0ICE9IG5leHRob3BzNC5lbmQoKTsgKytpdCkgeworICAgICsraTsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgIGNhc2UgMCA6CisgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGl0LT5nZXRGYWNlKCksIGZhY2UxKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXQtPmdldENvc3QoKSwgMzApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSA6CisgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGl0LT5nZXRGYWNlKCksIGZhY2UyKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXQtPmdldENvc3QoKSwgNDApOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBlbnRyeS5hZGROZXh0SG9wKGZhY2UyLCAxMCk7CisgIGNvbnN0IGZpYjo6TmV4dEhvcExpc3QmIG5leHRob3BzNSA9IGVudHJ5LmdldE5leHRIb3BzKCk7CisgIC8vIFsoZmFjZTIsMTApLCAoZmFjZTEsMzApXQorICBCT09TVF9DSEVDS19FUVVBTChuZXh0aG9wczUuc2l6ZSgpLCAyKTsKKyAgaSA9IC0xOworICBmb3IgKGZpYjo6TmV4dEhvcExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmV4dGhvcHM1LmJlZ2luKCk7CisgICAgaXQgIT0gbmV4dGhvcHM1LmVuZCgpOyArK2l0KSB7CisgICAgKytpOworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAwIDoKKyAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXQtPmdldEZhY2UoKSwgZmFjZTIpOworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChpdC0+Z2V0Q29zdCgpLCAxMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxIDoKKyAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXQtPmdldEZhY2UoKSwgZmFjZTEpOworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChpdC0+Z2V0Q29zdCgpLCAzMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGVudHJ5LnJlbW92ZU5leHRIb3AoZmFjZTEpOworICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBuZXh0aG9wczYgPSBlbnRyeS5nZXROZXh0SG9wcygpOworICAvLyBbKGZhY2UyLDEwKV0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHM2LnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5leHRob3BzNi5iZWdpbigpLT5nZXRGYWNlKCksIGZhY2UyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHM2LmJlZ2luKCktPmdldENvc3QoKSwgMTApOworCisgIGVudHJ5LnJlbW92ZU5leHRIb3AoZmFjZTEpOworICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBuZXh0aG9wczcgPSBlbnRyeS5nZXROZXh0SG9wcygpOworICAvLyBbKGZhY2UyLDEwKV0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHM3LnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5leHRob3BzNy5iZWdpbigpLT5nZXRGYWNlKCksIGZhY2UyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHM3LmJlZ2luKCktPmdldENvc3QoKSwgMTApOworCisgIGVudHJ5LnJlbW92ZU5leHRIb3AoZmFjZTIpOworICBjb25zdCBmaWI6Ok5leHRIb3BMaXN0JiBuZXh0aG9wczggPSBlbnRyeS5nZXROZXh0SG9wcygpOworICAvLyBbXQorICBCT09TVF9DSEVDS19FUVVBTChuZXh0aG9wczguc2l6ZSgpLCAwKTsKKworICBlbnRyeS5yZW1vdmVOZXh0SG9wKGZhY2UyKTsKKyAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHM5ID0gZW50cnkuZ2V0TmV4dEhvcHMoKTsKKyAgLy8gW10KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobmV4dGhvcHM5LnNpemUoKSwgMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEluc2VydF9Mb25nZXN0UHJlZml4TWF0Y2gpCit7CisgIE5hbWUgbmFtZUVtcHR5OworICBOYW1lIG5hbWVBICAgKCJuZG46L0EiKTsKKyAgTmFtZSBuYW1lQUIgICgibmRuOi9BL0IiKTsKKyAgTmFtZSBuYW1lQUJDICgibmRuOi9BL0IvQyIpOworICBOYW1lIG5hbWVBQkNEKCJuZG46L0EvQi9DL0QiKTsKKyAgTmFtZSBuYW1lRSAgICgibmRuOi9FIik7CisKKyAgc3RkOjpwYWlyPHNoYXJlZF9wdHI8ZmliOjpFbnRyeT4sIGJvb2w+IGluc2VydFJlczsKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBlbnRyeTsKKworICBOYW1lVHJlZSBuYW1lVHJlZTsKKyAgRmliIGZpYihuYW1lVHJlZSk7CisgIC8vIFtdCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpYi5zaXplKCksIDApOworCisgIGVudHJ5ID0gZmliLmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZUEpOworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSk7IC8vIHRoZSBlbXB0eSBlbnRyeQorCisgIGluc2VydFJlcyA9IGZpYi5pbnNlcnQobmFtZUVtcHR5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzLnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluc2VydFJlcy5maXJzdC0+Z2V0UHJlZml4KCksIG5hbWVFbXB0eSk7CisgIC8vIFsnLyddCisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpYi5zaXplKCksIDEpOworCisgIGVudHJ5ID0gZmliLmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZUEpOworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KGVudHJ5KSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LT5nZXRQcmVmaXgoKSwgbmFtZUVtcHR5KTsKKworICBpbnNlcnRSZXMgPSBmaWIuaW5zZXJ0KG5hbWVBKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzLnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluc2VydFJlcy5maXJzdC0+Z2V0UHJlZml4KCksIG5hbWVBKTsKKyAgLy8gWycvJywgJy9BJ10KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmliLnNpemUoKSwgMik7CisKKyAgaW5zZXJ0UmVzID0gZmliLmluc2VydChuYW1lQSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluc2VydFJlcy5zZWNvbmQsIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzLmZpcnN0LT5nZXRQcmVmaXgoKSwgbmFtZUEpOworICAvLyBbJy8nLCAnL0EnXQorICBCT09TVF9DSEVDS19FUVVBTChmaWIuc2l6ZSgpLCAyKTsKKworICBlbnRyeSA9IGZpYi5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVBKTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS0+Z2V0UHJlZml4KCksIG5hbWVBKTsKKworICBlbnRyeSA9IGZpYi5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVBQkNEKTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS0+Z2V0UHJlZml4KCksIG5hbWVBKTsKKworICBpbnNlcnRSZXMgPSBmaWIuaW5zZXJ0KG5hbWVBQkMpOworICBCT09TVF9DSEVDS19FUVVBTChpbnNlcnRSZXMuc2Vjb25kLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzLmZpcnN0LT5nZXRQcmVmaXgoKSwgbmFtZUFCQyk7CisgIC8vIFsnLycsICcvQScsICcvQS9CL0MnXQorICBCT09TVF9DSEVDS19FUVVBTChmaWIuc2l6ZSgpLCAzKTsKKworICBlbnRyeSA9IGZpYi5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVBKTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS0+Z2V0UHJlZml4KCksIG5hbWVBKTsKKworICBlbnRyeSA9IGZpYi5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVBQik7CisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnktPmdldFByZWZpeCgpLCBuYW1lQSk7CisKKyAgZW50cnkgPSBmaWIuZmluZExvbmdlc3RQcmVmaXhNYXRjaChuYW1lQUJDRCk7CisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4oZW50cnkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnktPmdldFByZWZpeCgpLCBuYW1lQUJDKTsKKworICBlbnRyeSA9IGZpYi5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVFKTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS0+Z2V0UHJlZml4KCksIG5hbWVFbXB0eSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFJlbW92ZU5leHRIb3BGcm9tQWxsRW50cmllcykKK3sKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlMiA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgTmFtZSBuYW1lRW1wdHkoIm5kbjovIik7CisgIE5hbWUgbmFtZUEoIm5kbjovQSIpOworICBOYW1lIG5hbWVCKCJuZG46L0IiKTsKKworICBzdGQ6OnBhaXI8c2hhcmVkX3B0cjxmaWI6OkVudHJ5PiwgYm9vbD4gaW5zZXJ0UmVzOworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5OworCisgIE5hbWVUcmVlIG5hbWVUcmVlOworICBGaWIgZmliKG5hbWVUcmVlKTsKKyAgLy8ge30KKworICBpbnNlcnRSZXMgPSBmaWIuaW5zZXJ0KG5hbWVBKTsKKyAgaW5zZXJ0UmVzLmZpcnN0LT5hZGROZXh0SG9wKGZhY2UxLCAwKTsKKyAgaW5zZXJ0UmVzLmZpcnN0LT5hZGROZXh0SG9wKGZhY2UyLCAwKTsKKyAgLy8geycvQSc6WzEsMl19CisKKyAgaW5zZXJ0UmVzID0gZmliLmluc2VydChuYW1lQik7CisgIGluc2VydFJlcy5maXJzdC0+YWRkTmV4dEhvcChmYWNlMSwgMCk7CisgIC8vIHsnL0EnOlsxLDJdLCAnL0InOlsxXX0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmliLnNpemUoKSwgMik7CisKKyAgaW5zZXJ0UmVzID0gZmliLmluc2VydCgiL0MiKTsKKyAgaW5zZXJ0UmVzLmZpcnN0LT5hZGROZXh0SG9wKGZhY2UyLCAxKTsKKyAgLy8geycvQSc6WzEsMl0sICcvQic6WzFdLCAnL0MnOlsyXX0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmliLnNpemUoKSwgMyk7CisKKyAgaW5zZXJ0UmVzID0gZmliLmluc2VydCgiL0IvMSIpOworICBpbnNlcnRSZXMuZmlyc3QtPmFkZE5leHRIb3AoZmFjZTEsIDApOworICAvLyB7Jy9BJzpbMSwyXSwgJy9CJzpbMV0sICcvQi8xJzpbMV0sICcvQyc6WzJdfQorICBCT09TVF9DSEVDS19FUVVBTChmaWIuc2l6ZSgpLCA0KTsKKworICBpbnNlcnRSZXMgPSBmaWIuaW5zZXJ0KCIvQi8xLzIiKTsKKyAgaW5zZXJ0UmVzLmZpcnN0LT5hZGROZXh0SG9wKGZhY2UxLCAwKTsKKyAgLy8geycvQSc6WzEsMl0sICcvQic6WzFdLCAnL0IvMSc6WzFdLCAnL0IvMS8yJzpbMV0sICcvQyc6WzJdfQorICBCT09TVF9DSEVDS19FUVVBTChmaWIuc2l6ZSgpLCA1KTsKKworICBpbnNlcnRSZXMgPSBmaWIuaW5zZXJ0KCIvQi8xLzIvMyIpOworICBpbnNlcnRSZXMuZmlyc3QtPmFkZE5leHRIb3AoZmFjZTEsIDApOworICAvLyB7Jy9BJzpbMSwyXSwgJy9CJzpbMV0sICcvQi8xJzpbMV0sICcvQi8xLzInOlsxXSwgJy9CLzEvMyc6WzFdLCAnL0MnOlsyXX0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmliLnNpemUoKSwgNik7CisKKyAgaW5zZXJ0UmVzID0gZmliLmluc2VydCgiL0IvMS8yLzMvNCIpOworICBpbnNlcnRSZXMuZmlyc3QtPmFkZE5leHRIb3AoZmFjZTEsIDApOworICAvLyB7Jy9BJzpbMSwyXSwgJy9CJzpbMV0sICcvQi8xJzpbMV0sICcvQi8xLzInOlsxXSwgJy9CLzEvMi8zJzpbMV0sICcvQi8xLzIvMy80JzpbMV0sICcvQyc6WzJdfQorICBCT09TVF9DSEVDS19FUVVBTChmaWIuc2l6ZSgpLCA3KTsKKworICAvLy8vLy8vLy8vLy8vCisKKyAgZmliLnJlbW92ZU5leHRIb3BGcm9tQWxsRW50cmllcyhmYWNlMSk7CisgIC8vIHsnL0EnOlsyXSwgJy9DJzpbMl19CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZpYi5zaXplKCksIDIpOworCisgIGVudHJ5ID0gZmliLmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZUEpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS0+Z2V0UHJlZml4KCksIG5hbWVBKTsKKyAgY29uc3QgZmliOjpOZXh0SG9wTGlzdCYgbmV4dGhvcHNBID0gZW50cnktPmdldE5leHRIb3BzKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5leHRob3BzQS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChuZXh0aG9wc0EuYmVnaW4oKS0+Z2V0RmFjZSgpLCBmYWNlMik7CisKKyAgZW50cnkgPSBmaWIuZmluZExvbmdlc3RQcmVmaXhNYXRjaChuYW1lQik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LT5nZXRQcmVmaXgoKSwgbmFtZUVtcHR5KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmVtb3ZlTmV4dEhvcEZyb21NYW55RW50cmllcykKK3sKKyAgTmFtZVRyZWUgbmFtZVRyZWUoMTYpOworICBGaWIgZmliKG5hbWVUcmVlKTsKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKworICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgMzAwOyArK2kpIHsKKyAgICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZmliLmluc2VydChOYW1lKCIvUCIpLmFwcGVuZFZlcnNpb24oaSkpLmZpcnN0OworICAgIGVudHJ5LT5hZGROZXh0SG9wKGZhY2UxLCAwKTsKKyAgfQorICBCT09TVF9DSEVDS19FUVVBTChmaWIuc2l6ZSgpLCAzMDApOworCisgIGZpYi5yZW1vdmVOZXh0SG9wRnJvbUFsbEVudHJpZXMoZmFjZTEpOworICBCT09TVF9DSEVDS19FUVVBTChmaWIuc2l6ZSgpLCAwKTsKK30KKwordm9pZAordmFsaWRhdGVGaW5kRXhhY3RNYXRjaChjb25zdCBGaWImIGZpYiwgY29uc3QgTmFtZSYgdGFyZ2V0KQoreworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZmliLmZpbmRFeGFjdE1hdGNoKHRhcmdldCk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpCisgICAgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnktPmdldFByZWZpeCgpLCB0YXJnZXQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEJPT1NUX0ZBSUwoIk5vIGVudHJ5IGZvdW5kIGZvciAiIDw8IHRhcmdldCk7CisgICAgfQorfQorCit2b2lkCit2YWxpZGF0ZU5vRXhhY3RNYXRjaChjb25zdCBGaWImIGZpYiwgY29uc3QgTmFtZSYgdGFyZ2V0KQoreworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZmliLmZpbmRFeGFjdE1hdGNoKHRhcmdldCk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpCisgICAgeworICAgICAgQk9PU1RfRkFJTCgiRm91bmQgdW5leHBlY3RlZCBlbnRyeSBmb3IgIiA8PCB0YXJnZXQpOworICAgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRmluZEV4YWN0TWF0Y2gpCit7CisgIE5hbWVUcmVlIG5hbWVUcmVlOworICBGaWIgZmliKG5hbWVUcmVlKTsKKyAgZmliLmluc2VydCgiL0EiKTsKKyAgZmliLmluc2VydCgiL0EvQiIpOworICBmaWIuaW5zZXJ0KCIvQS9CL0MiKTsKKworICB2YWxpZGF0ZUZpbmRFeGFjdE1hdGNoKGZpYiwgIi9BIik7CisgIHZhbGlkYXRlRmluZEV4YWN0TWF0Y2goZmliLCAiL0EvQiIpOworICB2YWxpZGF0ZUZpbmRFeGFjdE1hdGNoKGZpYiwgIi9BL0IvQyIpOworICB2YWxpZGF0ZU5vRXhhY3RNYXRjaChmaWIsICIvIik7CisKKyAgdmFsaWRhdGVOb0V4YWN0TWF0Y2goZmliLCAiL2RvZXMvbm90L2V4aXN0Iik7CisKKyAgTmFtZVRyZWUgZ2FwTmFtZVRyZWU7CisgIEZpYiBnYXBGaWIobmFtZVRyZWUpOworICBmaWIuaW5zZXJ0KCIvWCIpOworICBmaWIuaW5zZXJ0KCIvWC9ZL1oiKTsKKworICB2YWxpZGF0ZU5vRXhhY3RNYXRjaChnYXBGaWIsICIvWC9ZIik7CisKKyAgTmFtZVRyZWUgZW1wdHlOYW1lVHJlZTsKKyAgRmliIGVtcHR5RmliKGVtcHR5TmFtZVRyZWUpOworICB2YWxpZGF0ZU5vRXhhY3RNYXRjaChlbXB0eUZpYiwgIi9ub3RoaW5nL2hlcmUiKTsKK30KKwordm9pZAordmFsaWRhdGVFcmFzZShGaWImIGZpYiwgY29uc3QgTmFtZSYgdGFyZ2V0KQoreworICBmaWIuZXJhc2UodGFyZ2V0KTsKKworICBzaGFyZWRfcHRyPGZpYjo6RW50cnk+IGVudHJ5ID0gZmliLmZpbmRFeGFjdE1hdGNoKHRhcmdldCk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPihlbnRyeSkpCisgICAgeworICAgICAgQk9PU1RfRkFJTCgiRm91bmQgXCJyZW1vdmVkXCIgZW50cnkgZm9yICIgPDwgdGFyZ2V0KTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVyYXNlKQoreworICBOYW1lVHJlZSBlbXB0eU5hbWVUcmVlOworICBGaWIgZW1wdHlGaWIoZW1wdHlOYW1lVHJlZSk7CisKKyAgZW1wdHlGaWIuZXJhc2UoIi9kb2VzL25vdC9leGlzdCIpOyAvLyBjcmFzaCB0ZXN0CisKKyAgdmFsaWRhdGVFcmFzZShlbXB0eUZpYiwgIi8iKTsKKworICBlbXB0eUZpYi5lcmFzZSgiL3N0aWxsL2RvZXMvbm90L2V4aXN0Iik7IC8vIGNyYXNoIHRlc3QKKworICBOYW1lVHJlZSBuYW1lVHJlZTsKKyAgRmliIGZpYihuYW1lVHJlZSk7CisgIGZpYi5pbnNlcnQoIi8iKTsKKyAgZmliLmluc2VydCgiL0EiKTsKKyAgZmliLmluc2VydCgiL0EvQiIpOworICBmaWIuaW5zZXJ0KCIvQS9CL0MiKTsKKworICAvLyBjaGVjayBpZiB3ZSByZW1vdmUgdGhlIHJpZ2h0IHRoaW5nIGFuZCBsZWF2ZQorICAvLyBldmVyeXRoaW5nIGVsc2UgYWxvbmUKKworICB2YWxpZGF0ZUVyYXNlKGZpYiwgIi9BL0IiKTsKKyAgdmFsaWRhdGVGaW5kRXhhY3RNYXRjaChmaWIsICIvQSIpOworICB2YWxpZGF0ZUZpbmRFeGFjdE1hdGNoKGZpYiwgIi9BL0IvQyIpOworICB2YWxpZGF0ZUZpbmRFeGFjdE1hdGNoKGZpYiwgIi8iKTsKKworICB2YWxpZGF0ZUVyYXNlKGZpYiwgIi9BL0IvQyIpOworICB2YWxpZGF0ZUZpbmRFeGFjdE1hdGNoKGZpYiwgIi9BIik7CisgIHZhbGlkYXRlRmluZEV4YWN0TWF0Y2goZmliLCAiLyIpOworCisgIHZhbGlkYXRlRXJhc2UoZmliLCAiL0EiKTsKKyAgdmFsaWRhdGVGaW5kRXhhY3RNYXRjaChmaWIsICIvIik7CisKKyAgdmFsaWRhdGVFcmFzZShmaWIsICIvIik7CisgIHZhbGlkYXRlTm9FeGFjdE1hdGNoKGZpYiwgIi8iKTsKKworICBOYW1lVHJlZSBnYXBOYW1lVHJlZTsKKyAgRmliIGdhcEZpYihnYXBOYW1lVHJlZSk7CisgIGdhcEZpYi5pbnNlcnQoIi9YIik7CisgIGdhcEZpYi5pbnNlcnQoIi9YL1kvWiIpOworCisgIGdhcEZpYi5lcmFzZSgiL1gvWSIpOyAvL3Nob3VsZCBkbyBub3RoaW5nCisgIHZhbGlkYXRlRmluZEV4YWN0TWF0Y2goZ2FwRmliLCAiL1giKTsKKyAgdmFsaWRhdGVGaW5kRXhhY3RNYXRjaChnYXBGaWIsICIvWC9ZL1oiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRXJhc2VOYW1lVHJlZUVudHJ5KQoreworICBOYW1lVHJlZSBuYW1lVHJlZTsKKyAgRmliIGZpYihuYW1lVHJlZSk7CisgIHNpemVfdCBuTmFtZVRyZWVFbnRyaWVzQmVmb3JlID0gbmFtZVRyZWUuc2l6ZSgpOworCisgIGZpYi5pbnNlcnQoIm5kbjovQS9CL0MiKTsKKyAgZmliLmVyYXNlKCJuZG46L0EvQi9DIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5hbWVUcmVlLnNpemUoKSwgbk5hbWVUcmVlRW50cmllc0JlZm9yZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEl0ZXJhdG9yKQoreworICBOYW1lVHJlZSBuYW1lVHJlZTsKKyAgRmliIGZpYihuYW1lVHJlZSk7CisgIE5hbWUgbmFtZUEoIi9BIik7CisgIE5hbWUgbmFtZUFCKCIvQS9CIik7CisgIE5hbWUgbmFtZUFCQygiL0EvQi9DIik7CisgIE5hbWUgbmFtZVJvb3QoIi8iKTsKKworICBmaWIuaW5zZXJ0KG5hbWVBKTsKKyAgZmliLmluc2VydChuYW1lQUIpOworICBmaWIuaW5zZXJ0KG5hbWVBQkMpOworICBmaWIuaW5zZXJ0KG5hbWVSb290KTsKKworICBzdGQ6OnNldDxOYW1lPiBleHBlY3RlZDsKKyAgZXhwZWN0ZWQuaW5zZXJ0KG5hbWVBKTsKKyAgZXhwZWN0ZWQuaW5zZXJ0KG5hbWVBQik7CisgIGV4cGVjdGVkLmluc2VydChuYW1lQUJDKTsKKyAgZXhwZWN0ZWQuaW5zZXJ0KG5hbWVSb290KTsKKworICBmb3IgKEZpYjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmaWIuYmVnaW4oKTsgaXQgIT0gZmliLmVuZCgpOyBpdCsrKQorICB7CisgICAgYm9vbCBpc0luU2V0ID0gZXhwZWN0ZWQuZmluZChpdC0+Z2V0UHJlZml4KCkpICE9IGV4cGVjdGVkLmVuZCgpOworICAgIEJPT1NUX0NIRUNLKGlzSW5TZXQpOworICAgIGV4cGVjdGVkLmVyYXNlKGl0LT5nZXRQcmVmaXgoKSk7CisgIH0KKworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZC5zaXplKCksIDApOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9tZWFzdXJlbWVudHMtYWNjZXNzb3IuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9tZWFzdXJlbWVudHMtYWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjgzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy1hY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ0YWJsZS9tZWFzdXJlbWVudHMtYWNjZXNzb3IuaHBwIgorI2luY2x1ZGUgImZ3L3N0cmF0ZWd5LmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICIuLi9mdy9kdW1teS1zdHJhdGVneS5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRhYmxlTWVhc3VyZW1lbnRzQWNjZXNzb3IsIEJhc2VGaXh0dXJlKQorCitjbGFzcyBNZWFzdXJlbWVudHNBY2Nlc3NvclRlc3RTdHJhdGVneSA6IHB1YmxpYyBEdW1teVN0cmF0ZWd5Cit7CitwdWJsaWM6CisgIE1lYXN1cmVtZW50c0FjY2Vzc29yVGVzdFN0cmF0ZWd5KEZvcndhcmRlciYgZm9yd2FyZGVyLCBjb25zdCBOYW1lJiBuYW1lKQorICAgIDogRHVtbXlTdHJhdGVneShmb3J3YXJkZXIsIG5hbWUpCisgIHsKKyAgfQorCisgIHZpcnR1YWwKKyAgfk1lYXN1cmVtZW50c0FjY2Vzc29yVGVzdFN0cmF0ZWd5KCkKKyAgeworICB9CisKK3B1YmxpYzogLy8gYWNjZXNzb3JzCisgIE1lYXN1cmVtZW50c0FjY2Vzc29yJgorICBnZXRNZWFzdXJlbWVudHNfYWNjZXNzb3IoKQorICB7CisgICAgcmV0dXJuIHRoaXMtPmdldE1lYXN1cmVtZW50cygpOworICB9Cit9OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShBY2Nlc3MpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisKKyAgYXV0byBzdHJhdGVneTEgPSBtYWtlX3NoYXJlZDxNZWFzdXJlbWVudHNBY2Nlc3NvclRlc3RTdHJhdGVneT4ocmVmKGZvcndhcmRlciksICJuZG46L3N0cmF0ZWd5MSIpOworICBhdXRvIHN0cmF0ZWd5MiA9IG1ha2Vfc2hhcmVkPE1lYXN1cmVtZW50c0FjY2Vzc29yVGVzdFN0cmF0ZWd5PihyZWYoZm9yd2FyZGVyKSwgIm5kbjovc3RyYXRlZ3kyIik7CisKKyAgTmFtZSBuYW1lUm9vdCgibmRuOi8iKTsKKyAgTmFtZSBuYW1lQSAgICgibmRuOi9BIik7CisgIE5hbWUgbmFtZUFCICAoIm5kbjovQS9CIik7CisgIE5hbWUgbmFtZUFCQyAoIm5kbjovQS9CL0MiKTsKKyAgTmFtZSBuYW1lQUQgICgibmRuOi9BL0QiKTsKKworICBTdHJhdGVneUNob2ljZSYgc3RyYXRlZ3lDaG9pY2UgPSBmb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKyAgc3RyYXRlZ3lDaG9pY2UuaW5zdGFsbChzdHJhdGVneTEpOworICBzdHJhdGVneUNob2ljZS5pbnN0YWxsKHN0cmF0ZWd5Mik7CisgIHN0cmF0ZWd5Q2hvaWNlLmluc2VydChuYW1lUm9vdCwgc3RyYXRlZ3kxLT5nZXROYW1lKCkpOworICBzdHJhdGVneUNob2ljZS5pbnNlcnQobmFtZUEgICAsIHN0cmF0ZWd5Mi0+Z2V0TmFtZSgpKTsKKyAgc3RyYXRlZ3lDaG9pY2UuaW5zZXJ0KG5hbWVBQiAgLCBzdHJhdGVneTEtPmdldE5hbWUoKSk7CisKKyAgTWVhc3VyZW1lbnRzQWNjZXNzb3ImIGFjY2Vzc29yMSA9IHN0cmF0ZWd5MS0+Z2V0TWVhc3VyZW1lbnRzX2FjY2Vzc29yKCk7CisgIE1lYXN1cmVtZW50c0FjY2Vzc29yJiBhY2Nlc3NvcjIgPSBzdHJhdGVneTItPmdldE1lYXN1cmVtZW50c19hY2Nlc3NvcigpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PGJvb2w+KGFjY2Vzc29yMS5nZXQobmFtZVJvb3QpKSwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PGJvb2w+KGFjY2Vzc29yMS5nZXQobmFtZUEgICApKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihhY2Nlc3NvcjEuZ2V0KG5hbWVBQiAgKSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihhY2Nlc3NvcjEuZ2V0KG5hbWVBQkMgKSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihhY2Nlc3NvcjEuZ2V0KG5hbWVBRCAgKSksIGZhbHNlKTsKKworICBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+IGVudHJ5Um9vdCA9IGZvcndhcmRlci5nZXRNZWFzdXJlbWVudHMoKS5nZXQobmFtZVJvb3QpOworICBCT09TVF9DSEVDS19OT19USFJPVyhhY2Nlc3NvcjEuZ2V0UGFyZW50KCplbnRyeVJvb3QpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihhY2Nlc3NvcjIuZ2V0KG5hbWVSb290KSksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdGljX2Nhc3Q8Ym9vbD4oYWNjZXNzb3IyLmdldChuYW1lQSAgICkpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RhdGljX2Nhc3Q8Ym9vbD4oYWNjZXNzb3IyLmdldChuYW1lQUIgICkpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHN0YXRpY19jYXN0PGJvb2w+KGFjY2Vzc29yMi5nZXQobmFtZUFCQyApKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChzdGF0aWNfY2FzdDxib29sPihhY2Nlc3NvcjIuZ2V0KG5hbWVBRCAgKSksIHRydWUpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9tZWFzdXJlbWVudHMuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9tZWFzdXJlbWVudHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjU0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL21lYXN1cmVtZW50cy5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ0YWJsZS9tZWFzdXJlbWVudHMuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInRlc3RzL2xpbWl0ZWQtaW8uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUYWJsZU1lYXN1cmVtZW50cywgQmFzZUZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEdldF9QYXJlbnQpCit7CisgIE5hbWVUcmVlIG5hbWVUcmVlOworICBNZWFzdXJlbWVudHMgbWVhc3VyZW1lbnRzKG5hbWVUcmVlKTsKKworICBOYW1lIG5hbWUwOworICBOYW1lIG5hbWVBICgibmRuOi9BIik7CisgIE5hbWUgbmFtZUFCKCJuZG46L0EvQiIpOworCisgIHNoYXJlZF9wdHI8bWVhc3VyZW1lbnRzOjpFbnRyeT4gZW50cnlBQiA9IG1lYXN1cmVtZW50cy5nZXQobmFtZUFCKTsKKyAgQk9PU1RfUkVRVUlSRShlbnRyeUFCICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeUFCLT5nZXROYW1lKCksIG5hbWVBQik7CisKKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiBlbnRyeTAgPSBtZWFzdXJlbWVudHMuZ2V0KG5hbWUwKTsKKyAgQk9PU1RfUkVRVUlSRShlbnRyeTAgIT0gbnVsbHB0cik7CisKKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiBlbnRyeUEgPSBtZWFzdXJlbWVudHMuZ2V0UGFyZW50KCplbnRyeUFCKTsKKyAgQk9PU1RfUkVRVUlSRShlbnRyeUEgIT0gbnVsbHB0cik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5QS0+Z2V0TmFtZSgpLCBuYW1lQSk7CisKKyAgc2hhcmVkX3B0cjxtZWFzdXJlbWVudHM6OkVudHJ5PiBlbnRyeTBjID0gbWVhc3VyZW1lbnRzLmdldFBhcmVudCgqZW50cnlBKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkwLCBlbnRyeTBjKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoTGlmZXRpbWUsIFVuaXRUZXN0VGltZUZpeHR1cmUpCit7CisgIE5hbWVUcmVlIG5hbWVUcmVlOworICBNZWFzdXJlbWVudHMgbWVhc3VyZW1lbnRzKG5hbWVUcmVlKTsKKyAgTmFtZSBuYW1lQSgibmRuOi9BIik7CisgIE5hbWUgbmFtZUIoIm5kbjovQiIpOworICBOYW1lIG5hbWVDKCJuZG46L0MiKTsKKworICBCT09TVF9DSEVDS19FUVVBTChtZWFzdXJlbWVudHMuc2l6ZSgpLCAwKTsKKworICBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+IGVudHJ5QSA9IG1lYXN1cmVtZW50cy5nZXQobmFtZUEpOworICBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+IGVudHJ5QiA9IG1lYXN1cmVtZW50cy5nZXQobmFtZUIpOworICBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+IGVudHJ5QyA9IG1lYXN1cmVtZW50cy5nZXQobmFtZUMpOworICBCT09TVF9DSEVDS19FUVVBTChtZWFzdXJlbWVudHMuc2l6ZSgpLCAzKTsKKworICBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBFWFRFTkRfQSA9IHRpbWU6OnNlY29uZHMoMik7CisgIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzIENIRUNLMSA9IHRpbWU6OnNlY29uZHMoMyk7CisgIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzIENIRUNLMiA9IHRpbWU6OnNlY29uZHMoNSk7CisgIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzIEVYVEVORF9DID0gdGltZTo6c2Vjb25kcyg2KTsKKyAgY29uc3QgdGltZTo6bmFub3NlY29uZHMgQ0hFQ0szID0gdGltZTo6c2Vjb25kcyg3KTsKKyAgQk9PU1RfQVNTRVJUKEVYVEVORF9BIDwgQ0hFQ0sxKTsKKyAgQk9PU1RfQVNTRVJUKENIRUNLMSA8IE1lYXN1cmVtZW50czo6Z2V0SW5pdGlhbExpZmV0aW1lKCkpOworICBCT09TVF9BU1NFUlQoTWVhc3VyZW1lbnRzOjpnZXRJbml0aWFsTGlmZXRpbWUoKSA8IENIRUNLMik7CisgIEJPT1NUX0FTU0VSVChDSEVDSzIgPCBFWFRFTkRfQyk7CisgIEJPT1NUX0FTU0VSVChFWFRFTkRfQyA8IENIRUNLMyk7CisKKyAgbWVhc3VyZW1lbnRzLmV4dGVuZExpZmV0aW1lKCplbnRyeUEsIEVYVEVORF9BKTsKKyAgbWVhc3VyZW1lbnRzLmV4dGVuZExpZmV0aW1lKCplbnRyeUMsIEVYVEVORF9DKTsKKyAgLy8gcmVtYWluaW5nIGxpZmV0aW1lOgorICAvLyAgIEEgPSBpbml0aWFsIGxpZmV0aW1lLCBiZWNhdXNlIGl0J3MgZXh0ZW5kZWQgYnkgbGVzcyBkdXJhdGlvbgorICAvLyAgIEIgPSBpbml0aWFsIGxpZmV0aW1lCisgIC8vICAgQyA9IEVYVEVORF9DCisgIGVudHJ5QS5yZXNldCgpOworICBlbnRyeUIucmVzZXQoKTsKKyAgZW50cnlDLnJlc2V0KCk7CisKKyAgdGhpcy0+YWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMTAwKSwgQ0hFQ0sxKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVBKSAhPSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVCKSAhPSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVDKSAhPSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVhc3VyZW1lbnRzLnNpemUoKSwgMyk7CisKKyAgdGhpcy0+YWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMTAwKSwgQ0hFQ0syIC0gQ0hFQ0sxKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVBKSA9PSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVCKSA9PSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVDKSAhPSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVhc3VyZW1lbnRzLnNpemUoKSwgMSk7CisKKyAgdGhpcy0+YWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMTAwKSwgQ0hFQ0szIC0gQ0hFQ0syKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVBKSA9PSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVCKSA9PSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0sobWVhc3VyZW1lbnRzLmZpbmRFeGFjdE1hdGNoKG5hbWVDKSA9PSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVhc3VyZW1lbnRzLnNpemUoKSwgMCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEVyYXNlTmFtZVRyZWVFbnRyeSwgVW5pdFRlc3RUaW1lRml4dHVyZSkKK3sKKyAgTmFtZVRyZWUgbmFtZVRyZWU7CisgIE1lYXN1cmVtZW50cyBtZWFzdXJlbWVudHMobmFtZVRyZWUpOworICBzaXplX3Qgbk5hbWVUcmVlRW50cmllc0JlZm9yZSA9IG5hbWVUcmVlLnNpemUoKTsKKworICBzaGFyZWRfcHRyPG1lYXN1cmVtZW50czo6RW50cnk+IGVudHJ5ID0gbWVhc3VyZW1lbnRzLmdldCgiL0EiKTsKKyAgdGhpcy0+YWR2YW5jZUNsb2NrcyhNZWFzdXJlbWVudHM6OmdldEluaXRpYWxMaWZldGltZSgpICsgdGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lYXN1cmVtZW50cy5zaXplKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTChuYW1lVHJlZS5zaXplKCksIG5OYW1lVHJlZUVudHJpZXNCZWZvcmUpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9uYW1lLXRyZWUuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9uYW1lLXRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTA1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL25hbWUtdHJlZS5jcHAKQEAgLTAsMCArMSw1OTEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ0YWJsZS9uYW1lLXRyZWUuaHBwIgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKwordXNpbmcgbmFtZV90cmVlOjpFbnRyeTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRhYmxlTmFtZVRyZWUsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShIYXNoKQoreworICBOYW1lIHJvb3QoIi8iKTsKKyAgcm9vdC53aXJlRW5jb2RlKCk7CisgIHNpemVfdCBoYXNoVmFsdWUgPSBuYW1lX3RyZWU6OmNvbXB1dGVIYXNoKHJvb3QpOworICBCT09TVF9DSEVDS19FUVVBTChoYXNoVmFsdWUsIHN0YXRpY19jYXN0PHNpemVfdD4oMCkpOworCisgIE5hbWUgcHJlZml4KCIvbm9oZWxsby93b3JsZC9uZG4vcmVzZWFyY2giKTsKKyAgcHJlZml4LndpcmVFbmNvZGUoKTsKKyAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBoYXNoU2V0ID0gbmFtZV90cmVlOjpjb21wdXRlSGFzaFNldChwcmVmaXgpOworICBCT09TVF9DSEVDS19FUVVBTChoYXNoU2V0LnNpemUoKSwgcHJlZml4LnNpemUoKSArIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbnRyeSkKK3sKKyAgTmFtZSBwcmVmaXgoIm5kbjovbmFtZWQtZGF0YS9yZXNlYXJjaC9hYmMvZGVmL2doaSIpOworCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnBlID0gbWFrZV9zaGFyZWQ8bmFtZV90cmVlOjpFbnRyeT4ocHJlZml4KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnBlLT5nZXRQcmVmaXgoKSwgcHJlZml4KTsKKworICAvLyBleGFtaW5lIGFsbCB0aGUgZ2V0IG1ldGhvZHMKKworICBzaXplX3QgaGFzaCA9IG5wZS0+Z2V0SGFzaCgpOworICBCT09TVF9DSEVDS19FUVVBTChoYXNoLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApKTsKKworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IHBhcmVudCA9IG5wZS0+Z2V0UGFyZW50KCk7CisgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihwYXJlbnQpKTsKKworICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+ID4mIGNoaWxkTGlzdCA9IG5wZS0+Z2V0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2hpbGRMaXN0LnNpemUoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSk7CisKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWIgPSBucGUtPmdldEZpYkVudHJ5KCk7CisgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihmaWIpKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjwgc2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiA+JiBwaXRMaXN0ID0gbnBlLT5nZXRQaXRFbnRyaWVzKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdExpc3Quc2l6ZSgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApKTsKKworICAvLyBleGFtaW5lIGFsbCB0aGUgc2V0IG1ldGhvZAorCisgIG5wZS0+c2V0SGFzaChzdGF0aWNfY2FzdDxzaXplX3Q+KDEyMzQ1KSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5wZS0+Z2V0SGFzaCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDEyMzQ1KSk7CisKKyAgTmFtZSBwYXJlbnROYW1lKCJuZG46L25hbWVkLWRhdGEvcmVzZWFyY2gvYWJjL2RlZiIpOworICBwYXJlbnQgPSBtYWtlX3NoYXJlZDxuYW1lX3RyZWU6OkVudHJ5PihwYXJlbnROYW1lKTsKKyAgbnBlLT5zZXRQYXJlbnQocGFyZW50KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnBlLT5nZXRQYXJlbnQoKSwgcGFyZW50KTsKKworICAvLyBJbnNlcnQgRklCCisKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeShuZXcgZmliOjpFbnRyeShwcmVmaXgpKTsKKyAgc2hhcmVkX3B0cjxmaWI6OkVudHJ5PiBmaWJFbnRyeVBhcmVudChuZXcgZmliOjpFbnRyeShwYXJlbnROYW1lKSk7CisKKyAgbnBlLT5zZXRGaWJFbnRyeShmaWJFbnRyeSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5wZS0+Z2V0RmliRW50cnkoKSwgZmliRW50cnkpOworCisgIG5wZS0+c2V0RmliRW50cnkoc2hhcmVkX3B0cjxmaWI6OkVudHJ5PigpKTsKKyAgQk9PU1RfQ0hFQ0soIXN0YXRpY19jYXN0PGJvb2w+KG5wZS0+Z2V0RmliRW50cnkoKSkpOworCisgIC8vIEluc2VydCBhIFBJVAorCisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkobWFrZV9zaGFyZWQ8cGl0OjpFbnRyeT4oKm1ha2VJbnRlcmVzdChwcmVmaXgpKSk7CisgIHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4gcGl0RW50cnkyKG1ha2Vfc2hhcmVkPHBpdDo6RW50cnk+KCptYWtlSW50ZXJlc3QocGFyZW50TmFtZSkpKTsKKworICBucGUtPmluc2VydFBpdEVudHJ5KHBpdEVudHJ5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnBlLT5nZXRQaXRFbnRyaWVzKCkuc2l6ZSgpLCAxKTsKKworICBucGUtPmluc2VydFBpdEVudHJ5KHBpdEVudHJ5Mik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5wZS0+Z2V0UGl0RW50cmllcygpLnNpemUoKSwgMik7CisKKyAgbnBlLT5lcmFzZVBpdEVudHJ5KHBpdEVudHJ5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnBlLT5nZXRQaXRFbnRyaWVzKCkuc2l6ZSgpLCAxKTsKKworICBucGUtPmVyYXNlUGl0RW50cnkocGl0RW50cnkyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnBlLT5nZXRQaXRFbnRyaWVzKCkuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQmFzaWMpCit7CisgIHNpemVfdCBuQnVja2V0cyA9IDE2OworICBOYW1lVHJlZSBudChuQnVja2V0cyk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuZ2V0TkJ1Y2tldHMoKSwgbkJ1Y2tldHMpOworCisgIE5hbWUgbmFtZUFCQygibmRuOi9hL2IvYyIpOworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG5wZUFCQyA9IG50Lmxvb2t1cChuYW1lQUJDKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCA0KTsKKworICBOYW1lIG5hbWVBQkQoIi9hL2IvZCIpOworICBzaGFyZWRfcHRyPG5hbWVfdHJlZTo6RW50cnk+IG5wZUFCRCA9IG50Lmxvb2t1cChuYW1lQUJEKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCA1KTsKKworICBOYW1lIG5hbWVBRSgiL2EvZS8iKTsKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBucGVBRSA9IG50Lmxvb2t1cChuYW1lQUUpOworICBCT09TVF9DSEVDS19FUVVBTChudC5zaXplKCksIDYpOworCisgIE5hbWUgbmFtZUYoIi9mIik7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnBlRiA9IG50Lmxvb2t1cChuYW1lRik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG50LnNpemUoKSwgNyk7CisKKyAgLy8gdmFsaWRhdGUgbG9va3VwKCkgYW5kIGZpbmRFeGFjdE1hdGNoKCkKKworICBOYW1lIG5hbWVBQiAoIi9hL2IiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnBlQUJDLT5nZXRQYXJlbnQoKSwgbnQuZmluZEV4YWN0TWF0Y2gobmFtZUFCKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5wZUFCRC0+Z2V0UGFyZW50KCksIG50LmZpbmRFeGFjdE1hdGNoKG5hbWVBQikpOworCisgIE5hbWUgbmFtZUEgKCIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTChucGVBRS0+Z2V0UGFyZW50KCksIG50LmZpbmRFeGFjdE1hdGNoKG5hbWVBKSk7CisKKyAgTmFtZSBuYW1lUm9vdCAoIi8iKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnBlRi0+Z2V0UGFyZW50KCksIG50LmZpbmRFeGFjdE1hdGNoKG5hbWVSb290KSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG50LnNpemUoKSwgNyk7CisKKyAgTmFtZSBuYW1lMCgiL2RvZXMvbm90L2V4aXN0Iik7CisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gbnBlMCA9IG50LmZpbmRFeGFjdE1hdGNoKG5hbWUwKTsKKyAgQk9PU1RfQ0hFQ0soIXN0YXRpY19jYXN0PGJvb2w+KG5wZTApKTsKKworCisgIC8vIExvbmdlc3QgUHJlZml4IE1hdGNoaW5nCisgIHNoYXJlZF9wdHI8bmFtZV90cmVlOjpFbnRyeT4gdGVtcDsKKyAgTmFtZSBuYW1lQUJDTFBNKCIvYS9iL2MvZGVmL2FzZGYvbmxmIik7CisgIHRlbXAgPSBudC5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVBQkNMUE0pOworICBCT09TVF9DSEVDS19FUVVBTCh0ZW1wLCBudC5maW5kRXhhY3RNYXRjaChuYW1lQUJDKSk7CisKKyAgTmFtZSBuYW1lQUJETFBNKCIvYS9iL2QvZGVmL2FzZGYvbmxmIik7CisgIHRlbXAgPSBudC5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVBQkRMUE0pOworICBCT09TVF9DSEVDS19FUVVBTCh0ZW1wLCBudC5maW5kRXhhY3RNYXRjaChuYW1lQUJEKSk7CisKKyAgTmFtZSBuYW1lQUJMUE0oIi9hL2IvaGVsbG8vd29ybGQiKTsKKyAgdGVtcCA9IG50LmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZUFCTFBNKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVtcCwgbnQuZmluZEV4YWN0TWF0Y2gobmFtZUFCKSk7CisKKyAgTmFtZSBuYW1lQUVMUE0oIi9hL2UvaGVsbG8vd29ybGQiKTsKKyAgdGVtcCA9IG50LmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZUFFTFBNKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVtcCwgbnQuZmluZEV4YWN0TWF0Y2gobmFtZUFFKSk7CisKKyAgTmFtZSBuYW1lQUxQTSgiL2EvaGVsbG8vd29ybGQiKTsKKyAgdGVtcCA9IG50LmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZUFMUE0pOworICBCT09TVF9DSEVDS19FUVVBTCh0ZW1wLCBudC5maW5kRXhhY3RNYXRjaChuYW1lQSkpOworCisgIE5hbWUgbmFtZUZMUE0oIi9mL2hlbGxvL3dvcmxkIik7CisgIHRlbXAgPSBudC5maW5kTG9uZ2VzdFByZWZpeE1hdGNoKG5hbWVGTFBNKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVtcCwgbnQuZmluZEV4YWN0TWF0Y2gobmFtZUYpKTsKKworICBOYW1lIG5hbWVSb290TFBNKCIvZG9lc19ub3RfZXhpc3QiKTsKKyAgdGVtcCA9IG50LmZpbmRMb25nZXN0UHJlZml4TWF0Y2gobmFtZVJvb3RMUE0pOworICBCT09TVF9DSEVDS19FUVVBTCh0ZW1wLCBudC5maW5kRXhhY3RNYXRjaChuYW1lUm9vdCkpOworCisgIGJvb2wgZXJhc2VSZXN1bHQgPSBmYWxzZTsKKyAgdGVtcCA9IG50LmZpbmRFeGFjdE1hdGNoKG5hbWVBQkMpOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCkpCisgICAgZXJhc2VSZXN1bHQgPSBudC4KKyAgZXJhc2VFbnRyeUlmRW1wdHkodGVtcCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG50LnNpemUoKSwgNik7CisgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihudC5maW5kRXhhY3RNYXRjaChuYW1lQUJDKSkpOworICBCT09TVF9DSEVDS19FUVVBTChlcmFzZVJlc3VsdCwgdHJ1ZSk7CisKKyAgZXJhc2VSZXN1bHQgPSBmYWxzZTsKKyAgdGVtcCA9IG50LmZpbmRFeGFjdE1hdGNoKG5hbWVBQkNMUE0pOworICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCkpCisgICAgZXJhc2VSZXN1bHQgPSBudC4KKyAgZXJhc2VFbnRyeUlmRW1wdHkodGVtcCk7CisgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPih0ZW1wKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG50LnNpemUoKSwgNik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVyYXNlUmVzdWx0LCBmYWxzZSk7CisKKyAgLy8gbnQuZHVtcChzdGQ6OmNvdXQpOworCisgIG50Lmxvb2t1cChuYW1lQUJDKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCA3KTsKKworICBlcmFzZVJlc3VsdCA9IGZhbHNlOworICB0ZW1wID0gbnQuZmluZEV4YWN0TWF0Y2gobmFtZUFCQyk7CisgIGlmIChzdGF0aWNfY2FzdDxib29sPih0ZW1wKSkKKyAgICBlcmFzZVJlc3VsdCA9IG50LgorICBlcmFzZUVudHJ5SWZFbXB0eSh0ZW1wKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCA2KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXJhc2VSZXN1bHQsIHRydWUpOworICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4obnQuZmluZEV4YWN0TWF0Y2gobmFtZUFCQykpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChudC5nZXROQnVja2V0cygpLCAxNik7CisKKyAgLy8gc2hvdWxkIHJlc2l6ZSBub3cKKyAgTmFtZSBuYW1lQUJDRCgiYS9iL2MvZCIpOworICBudC5sb29rdXAobmFtZUFCQ0QpOworICBOYW1lIG5hbWVBQkNERSgiYS9iL2MvZC9lIik7CisgIG50Lmxvb2t1cChuYW1lQUJDREUpOworICBCT09TVF9DSEVDS19FUVVBTChudC5zaXplKCksIDkpOworICBCT09TVF9DSEVDS19FUVVBTChudC5nZXROQnVja2V0cygpLCAzMik7CisKKyAgLy8gdHJ5IHRvIGVyYXNlIC9hL2IvYywgc2hvdWxkIHJldHVybiBmYWxzZQorICB0ZW1wID0gbnQuZmluZEV4YWN0TWF0Y2gobmFtZUFCQyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRlbXAtPmdldFByZWZpeCgpLCBuYW1lQUJDKTsKKyAgZXJhc2VSZXN1bHQgPSBudC4KKyAgZXJhc2VFbnRyeUlmRW1wdHkodGVtcCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVyYXNlUmVzdWx0LCBmYWxzZSk7CisgIHRlbXAgPSBudC5maW5kRXhhY3RNYXRjaChuYW1lQUJDKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGVtcC0+Z2V0UHJlZml4KCksIG5hbWVBQkMpOworCisgIHRlbXAgPSBudC5maW5kRXhhY3RNYXRjaChuYW1lQUJEKTsKKyAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KHRlbXApKQorICAgIG50LgorICBlcmFzZUVudHJ5SWZFbXB0eSh0ZW1wKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCA4KTsKK30KKworLyoqIFxicmllZiB2ZXJpZnkgYSBOYW1lVHJlZSBlbnVtZXJhdGlvbiBjb250YWlucyBleHBlY3RlZCBlbnRyaWVzCisgKgorICogIEV4YW1wbGU6CisgKiAgXGNvZGV7LmNwcH0KKyAqICBhdXRvJiBlbnVtZXJhYmxlID0gLi4uOworICogIEVudW1lcmF0aW9uVmVyaWZpZXIoZW51bWVyYWJsZSkKKyAqICAgIC5leHBlY3QoIi9BIikKKyAqICAgIC5leHBlY3QoIi9CIikKKyAqICAgIC5lbmQoKTsKKyAqICAvLyBlbnVtZXJhYmxlIG11c3QgaGF2ZSAvQSAvQiBhbmQgbm90aGluZyBlbHNlIHRvIHBhc3MgdGhlIHRlc3QuCisgKiAgXGVuZGNvZGUKKyAqLworY2xhc3MgRW51bWVyYXRpb25WZXJpZmllciA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIHRlbXBsYXRlPHR5cGVuYW1lIEVudW1lcmFibGU+CisgIEVudW1lcmF0aW9uVmVyaWZpZXIoRW51bWVyYWJsZSYmIGVudW1lcmFibGUpCisgIHsKKyAgICBmb3IgKGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmIGVudHJ5IDogZW51bWVyYWJsZSkgeworICAgICAgY29uc3QgTmFtZSYgbmFtZSA9IGVudHJ5LmdldFByZWZpeCgpOworICAgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShtX25hbWVzLmluc2VydChuYW1lKS5zZWNvbmQsICJkdXBsaWNhdGUgTmFtZSAiIDw8IG5hbWUpOworICAgIH0KKyAgfQorCisgIEVudW1lcmF0aW9uVmVyaWZpZXImCisgIGV4cGVjdChjb25zdCBOYW1lJiBuYW1lKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShtX25hbWVzLmVyYXNlKG5hbWUpID09IDEsICJtaXNzaW5nIE5hbWUgIiA8PCBuYW1lKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkCisgIGVuZCgpCisgIHsKKyAgICBCT09TVF9DSEVDS19NRVNTQUdFKG1fbmFtZXMuZW1wdHkoKSwgImV4Y2VzcyBOYW1lcyBpbmNsdWRpbmcgIiA8PCAqbV9uYW1lcy5iZWdpbigpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnVub3JkZXJlZF9zZXQ8TmFtZT4gbV9uYW1lczsKK307CisKK2NsYXNzIEVudW1lcmF0aW9uRml4dHVyZSA6IHB1YmxpYyBCYXNlRml4dHVyZQoreworcHJvdGVjdGVkOgorICBFbnVtZXJhdGlvbkZpeHR1cmUoKQorICAgIDogbnQoTl9CVUNLRVRTKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCAwKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChudC5nZXROQnVja2V0cygpLCBOX0JVQ0tFVFMpOworICB9CisKKyAgdm9pZAorICBpbnNlcnRBYkFjKCkKKyAgeworICAgIG50Lmxvb2t1cCgiL2EvYiIpOworICAgIG50Lmxvb2t1cCgiL2EvYyIpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKG50LnNpemUoKSwgNCk7CisgICAgLy8gLywgL2EsIC9hL2IsIC9hL2MKKyAgfQorCisgIHZvaWQKKyAgaW5zZXJ0QWIxQWIyQWMxQWMyKCkKKyAgeworICAgIG50Lmxvb2t1cCgiL2EvYi8xIik7CisgICAgbnQubG9va3VwKCIvYS9iLzIiKTsKKyAgICBudC5sb29rdXAoIi9hL2MvMSIpOworICAgIG50Lmxvb2t1cCgiL2EvYy8yIik7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCA4KTsKKyAgICAvLyAvLCAvYSwgL2EvYiwgL2EvYi8xLCAvYS9iLzIsIC9hL2MsIC9hL2MvMSwgL2EvYy8yCisgIH0KKworcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IE5fQlVDS0VUUyA9IDE2OworICBOYW1lVHJlZSBudDsKK307Citjb25zdCBzaXplX3QgRW51bWVyYXRpb25GaXh0dXJlOjpOX0JVQ0tFVFM7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEl0ZXJhdG9yRnVsbEVudW1lcmF0ZSwgRW51bWVyYXRpb25GaXh0dXJlKQoreworICBudC5sb29rdXAoIi9hL2IvYyIpOworICBCT09TVF9DSEVDS19FUVVBTChudC5zaXplKCksIDQpOworCisgIG50Lmxvb2t1cCgiL2EvYi9kIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG50LnNpemUoKSwgNSk7CisKKyAgbnQubG9va3VwKCIvYS9lIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG50LnNpemUoKSwgNik7CisKKyAgbnQubG9va3VwKCIvZiIpOworICBCT09TVF9DSEVDS19FUVVBTChudC5zaXplKCksIDcpOworCisgIG50Lmxvb2t1cCgiLyIpOworICBCT09TVF9DSEVDS19FUVVBTChudC5zaXplKCksIDcpOworCisgIGF1dG8mJiBlbnVtZXJhYmxlID0gbnQuZnVsbEVudW1lcmF0ZSgpOworICBFbnVtZXJhdGlvblZlcmlmaWVyKGVudW1lcmFibGUpCisgICAgLmV4cGVjdCgiLyIpCisgICAgLmV4cGVjdCgiL2EiKQorICAgIC5leHBlY3QoIi9hL2IiKQorICAgIC5leHBlY3QoIi9hL2IvYyIpCisgICAgLmV4cGVjdCgiL2EvYi9kIikKKyAgICAuZXhwZWN0KCIvYS9lIikKKyAgICAuZXhwZWN0KCIvZiIpCisgICAgLmVuZCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoSXRlcmF0b3JQYXJ0aWFsRW51bWVyYXRlLCBFbnVtZXJhdGlvbkZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVtcHR5KQoreworICBhdXRvJiYgZW51bWVyYWJsZSA9IG50LnBhcnRpYWxFbnVtZXJhdGUoIi9hIik7CisKKyAgRW51bWVyYXRpb25WZXJpZmllcihlbnVtZXJhYmxlKQorICAgIC5lbmQoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm90SW4pCit7CisgIHRoaXMtPmluc2VydEFiQWMoKTsKKworICAvLyBFbnVtZXJhdGUgb24gc29tZSBuYW1lIHRoYXQgaXMgbm90IGluIG5hbWVUcmVlCisgIE5hbWUgbmFtZTAoIi8wIik7CisgIGF1dG8mJiBlbnVtZXJhYmxlID0gbnQucGFydGlhbEVudW1lcmF0ZSgiLzAiKTsKKworICBFbnVtZXJhdGlvblZlcmlmaWVyKGVudW1lcmFibGUpCisgICAgLmVuZCgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShPbmx5QSkKK3sKKyAgdGhpcy0+aW5zZXJ0QWJBYygpOworCisgIC8vIEFjY2VwdCAicm9vdCIgbmFtZUEgb25seQorICBhdXRvJiYgZW51bWVyYWJsZSA9IG50LnBhcnRpYWxFbnVtZXJhdGUoIi9hIiwgW10gKGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmIGVudHJ5KSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGVudHJ5LmdldFByZWZpeCgpID09ICIvYSIsIHRydWUpOworICB9KTsKKworICBFbnVtZXJhdGlvblZlcmlmaWVyKGVudW1lcmFibGUpCisgICAgLmV4cGVjdCgiL2EiKQorICAgIC5lbmQoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRXhjZXB0QSkKK3sKKyAgdGhpcy0+aW5zZXJ0QWJBYygpOworCisgIC8vIEFjY2VwdCBhbnl0aGluZyBleGNlcHQgInJvb3QiIG5hbWVBCisgIGF1dG8mJiBlbnVtZXJhYmxlID0gbnQucGFydGlhbEVudW1lcmF0ZSgiL2EiLCBbXSAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgZW50cnkpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW50cnkuZ2V0UHJlZml4KCkgIT0gIi9hIiwgdHJ1ZSk7CisgIH0pOworCisgIEVudW1lcmF0aW9uVmVyaWZpZXIoZW51bWVyYWJsZSkKKyAgICAuZXhwZWN0KCIvYS9iIikKKyAgICAuZXhwZWN0KCIvYS9jIikKKyAgICAuZW5kKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE5vTmFtZUFOb1N1YlRyZWVBQikKK3sKKyAgdGhpcy0+aW5zZXJ0QWIxQWIyQWMxQWMyKCk7CisKKyAgLy8gTm8gTmFtZUEKKyAgLy8gTm8gU3ViVHJlZSBmcm9tIE5hbWVBQgorICBhdXRvJiYgZW51bWVyYWJsZSA9IG50LnBhcnRpYWxFbnVtZXJhdGUoIi9hIiwgW10gKGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmIGVudHJ5KSB7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW50cnkuZ2V0UHJlZml4KCkgIT0gIi9hIiwgZW50cnkuZ2V0UHJlZml4KCkgIT0gIi9hL2IiKTsKKyAgICB9KTsKKworICBFbnVtZXJhdGlvblZlcmlmaWVyKGVudW1lcmFibGUpCisgICAgLmV4cGVjdCgiL2EvYiIpCisgICAgLmV4cGVjdCgiL2EvYyIpCisgICAgLmV4cGVjdCgiL2EvYy8xIikKKyAgICAuZXhwZWN0KCIvYS9jLzIiKQorICAgIC5lbmQoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9OYW1lQU5vU3ViVHJlZUFDKQoreworICB0aGlzLT5pbnNlcnRBYjFBYjJBYzFBYzIoKTsKKworICAvLyBObyBOYW1lQQorICAvLyBObyBTdWJUcmVlIGZyb20gTmFtZUFDCisgIGF1dG8mJiBlbnVtZXJhYmxlID0gbnQucGFydGlhbEVudW1lcmF0ZSgiL2EiLCBbXSAoY29uc3QgbmFtZV90cmVlOjpFbnRyeSYgZW50cnkpIHsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihlbnRyeS5nZXRQcmVmaXgoKSAhPSAiL2EiLCBlbnRyeS5nZXRQcmVmaXgoKSAhPSAiL2EvYyIpOworICAgIH0pOworCisgIEVudW1lcmF0aW9uVmVyaWZpZXIoZW51bWVyYWJsZSkKKyAgICAuZXhwZWN0KCIvYS9iIikKKyAgICAuZXhwZWN0KCIvYS9iLzEiKQorICAgIC5leHBlY3QoIi9hL2IvMiIpCisgICAgLmV4cGVjdCgiL2EvYyIpCisgICAgLmVuZCgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShOb1N1YlRyZWVBKQoreworICB0aGlzLT5pbnNlcnRBYjFBYjJBYzFBYzIoKTsKKworICAvLyBObyBTdWJ0cmVlIGZyb20gTmFtZUEKKyAgYXV0byYmIGVudW1lcmFibGUgPSBudC5wYXJ0aWFsRW51bWVyYXRlKCIvYSIsIFtdIChjb25zdCBuYW1lX3RyZWU6OkVudHJ5JiBlbnRyeSkgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRydWUsIGVudHJ5LmdldFByZWZpeCgpICE9ICIvYSIpOworICAgIH0pOworCisgIEVudW1lcmF0aW9uVmVyaWZpZXIoZW51bWVyYWJsZSkKKyAgICAuZXhwZWN0KCIvYSIpCisgICAgLmVuZCgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFeGFtcGxlKQoreworICAvLyBFeGFtcGxlCisgIC8vIC8KKyAgLy8gL0EKKyAgLy8gL0EvQiB4CisgIC8vIC9BL0IvQworICAvLyAvQS9EIHgKKyAgLy8gL0UKKyAgLy8gL0YKKworICBudC5sb29rdXAoIi9BIik7CisgIG50Lmxvb2t1cCgiL0EvQiIpOworICBudC5sb29rdXAoIi9BL0IvQyIpOworICBudC5sb29rdXAoIi9BL0QiKTsKKyAgbnQubG9va3VwKCIvRSIpOworICBudC5sb29rdXAoIi9GIik7CisKKyAgYXV0byYmIGVudW1lcmFibGUgPSBudC5wYXJ0aWFsRW51bWVyYXRlKCIvQSIsCisgICAgW10gKGNvbnN0IG5hbWVfdHJlZTo6RW50cnkmIGVudHJ5KSAtPiBzdGQ6OnBhaXI8Ym9vbCwgYm9vbD4geworICAgICAgYm9vbCB2aXNpdEVudHJ5ID0gZmFsc2U7CisgICAgICBib29sIHZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKworICAgICAgTmFtZSBuYW1lID0gZW50cnkuZ2V0UHJlZml4KCk7CisKKyAgICAgIGlmIChuYW1lID09ICIvIiB8fCBuYW1lID09ICIvQS9CIiB8fCBuYW1lID09ICIvQS9CL0MiIHx8IG5hbWUgPT0gIi9BL0QiKSB7CisgICAgICAgIHZpc2l0RW50cnkgPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAobmFtZSA9PSAiLyIgfHwgbmFtZSA9PSAiL0EiIHx8IG5hbWUgPT0gIi9GIikgeworICAgICAgICB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHt2aXNpdEVudHJ5LCB2aXNpdENoaWxkcmVufTsKKyAgICB9KTsKKworICBFbnVtZXJhdGlvblZlcmlmaWVyKGVudW1lcmFibGUpCisgICAgLmV4cGVjdCgiL0EvQiIpCisgICAgLmV4cGVjdCgiL0EvRCIpCisgICAgLmVuZCgpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoSXRlcmF0b3JGaW5kQWxsTWF0Y2hlcywgRW51bWVyYXRpb25GaXh0dXJlKQoreworICBudC5sb29rdXAoIi9hL2IvYy9kL2UvZiIpOworICBudC5sb29rdXAoIi9hL2EvYyIpOworICBudC5sb29rdXAoIi9hL2EvZC8xIik7CisgIG50Lmxvb2t1cCgiL2EvYS9kLzIiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnQuc2l6ZSgpLCAxMik7CisKKyAgYXV0byYmIGFsbE1hdGNoZXMgPSBudC5maW5kQWxsTWF0Y2hlcygiL2EvYi9jL2QvZSIpOworCisgIEVudW1lcmF0aW9uVmVyaWZpZXIoYWxsTWF0Y2hlcykKKyAgICAuZXhwZWN0KCIvIikKKyAgICAuZXhwZWN0KCIvYSIpCisgICAgLmV4cGVjdCgiL2EvYiIpCisgICAgLmV4cGVjdCgiL2EvYi9jIikKKyAgICAuZXhwZWN0KCIvYS9iL2MvZCIpCisgICAgLmV4cGVjdCgiL2EvYi9jL2QvZSIpCisgICAgLmVuZCgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShIYXNoVGFibGVSZXNpemVTaHJpbmspCit7CisgIHNpemVfdCBuQnVja2V0cyA9IDE2OworICBOYW1lVHJlZSBuYW1lVHJlZShuQnVja2V0cyk7CisKKyAgTmFtZSBwcmVmaXgoIi9hL2IvYy9kL2UvZi9nL2giKTsgLy8gcmVxdWlyZXMgOSBidWNrZXRzCisKKyAgc2hhcmVkX3B0cjxuYW1lX3RyZWU6OkVudHJ5PiBlbnRyeSA9IG5hbWVUcmVlLmxvb2t1cChwcmVmaXgpOworICBCT09TVF9DSEVDS19FUVVBTChuYW1lVHJlZS5zaXplKCksIDkpOworICBCT09TVF9DSEVDS19FUVVBTChuYW1lVHJlZS5nZXROQnVja2V0cygpLCAzMik7CisKKyAgbmFtZVRyZWUuZXJhc2VFbnRyeUlmRW1wdHkoZW50cnkpOworICBCT09TVF9DSEVDS19FUVVBTChuYW1lVHJlZS5zaXplKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTChuYW1lVHJlZS5nZXROQnVja2V0cygpLCAxNik7Cit9CisKKy8vIC5sb29rdXAgc2hvdWxkIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9yCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTdXJ2aXZlZEl0ZXJhdG9yQWZ0ZXJMb29rdXApCit7CisgIE5hbWVUcmVlIG50OworICBudC5sb29rdXAoIi9BL0IvQyIpOworICBudC5sb29rdXAoIi9FIik7CisKKyAgTmFtZSBuYW1lQigiL0EvQiIpOworICBzdGQ6OnNldDxOYW1lPiBzZWVuTmFtZXM7CisgIGZvciAoTmFtZVRyZWU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbnQuYmVnaW4oKTsgaXQgIT0gbnQuZW5kKCk7ICsraXQpIHsKKyAgICBCT09TVF9DSEVDSyhzZWVuTmFtZXMuaW5zZXJ0KGl0LT5nZXRQcmVmaXgoKSkuc2Vjb25kKTsKKyAgICBpZiAoaXQtPmdldFByZWZpeCgpID09IG5hbWVCKSB7CisgICAgICBudC5sb29rdXAoIi9EIik7CisgICAgfQorICB9CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2Vlbk5hbWVzLmNvdW50KCIvIiksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChzZWVuTmFtZXMuY291bnQoIi9BIiksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChzZWVuTmFtZXMuY291bnQoIi9BL0IiKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNlZW5OYW1lcy5jb3VudCgiL0EvQi9DIiksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChzZWVuTmFtZXMuY291bnQoIi9FIiksIDEpOworCisgIHNlZW5OYW1lcy5lcmFzZSgiL0QiKTsgLy8gL0QgbWF5IG9yIG1heSBub3QgYXBwZWFyCisgIEJPT1NUX0NIRUNLKHNlZW5OYW1lcy5zaXplKCkgPT0gNSk7Cit9CisKKy8vIC5lcmFzZUVudHJ5SWZFbXB0eSBzaG91bGQgbm90IGludmFsaWRhdGUgaXRlcmF0b3IKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFN1cnZpdmVkSXRlcmF0b3JBZnRlckVyYXNlKQoreworICBOYW1lVHJlZSBudDsKKyAgbnQubG9va3VwKCIvQS9CL0MiKTsKKyAgbnQubG9va3VwKCIvQS9EL0UiKTsKKyAgbnQubG9va3VwKCIvQS9GL0ciKTsKKyAgbnQubG9va3VwKCIvSCIpOworCisgIE5hbWUgbmFtZUQoIi9BL0QiKTsKKyAgc3RkOjpzZXQ8TmFtZT4gc2Vlbk5hbWVzOworICBmb3IgKE5hbWVUcmVlOjpjb25zdF9pdGVyYXRvciBpdCA9IG50LmJlZ2luKCk7IGl0ICE9IG50LmVuZCgpOyArK2l0KSB7CisgICAgQk9PU1RfQ0hFQ0soc2Vlbk5hbWVzLmluc2VydChpdC0+Z2V0UHJlZml4KCkpLnNlY29uZCk7CisgICAgaWYgKGl0LT5nZXRQcmVmaXgoKSA9PSBuYW1lRCkgeworICAgICAgbnQuZXJhc2VFbnRyeUlmRW1wdHkobnQuZmluZEV4YWN0TWF0Y2goIi9BL0YvRyIpKTsgLy8gL0EvRi9HIGFuZCAvQS9GIGFyZSBlcmFzZWQKKyAgICB9CisgIH0KKworICBCT09TVF9DSEVDS19FUVVBTChzZWVuTmFtZXMuY291bnQoIi8iKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNlZW5OYW1lcy5jb3VudCgiL0EiKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNlZW5OYW1lcy5jb3VudCgiL0EvQiIpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2Vlbk5hbWVzLmNvdW50KCIvQS9CL0MiKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNlZW5OYW1lcy5jb3VudCgiL0EvRCIpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2Vlbk5hbWVzLmNvdW50KCIvQS9EL0UiKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNlZW5OYW1lcy5jb3VudCgiL0giKSwgMSk7CisKKyAgc2Vlbk5hbWVzLmVyYXNlKCIvQS9GIik7IC8vIC9BL0YgbWF5IG9yIG1heSBub3QgYXBwZWFyCisgIHNlZW5OYW1lcy5lcmFzZSgiL0EvRi9HIik7IC8vIC9BL0YvRyBtYXkgb3IgbWF5IG5vdCBhcHBlYXIKKyAgQk9PU1RfQ0hFQ0soc2Vlbk5hbWVzLnNpemUoKSA9PSA3KTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vdGFibGUvcGl0LmNwcCBiL05GRC90ZXN0cy9kYWVtb24vdGFibGUvcGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJiYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9waXQuY3BwCkBAIC0wLDAgKzEsNDk4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAidGFibGUvcGl0LmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9kYWVtb24vZmFjZS9kdW1teS1mYWNlLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoVGFibGVQaXQsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFbnRyeUluT3V0UmVjb3JkcykKK3sKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlMSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgc2hhcmVkX3B0cjxGYWNlPiBmYWNlMiA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgTmFtZSBuYW1lKCJuZG46L0t1WWZqdFJxIik7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ICA9IG1ha2VJbnRlcmVzdChuYW1lKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QxID0gbWFrZUludGVyZXN0KG5hbWUpOworICBpbnRlcmVzdDEtPnNldEludGVyZXN0TGlmZXRpbWUodGltZTo6bWlsbGlzZWNvbmRzKDI1MjgpKTsKKyAgaW50ZXJlc3QxLT5zZXROb25jZSgyNTU1OSk7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0MiA9IG1ha2VJbnRlcmVzdChuYW1lKTsKKyAgaW50ZXJlc3QyLT5zZXRJbnRlcmVzdExpZmV0aW1lKHRpbWU6Om1pbGxpc2Vjb25kcyg2NDY0KSk7CisgIGludGVyZXN0Mi0+c2V0Tm9uY2UoMTkwMDQpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdDMgPSBtYWtlSW50ZXJlc3QobmFtZSk7CisgIGludGVyZXN0My0+c2V0SW50ZXJlc3RMaWZldGltZSh0aW1lOjptaWxsaXNlY29uZHMoMzU4NSkpOworICBpbnRlcmVzdDMtPnNldE5vbmNlKDI0MjE2KTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3Q0ID0gbWFrZUludGVyZXN0KG5hbWUpOworICBpbnRlcmVzdDQtPnNldEludGVyZXN0TGlmZXRpbWUodGltZTo6bWlsbGlzZWNvbmRzKDg3OTUpKTsKKyAgaW50ZXJlc3Q0LT5zZXROb25jZSgxNzM2NSk7CisKKyAgcGl0OjpFbnRyeSBlbnRyeSgqaW50ZXJlc3QpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LmdldEludGVyZXN0KCkuZ2V0TmFtZSgpLCBuYW1lKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkuZ2V0TmFtZSgpLCBuYW1lKTsKKworICBjb25zdCBwaXQ6OkluUmVjb3JkQ29sbGVjdGlvbiYgaW5SZWNvcmRzMSA9IGVudHJ5LmdldEluUmVjb3JkcygpOworICBCT09TVF9DSEVDS19FUVVBTChpblJlY29yZHMxLnNpemUoKSwgMCk7CisgIGNvbnN0IHBpdDo6T3V0UmVjb3JkQ29sbGVjdGlvbiYgb3V0UmVjb3JkczEgPSBlbnRyeS5nZXRPdXRSZWNvcmRzKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG91dFJlY29yZHMxLnNpemUoKSwgMCk7CisKKyAgLy8gaW5zZXJ0IEluUmVjb3JkCisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IGJlZm9yZTEgPSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICBwaXQ6OkluUmVjb3JkQ29sbGVjdGlvbjo6aXRlcmF0b3IgaW4xID0KKyAgICBlbnRyeS5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UxLCAqaW50ZXJlc3QxKTsKKyAgdGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQgYWZ0ZXIxID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgY29uc3QgcGl0OjpJblJlY29yZENvbGxlY3Rpb24mIGluUmVjb3JkczIgPSBlbnRyeS5nZXRJblJlY29yZHMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5SZWNvcmRzMi5zaXplKCksIDEpOworICBCT09TVF9DSEVDSyhpbjEgPT0gaW5SZWNvcmRzMi5iZWdpbigpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW4xLT5nZXRGYWNlKCksIGZhY2UxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW4xLT5nZXRMYXN0Tm9uY2UoKSwgaW50ZXJlc3QxLT5nZXROb25jZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfR0UoaW4xLT5nZXRMYXN0UmVuZXdlZCgpLCBiZWZvcmUxKTsKKyAgQk9PU1RfQ0hFQ0tfTEUoaW4xLT5nZXRMYXN0UmVuZXdlZCgpLCBhZnRlcjEpOworICBCT09TVF9DSEVDS19MRShpbjEtPmdldEV4cGlyeSgpIC0gaW4xLT5nZXRMYXN0UmVuZXdlZCgpCisgICAgICAgICAgICAgICAgIC0gaW50ZXJlc3QxLT5nZXRJbnRlcmVzdExpZmV0aW1lKCksCisgICAgICAgICAgICAgICAgIChhZnRlcjEgLSBiZWZvcmUxKSk7CisgIEJPT1NUX0NIRUNLKGluMSA9PSBlbnRyeS5nZXRJblJlY29yZCgqZmFjZTEpKTsKKworICAvLyBpbnNlcnQgT3V0UmVjb3JkCisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IGJlZm9yZTIgPSB0aW1lOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICBwaXQ6Ok91dFJlY29yZENvbGxlY3Rpb246Oml0ZXJhdG9yIG91dDEgPQorICAgIGVudHJ5Lmluc2VydE9yVXBkYXRlT3V0UmVjb3JkKGZhY2UxLCAqaW50ZXJlc3QxKTsKKyAgdGltZTo6c3RlYWR5X2Nsb2NrOjpUaW1lUG9pbnQgYWZ0ZXIyID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgY29uc3QgcGl0OjpPdXRSZWNvcmRDb2xsZWN0aW9uJiBvdXRSZWNvcmRzMiA9IGVudHJ5LmdldE91dFJlY29yZHMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwob3V0UmVjb3JkczIuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0sob3V0MSA9PSBvdXRSZWNvcmRzMi5iZWdpbigpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwob3V0MS0+Z2V0RmFjZSgpLCBmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG91dDEtPmdldExhc3ROb25jZSgpLCBpbnRlcmVzdDEtPmdldE5vbmNlKCkpOworICBCT09TVF9DSEVDS19HRShvdXQxLT5nZXRMYXN0UmVuZXdlZCgpLCBiZWZvcmUyKTsKKyAgQk9PU1RfQ0hFQ0tfTEUob3V0MS0+Z2V0TGFzdFJlbmV3ZWQoKSwgYWZ0ZXIyKTsKKyAgQk9PU1RfQ0hFQ0tfTEUob3V0MS0+Z2V0RXhwaXJ5KCkgLSBvdXQxLT5nZXRMYXN0UmVuZXdlZCgpCisgICAgICAgICAgICAgICAgIC0gaW50ZXJlc3QxLT5nZXRJbnRlcmVzdExpZmV0aW1lKCksCisgICAgICAgICAgICAgICAgIChhZnRlcjIgLSBiZWZvcmUyKSk7CisgIEJPT1NUX0NIRUNLKG91dDEgPT0gZW50cnkuZ2V0T3V0UmVjb3JkKCpmYWNlMSkpOworCisgIC8vIHVwZGF0ZSBJblJlY29yZAorICB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCBiZWZvcmUzID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgcGl0OjpJblJlY29yZENvbGxlY3Rpb246Oml0ZXJhdG9yIGluMiA9CisgICAgZW50cnkuaW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMSwgKmludGVyZXN0Mik7CisgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IGFmdGVyMyA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgIGNvbnN0IHBpdDo6SW5SZWNvcmRDb2xsZWN0aW9uJiBpblJlY29yZHMzID0gZW50cnkuZ2V0SW5SZWNvcmRzKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluUmVjb3JkczMuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0soaW4yID09IGluUmVjb3JkczMuYmVnaW4oKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluMi0+Z2V0RmFjZSgpLCBmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluMi0+Z2V0TGFzdE5vbmNlKCksIGludGVyZXN0Mi0+Z2V0Tm9uY2UoKSk7CisgIEJPT1NUX0NIRUNLX0xFKGluMi0+Z2V0RXhwaXJ5KCkgLSBpbjItPmdldExhc3RSZW5ld2VkKCkKKyAgICAgICAgICAgICAgICAgLSBpbnRlcmVzdDItPmdldEludGVyZXN0TGlmZXRpbWUoKSwKKyAgICAgICAgICAgICAgICAgKGFmdGVyMyAtIGJlZm9yZTMpKTsKKworICAvLyBpbnNlcnQgYW5vdGhlciBJblJlY29yZAorICBwaXQ6OkluUmVjb3JkQ29sbGVjdGlvbjo6aXRlcmF0b3IgaW4zID0KKyAgICBlbnRyeS5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UyLCAqaW50ZXJlc3QzKTsKKyAgY29uc3QgcGl0OjpJblJlY29yZENvbGxlY3Rpb24mIGluUmVjb3JkczQgPSBlbnRyeS5nZXRJblJlY29yZHMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5SZWNvcmRzNC5zaXplKCksIDIpOworICBCT09TVF9DSEVDS19FUVVBTChpbjMtPmdldEZhY2UoKSwgZmFjZTIpOworCisgIC8vIGdldCBJblJlY29yZAorICBwaXQ6OkluUmVjb3JkQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaW40ID0gZW50cnkuZ2V0SW5SZWNvcmQoKmZhY2UxKTsKKyAgQk9PU1RfUkVRVUlSRShpbjQgIT0gZW50cnkuZ2V0SW5SZWNvcmRzKCkuZW5kKCkpOworICBCT09TVF9DSEVDS19FUVVBTChpbjQtPmdldEZhY2UoKSwgZmFjZTEpOworCisgIC8vIGRlbGV0ZSBhbGwgSW5SZWNvcmRzCisgIGVudHJ5LmRlbGV0ZUluUmVjb3JkcygpOworICBjb25zdCBwaXQ6OkluUmVjb3JkQ29sbGVjdGlvbiYgaW5SZWNvcmRzNSA9IGVudHJ5LmdldEluUmVjb3JkcygpOworICBCT09TVF9DSEVDS19FUVVBTChpblJlY29yZHM1LnNpemUoKSwgMCk7CisgIEJPT1NUX0NIRUNLKGVudHJ5LmdldEluUmVjb3JkKCpmYWNlMSkgPT0gZW50cnkuZ2V0SW5SZWNvcmRzKCkuZW5kKCkpOworCisgIC8vIGluc2VydCBhbm90aGVyIE91dFJlY29yZAorICBwaXQ6Ok91dFJlY29yZENvbGxlY3Rpb246Oml0ZXJhdG9yIG91dDIgPQorICAgIGVudHJ5Lmluc2VydE9yVXBkYXRlT3V0UmVjb3JkKGZhY2UyLCAqaW50ZXJlc3Q0KTsKKyAgY29uc3QgcGl0OjpPdXRSZWNvcmRDb2xsZWN0aW9uJiBvdXRSZWNvcmRzMyA9IGVudHJ5LmdldE91dFJlY29yZHMoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwob3V0UmVjb3JkczMuc2l6ZSgpLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwob3V0Mi0+Z2V0RmFjZSgpLCBmYWNlMik7CisKKyAgLy8gZ2V0IE91dFJlY29yZAorICBwaXQ6Ok91dFJlY29yZENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIG91dDMgPSBlbnRyeS5nZXRPdXRSZWNvcmQoKmZhY2UxKTsKKyAgQk9PU1RfUkVRVUlSRShvdXQzICE9IGVudHJ5LmdldE91dFJlY29yZHMoKS5lbmQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG91dDMtPmdldEZhY2UoKSwgZmFjZTEpOworCisgIC8vIGRlbGV0ZSBPdXRSZWNvcmQKKyAgZW50cnkuZGVsZXRlT3V0UmVjb3JkKCpmYWNlMik7CisgIGNvbnN0IHBpdDo6T3V0UmVjb3JkQ29sbGVjdGlvbiYgb3V0UmVjb3JkczQgPSBlbnRyeS5nZXRPdXRSZWNvcmRzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwob3V0UmVjb3JkczQuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwob3V0UmVjb3JkczQuYmVnaW4oKS0+Z2V0RmFjZSgpLCBmYWNlMSk7CisgIEJPT1NUX0NIRUNLKGVudHJ5LmdldE91dFJlY29yZCgqZmFjZTIpID09IGVudHJ5LmdldE91dFJlY29yZHMoKS5lbmQoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVudHJ5Tm9uY2UpCit7CisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTEgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTIgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3QgPSBtYWtlSW50ZXJlc3QoIm5kbjovcXRDUTdJMWMiKTsKKyAgaW50ZXJlc3QtPnNldE5vbmNlKDI1NTU5KTsKKworICBwaXQ6OkVudHJ5IGVudHJ5MCgqaW50ZXJlc3QpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTAuZmluZE5vbmNlKDI1NTU5LCAqZmFjZTEpLCBwaXQ6OkRVUExJQ0FURV9OT05DRV9OT05FKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkwLmZpbmROb25jZSgyNTU1OSwgKmZhY2UyKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfTk9ORSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5MC5maW5kTm9uY2UoMTkwMDQsICpmYWNlMSksIHBpdDo6RFVQTElDQVRFX05PTkNFX05PTkUpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTAuZmluZE5vbmNlKDE5MDA0LCAqZmFjZTIpLCBwaXQ6OkRVUExJQ0FURV9OT05DRV9OT05FKTsKKworICBwaXQ6OkVudHJ5IGVudHJ5MSgqaW50ZXJlc3QpOworICBlbnRyeTEuaW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMSwgKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkxLmZpbmROb25jZSgyNTU1OSwgKmZhY2UxKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfSU5fU0FNRSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5MS5maW5kTm9uY2UoMjU1NTksICpmYWNlMiksIHBpdDo6RFVQTElDQVRFX05PTkNFX0lOX09USEVSKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkxLmZpbmROb25jZSgxOTAwNCwgKmZhY2UxKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfTk9ORSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5MS5maW5kTm9uY2UoMTkwMDQsICpmYWNlMiksIHBpdDo6RFVQTElDQVRFX05PTkNFX05PTkUpOworCisgIHBpdDo6RW50cnkgZW50cnkyKCppbnRlcmVzdCk7CisgIGVudHJ5Mi5pbnNlcnRPclVwZGF0ZU91dFJlY29yZChmYWNlMSwgKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkyLmZpbmROb25jZSgyNTU1OSwgKmZhY2UxKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfT1VUX1NBTUUpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTIuZmluZE5vbmNlKDI1NTU5LCAqZmFjZTIpLCBwaXQ6OkRVUExJQ0FURV9OT05DRV9PVVRfT1RIRVIpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTIuZmluZE5vbmNlKDE5MDA0LCAqZmFjZTEpLCBwaXQ6OkRVUExJQ0FURV9OT05DRV9OT05FKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkyLmZpbmROb25jZSgxOTAwNCwgKmZhY2UyKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfTk9ORSk7CisKKyAgcGl0OjpFbnRyeSBlbnRyeTMoKmludGVyZXN0KTsKKyAgZW50cnkzLmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTEsICppbnRlcmVzdCk7CisgIGVudHJ5My5pbnNlcnRPclVwZGF0ZU91dFJlY29yZChmYWNlMSwgKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkzLmZpbmROb25jZSgyNTU1OSwgKmZhY2UxKSwKKyAgICAgICAgICAgICAgICAgICAgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfSU5fU0FNRSB8IHBpdDo6RFVQTElDQVRFX05PTkNFX09VVF9TQU1FKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkzLmZpbmROb25jZSgyNTU1OSwgKmZhY2UyKSwKKyAgICAgICAgICAgICAgICAgICAgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfSU5fT1RIRVIgfCBwaXQ6OkRVUExJQ0FURV9OT05DRV9PVVRfT1RIRVIpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTMuZmluZE5vbmNlKDE5MDA0LCAqZmFjZTEpLCBwaXQ6OkRVUExJQ0FURV9OT05DRV9OT05FKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkzLmZpbmROb25jZSgxOTAwNCwgKmZhY2UyKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfTk9ORSk7CisKKyAgcGl0OjpFbnRyeSBlbnRyeTQoKmludGVyZXN0KTsKKyAgZW50cnk0Lmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTEsICppbnRlcmVzdCk7CisgIGVudHJ5NC5pbnNlcnRPclVwZGF0ZUluUmVjb3JkKGZhY2UyLCAqaW50ZXJlc3QpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTQuZmluZE5vbmNlKDI1NTU5LCAqZmFjZTEpLAorICAgICAgICAgICAgICAgICAgICBwaXQ6OkRVUExJQ0FURV9OT05DRV9JTl9TQU1FIHwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfSU5fT1RIRVIpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTQuZmluZE5vbmNlKDI1NTU5LCAqZmFjZTIpLAorICAgICAgICAgICAgICAgICAgICBwaXQ6OkRVUExJQ0FURV9OT05DRV9JTl9TQU1FIHwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfSU5fT1RIRVIpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTQuZmluZE5vbmNlKDE5MDA0LCAqZmFjZTEpLCBwaXQ6OkRVUExJQ0FURV9OT05DRV9OT05FKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnk0LmZpbmROb25jZSgxOTAwNCwgKmZhY2UyKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfTk9ORSk7CisKKyAgcGl0OjpFbnRyeSBlbnRyeTUoKmludGVyZXN0KTsKKyAgZW50cnk1Lmluc2VydE9yVXBkYXRlT3V0UmVjb3JkKGZhY2UxLCAqaW50ZXJlc3QpOworICBlbnRyeTUuaW5zZXJ0T3JVcGRhdGVPdXRSZWNvcmQoZmFjZTIsICppbnRlcmVzdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5NS5maW5kTm9uY2UoMjU1NTksICpmYWNlMSksCisgICAgICAgICAgICAgICAgICAgIHBpdDo6RFVQTElDQVRFX05PTkNFX09VVF9TQU1FIHwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfT1VUX09USEVSKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnk1LmZpbmROb25jZSgyNTU1OSwgKmZhY2UyKSwKKyAgICAgICAgICAgICAgICAgICAgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfT1VUX1NBTUUgfCBwaXQ6OkRVUExJQ0FURV9OT05DRV9PVVRfT1RIRVIpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeTUuZmluZE5vbmNlKDE5MDA0LCAqZmFjZTEpLCBwaXQ6OkRVUExJQ0FURV9OT05DRV9OT05FKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnk1LmZpbmROb25jZSgxOTAwNCwgKmZhY2UyKSwgcGl0OjpEVVBMSUNBVEVfTk9OQ0VfTk9ORSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVudHJ5TGlmZXRpbWUpCit7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZUludGVyZXN0KCJuZG46LzdvSUV1cmJneTYiKTsKKyAgLy8gbGlicmFyeSB1c2VzIC0xIHRvIGluZGljYXRlIHVuc2V0IGxpZmV0aW1lCisgIEJPT1NUX0FTU0VSVChpbnRlcmVzdC0+Z2V0SW50ZXJlc3RMaWZldGltZSgpIDwgdGltZTo6bWlsbGlzZWNvbmRzOjp6ZXJvKCkpOworCisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZSA9IG1ha2Vfc2hhcmVkPER1bW15RmFjZT4oKTsKKyAgcGl0OjpFbnRyeSBlbnRyeSgqaW50ZXJlc3QpOworCisgIHBpdDo6SW5SZWNvcmRDb2xsZWN0aW9uOjppdGVyYXRvciBpbkl0ID0gZW50cnkuaW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlLCAqaW50ZXJlc3QpOworICBCT09TVF9DSEVDS19HVChpbkl0LT5nZXRFeHBpcnkoKSwgdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSk7CisKKyAgcGl0OjpPdXRSZWNvcmRDb2xsZWN0aW9uOjppdGVyYXRvciBvdXRJdCA9IGVudHJ5Lmluc2VydE9yVXBkYXRlT3V0UmVjb3JkKGZhY2UsICppbnRlcmVzdCk7CisgIEJPT1NUX0NIRUNLX0dUKG91dEl0LT5nZXRFeHBpcnkoKSwgdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVudHJ5Q2FuRm9yd2FyZFRvKQoreworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2VJbnRlcmVzdCgibmRuOi9XRHN1QkxJTUciKTsKKyAgcGl0OjpFbnRyeSBlbnRyeSgqaW50ZXJlc3QpOworCisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTEgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisgIHNoYXJlZF9wdHI8RmFjZT4gZmFjZTIgPSBtYWtlX3NoYXJlZDxEdW1teUZhY2U+KCk7CisKKyAgZW50cnkuaW5zZXJ0T3JVcGRhdGVJblJlY29yZChmYWNlMSwgKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkuY2FuRm9yd2FyZFRvKCpmYWNlMSksIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkuY2FuRm9yd2FyZFRvKCpmYWNlMiksIHRydWUpOworCisgIGVudHJ5Lmluc2VydE9yVXBkYXRlSW5SZWNvcmQoZmFjZTIsICppbnRlcmVzdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LmNhbkZvcndhcmRUbygqZmFjZTEpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkuY2FuRm9yd2FyZFRvKCpmYWNlMiksIHRydWUpOworCisgIGVudHJ5Lmluc2VydE9yVXBkYXRlT3V0UmVjb3JkKGZhY2UxLCAqaW50ZXJlc3QpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS5jYW5Gb3J3YXJkVG8oKmZhY2UxKSwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS5jYW5Gb3J3YXJkVG8oKmZhY2UyKSwgdHJ1ZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEluc2VydCkKK3sKKyAgTmFtZSBuYW1lMSgibmRuOi81dnpCTm5Nc3QiKTsKKyAgTmFtZSBuYW1lMigibmRuOi9pZ1NHZkVJTTYyIik7CisgIEV4Y2x1ZGUgZXhjbHVkZTE7CisgIGV4Y2x1ZGUxLmV4Y2x1ZGVPbmUoTmFtZTo6Q29tcG9uZW50KCJ1MjZwNDdvZXAiKSk7CisgIEV4Y2x1ZGUgZXhjbHVkZTI7CisgIGV4Y2x1ZGUyLmV4Y2x1ZGVCZWZvcmUoTmFtZTo6Q29tcG9uZW50KCJ1MjZwNDdvZXAiKSk7CisgIG5kbjo6S2V5TG9jYXRvciBrZXlMb2NhdG9yMSgibmRuOi9zR0FFM3BlTUhBIik7CisgIG5kbjo6S2V5TG9jYXRvciBrZXlMb2NhdG9yMigibmRuOi9uSUpINnByNCIpOworCisgIE5hbWVUcmVlIG5hbWVUcmVlKDE2KTsKKyAgUGl0IHBpdChuYW1lVHJlZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDApOworICBzdGQ6OnBhaXI8c2hhcmVkX3B0cjxwaXQ6OkVudHJ5PiwgYm9vbD4gaW5zZXJ0UmVzdWx0OworCisgIC8vIGJhc2UKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RBID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KG5hbWUxKTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RBKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDEpOworCisgIC8vIEErTWluU3VmZml4Q29tcG9uZW50cworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEIgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oKmludGVyZXN0QSk7CisgIGludGVyZXN0Qi0+c2V0TWluU3VmZml4Q29tcG9uZW50cygyKTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDIpOworCisgIC8vIEErTWF4U3VmZml4Q29tcG9uZW50cworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEMgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oKmludGVyZXN0QSk7CisgIGludGVyZXN0Qy0+c2V0TWF4U3VmZml4Q29tcG9uZW50cyg0KTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RDKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDMpOworCisgIC8vIEErS2V5TG9jYXRvcjEKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3REID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCppbnRlcmVzdEEpOworICBpbnRlcmVzdEQtPnNldFB1Ymxpc2hlclB1YmxpY0tleUxvY2F0b3Ioa2V5TG9jYXRvcjEpOworICBpbnNlcnRSZXN1bHQgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdEQpOworICBCT09TVF9DSEVDS19FUVVBTChpbnNlcnRSZXN1bHQuc2Vjb25kLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGl0LnNpemUoKSwgNCk7CisKKyAgLy8gQStLZXlMb2NhdG9yMgorICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEUgPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oKmludGVyZXN0QSk7CisgIGludGVyZXN0RS0+c2V0UHVibGlzaGVyUHVibGljS2V5TG9jYXRvcihrZXlMb2NhdG9yMik7CisgIGluc2VydFJlc3VsdCA9IHBpdC5pbnNlcnQoKmludGVyZXN0RSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluc2VydFJlc3VsdC5zZWNvbmQsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChwaXQuc2l6ZSgpLCA1KTsKKworICAvLyBBK0V4Y2x1ZGUxCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0RiA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigqaW50ZXJlc3RBKTsKKyAgaW50ZXJlc3RGLT5zZXRFeGNsdWRlKGV4Y2x1ZGUxKTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RGKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDYpOworCisgIC8vIEErRXhjbHVkZTIKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RHID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCppbnRlcmVzdEEpOworICBpbnRlcmVzdEctPnNldEV4Y2x1ZGUoZXhjbHVkZTIpOworICBpbnNlcnRSZXN1bHQgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdEcpOworICBCT09TVF9DSEVDS19FUVVBTChpbnNlcnRSZXN1bHQuc2Vjb25kLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGl0LnNpemUoKSwgNyk7CisKKyAgLy8gQStDaGlsZFNlbGVjdG9yMAorICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEggPSBtYWtlX3NoYXJlZDxJbnRlcmVzdD4oKmludGVyZXN0QSk7CisgIGludGVyZXN0SC0+c2V0Q2hpbGRTZWxlY3RvcigwKTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RIKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDgpOworCisgIC8vIEErQ2hpbGRTZWxlY3RvcjEKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RJID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCppbnRlcmVzdEEpOworICBpbnRlcmVzdEktPnNldENoaWxkU2VsZWN0b3IoMSk7CisgIGluc2VydFJlc3VsdCA9IHBpdC5pbnNlcnQoKmludGVyZXN0SSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluc2VydFJlc3VsdC5zZWNvbmQsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChwaXQuc2l6ZSgpLCA5KTsKKworICAvLyBBK011c3RCZUZyZXNoCisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0SiA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PigqaW50ZXJlc3RBKTsKKyAgaW50ZXJlc3RKLT5zZXRNdXN0QmVGcmVzaCh0cnVlKTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RKKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDEwKTsKKworICAvLyBBK0ludGVyZXN0TGlmZXRpbWUKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RLID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCppbnRlcmVzdEEpOworICBpbnRlcmVzdEstPnNldEludGVyZXN0TGlmZXRpbWUodGltZTo6bWlsbGlzZWNvbmRzKDEwMDApKTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RLKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgZmFsc2UpOy8vIG9ubHkgZ3VpZGVycyBkaWZmZXIKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGl0LnNpemUoKSwgMTApOworCisgIC8vIEErTm9uY2UKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RMID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KCppbnRlcmVzdEEpOworICBpbnRlcmVzdEwtPnNldE5vbmNlKDIxOTIpOworICBpbnNlcnRSZXN1bHQgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdEwpOworICBCT09TVF9DSEVDS19FUVVBTChpbnNlcnRSZXN1bHQuc2Vjb25kLCBmYWxzZSk7Ly8gb25seSBndWlkZXJzIGRpZmZlcgorICBCT09TVF9DSEVDS19FUVVBTChwaXQuc2l6ZSgpLCAxMCk7CisKKyAgLy8gZGlmZmVyZW50IE5hbWUrRXhjbHVkZTEKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RNID0gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KG5hbWUyKTsKKyAgaW50ZXJlc3RNLT5zZXRFeGNsdWRlKGV4Y2x1ZGUxKTsKKyAgaW5zZXJ0UmVzdWx0ID0gcGl0Lmluc2VydCgqaW50ZXJlc3RNKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDExKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRXJhc2UpCit7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0ID0gbWFrZUludGVyZXN0KCIvejg4QWRtejZBMiIpOworCisgIE5hbWVUcmVlIG5hbWVUcmVlKDE2KTsKKyAgUGl0IHBpdChuYW1lVHJlZSk7CisKKyAgc3RkOjpwYWlyPHNoYXJlZF9wdHI8cGl0OjpFbnRyeT4sIGJvb2w+IGluc2VydFJlc3VsdDsKKworICBCT09TVF9DSEVDS19FUVVBTChwaXQuc2l6ZSgpLCAwKTsKKworICBpbnNlcnRSZXN1bHQgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluc2VydFJlc3VsdC5zZWNvbmQsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChwaXQuc2l6ZSgpLCAxKTsKKworICBpbnNlcnRSZXN1bHQgPSBwaXQuaW5zZXJ0KCppbnRlcmVzdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGluc2VydFJlc3VsdC5zZWNvbmQsIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGl0LnNpemUoKSwgMSk7CisKKyAgcGl0LmVyYXNlKGluc2VydFJlc3VsdC5maXJzdCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDApOworCisgIGluc2VydFJlc3VsdCA9IHBpdC5pbnNlcnQoKmludGVyZXN0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaW5zZXJ0UmVzdWx0LnNlY29uZCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDEpOworCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVyYXNlTmFtZVRyZWVFbnRyeSkKK3sKKyAgTmFtZVRyZWUgbmFtZVRyZWU7CisgIFBpdCBwaXQobmFtZVRyZWUpOworICBzaXplX3Qgbk5hbWVUcmVlRW50cmllc0JlZm9yZSA9IG5hbWVUcmVlLnNpemUoKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2VJbnRlcmVzdCgiLzM3eFdWdlEySyIpOworICBzaGFyZWRfcHRyPHBpdDo6RW50cnk+IGVudHJ5ID0gcGl0Lmluc2VydCgqaW50ZXJlc3QpLmZpcnN0OworICBwaXQuZXJhc2UoZW50cnkpOworICBCT09TVF9DSEVDS19FUVVBTChuYW1lVHJlZS5zaXplKCksIG5OYW1lVHJlZUVudHJpZXNCZWZvcmUpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShGaW5kQWxsRGF0YU1hdGNoZXMpCit7CisgIE5hbWUgbmFtZUEgICAoIm5kbjovQSIpOworICBOYW1lIG5hbWVBQiAgKCJuZG46L0EvQiIpOworICBOYW1lIG5hbWVBQkMgKCJuZG46L0EvQi9DIik7CisgIE5hbWUgbmFtZUFCQ0QoIm5kbjovQS9CL0MvRCIpOworICBOYW1lIG5hbWVEICAgKCJuZG46L0QiKTsKKworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEEgICA9IG1ha2VJbnRlcmVzdChuYW1lQSAgKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RBQkMgPSBtYWtlSW50ZXJlc3QobmFtZUFCQyk7CisgIHNoYXJlZF9wdHI8SW50ZXJlc3Q+IGludGVyZXN0RCAgID0gbWFrZUludGVyZXN0KG5hbWVEICApOworCisgIE5hbWVUcmVlIG5hbWVUcmVlKDE2KTsKKyAgUGl0IHBpdChuYW1lVHJlZSk7CisgIGludCBjb3VudCA9IDA7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGl0LnNpemUoKSwgMCk7CisKKyAgcGl0Lmluc2VydCgqaW50ZXJlc3RBICApOworICBwaXQuaW5zZXJ0KCppbnRlcmVzdEFCQyk7CisgIHBpdC5pbnNlcnQoKmludGVyZXN0RCAgKTsKKworICBuYW1lVHJlZS5sb29rdXAobmFtZUFCQ0QpOyAvLyBtYWtlIHN1cmUgL0EvQi9DL0QgaXMgaW4gbmFtZVRyZWUKKworICBCT09TVF9DSEVDS19FUVVBTChwaXQuc2l6ZSgpLCAzKTsKKworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlRGF0YShuYW1lQUJDRCk7CisKKyAgcGl0OjpEYXRhTWF0Y2hSZXN1bHQgbWF0Y2hlcyA9IHBpdC5maW5kQWxsRGF0YU1hdGNoZXMoKmRhdGEpOworCisgIGJvb2wgaGFzQSAgID0gZmFsc2U7CisgIGJvb2wgaGFzQUIgID0gZmFsc2U7CisgIGJvb2wgaGFzQUJDID0gZmFsc2U7CisgIGJvb2wgaGFzRCAgID0gZmFsc2U7CisKKyAgZm9yIChjb25zdCBzaGFyZWRfcHRyPHBpdDo6RW50cnk+JiBlbnRyeSA6IG1hdGNoZXMpIHsKKyAgICArK2NvdW50OworCisgICAgaWYgKGVudHJ5LT5nZXROYW1lKCkuZXF1YWxzKG5hbWVBICkpCisgICAgICBoYXNBICAgPSB0cnVlOworCisgICAgaWYgKGVudHJ5LT5nZXROYW1lKCkuZXF1YWxzKG5hbWVBQikpCisgICAgICBoYXNBQiAgPSB0cnVlOworCisgICAgaWYgKGVudHJ5LT5nZXROYW1lKCkuZXF1YWxzKG5hbWVBQkMpKQorICAgICAgaGFzQUJDID0gdHJ1ZTsKKworICAgIGlmIChlbnRyeS0+Z2V0TmFtZSgpLmVxdWFscyhuYW1lRCkpCisgICAgICBoYXNEICAgPSB0cnVlOworICB9CisgIEJPT1NUX0NIRUNLX0VRVUFMKGhhc0EgICwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGhhc0FCICwgZmFsc2UpOworICBCT09TVF9DSEVDS19FUVVBTChoYXNBQkMsIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChoYXNEICAsIGZhbHNlKTsKKworICBCT09TVF9DSEVDS19FUVVBTChjb3VudCwgMik7CisKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSXRlcmF0b3IpCit7CisgIE5hbWVUcmVlIG5hbWVUcmVlKDE2KTsKKyAgUGl0IHBpdChuYW1lVHJlZSk7CisKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RBICAgID0gbWFrZUludGVyZXN0KCIvQSIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEFCQzEgPSBtYWtlSW50ZXJlc3QoIi9BL0IvQyIpOworICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdEFCQzIgPSBtYWtlSW50ZXJlc3QoIi9BL0IvQyIpOworICBpbnRlcmVzdEFCQzItPnNldFNlbGVjdG9ycyhuZG46OlNlbGVjdG9ycygpLnNldE1pblN1ZmZpeENvbXBvbmVudHMoMTApKTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3REICAgID0gbWFrZUludGVyZXN0KCIvRCIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDApOworICBCT09TVF9DSEVDSyhwaXQuYmVnaW4oKSA9PSBwaXQuZW5kKCkpOworCisgIHBpdC5pbnNlcnQoKmludGVyZXN0QUJDMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHBpdC5zaXplKCksIDEpOworICBCT09TVF9DSEVDSyhwaXQuYmVnaW4oKSAhPSBwaXQuZW5kKCkpOworICBCT09TVF9DSEVDSyhwaXQuYmVnaW4oKS0+Z2V0SW50ZXJlc3QoKSA9PSAqaW50ZXJlc3RBQkMxKTsKKyAgQk9PU1RfQ0hFQ0soKCpwaXQuYmVnaW4oKSkuZ2V0SW50ZXJlc3QoKSA9PSAqaW50ZXJlc3RBQkMxKTsKKworICBhdXRvIGkgPSBwaXQuYmVnaW4oKTsKKyAgYXV0byBqID0gcGl0LmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLKCsraSA9PSBwaXQuZW5kKCkpOworICBCT09TVF9DSEVDSyhqKysgPT0gcGl0LmJlZ2luKCkpOworICBCT09TVF9DSEVDSyhqID09IHBpdC5lbmQoKSk7CisKKyAgcGl0Lmluc2VydCgqaW50ZXJlc3RBKTsKKyAgcGl0Lmluc2VydCgqaW50ZXJlc3RBQkMyKTsKKyAgcGl0Lmluc2VydCgqaW50ZXJlc3REKTsKKworICBzdGQ6OnNldDxjb25zdCBJbnRlcmVzdCo+IGV4cGVjdGVkID0geyYqaW50ZXJlc3RBLCAmKmludGVyZXN0QUJDMSwgJippbnRlcmVzdEFCQzIsICYqaW50ZXJlc3REfTsKKyAgc3RkOjpzZXQ8Y29uc3QgSW50ZXJlc3QqPiBhY3R1YWw7CisgIGZvciAoY29uc3QgYXV0byYgcGl0RW50cnkgOiBwaXQpIHsKKyAgICBhY3R1YWwuaW5zZXJ0KCZwaXRFbnRyeS5nZXRJbnRlcmVzdCgpKTsKKyAgfQorICBCT09TVF9DSEVDSyhhY3R1YWwgPT0gZXhwZWN0ZWQpOworICBmb3IgKGF1dG8gYWN0dWFsSXQgPSBhY3R1YWwuYmVnaW4oKSwgZXhwZWN0ZWRJdCA9IGV4cGVjdGVkLmJlZ2luKCk7CisgICAgICAgYWN0dWFsSXQgIT0gYWN0dWFsLmVuZCgpICYmIGV4cGVjdGVkSXQgIT0gZXhwZWN0ZWQuZW5kKCk7ICsrYWN0dWFsSXQsICsrZXhwZWN0ZWRJdCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKCoqYWN0dWFsSXQsICoqZXhwZWN0ZWRJdCk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9kYWVtb24vdGFibGUvc3RyYXRlZ3ktY2hvaWNlLmNwcCBiL05GRC90ZXN0cy9kYWVtb24vdGFibGUvc3RyYXRlZ3ktY2hvaWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRjNzZiCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9zdHJhdGVneS1jaG9pY2UuY3BwCkBAIC0wLDAgKzEsMzExIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAidGFibGUvc3RyYXRlZ3ktY2hvaWNlLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9kYWVtb24vZncvZHVtbXktc3RyYXRlZ3kuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUYWJsZVN0cmF0ZWd5Q2hvaWNlLCBCYXNlRml4dHVyZSkKKwordXNpbmcgZnc6OlN0cmF0ZWd5OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShHZXQpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIE5hbWUgbmFtZVAoIm5kbjovc3RyYXRlZ3kvUCIpOworICBzaGFyZWRfcHRyPFN0cmF0ZWd5PiBzdHJhdGVneVAgPSBtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PihyZWYoZm9yd2FyZGVyKSwgbmFtZVApOworCisgIFN0cmF0ZWd5Q2hvaWNlJiB0YWJsZSA9IGZvcndhcmRlci5nZXRTdHJhdGVneUNob2ljZSgpOworCisgIC8vIGluc3RhbGwKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuaW5zdGFsbChzdHJhdGVneVApLCB0cnVlKTsKKworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVApKTsKKyAgLy8geyAnLyc9PlAgfQorCisgIGF1dG8gZ2V0Um9vdCA9IHRhYmxlLmdldCgibmRuOi8iKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2V0Um9vdC5maXJzdCwgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdldFJvb3Quc2Vjb25kLCBuYW1lUCk7CisKKyAgYXV0byBnZXRBID0gdGFibGUuZ2V0KCJuZG46L0EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2V0QS5maXJzdCwgZmFsc2UpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFZmZlY3RpdmUpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIE5hbWUgbmFtZVAoIm5kbjovc3RyYXRlZ3kvUCIpOworICBOYW1lIG5hbWVRKCJuZG46L3N0cmF0ZWd5L1EiKTsKKyAgTmFtZSBuYW1lWigibmRuOi9zdHJhdGVneS9aIik7CisgIHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5UCA9IG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihmb3J3YXJkZXIpLCBuYW1lUCk7CisgIHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5USA9IG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihmb3J3YXJkZXIpLCBuYW1lUSk7CisKKyAgU3RyYXRlZ3lDaG9pY2UmIHRhYmxlID0gZm9yd2FyZGVyLmdldFN0cmF0ZWd5Q2hvaWNlKCk7CisKKyAgLy8gaW5zdGFsbAorICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5pbnN0YWxsKHN0cmF0ZWd5UCksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5pbnN0YWxsKHN0cmF0ZWd5USksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5pbnN0YWxsKHN0cmF0ZWd5USksIGZhbHNlKTsKKworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVApKTsKKyAgLy8geyAnLyc9PlAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi8iKSAgIC5nZXROYW1lKCksIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46L0EiKSAgLmdldE5hbWUoKSwgbmFtZVApOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIm5kbjovQS9CIikuZ2V0TmFtZSgpLCBuYW1lUCk7CisKKyAgQk9PU1RfQ0hFQ0sodGFibGUuaW5zZXJ0KCJuZG46L0EvQiIsIG5hbWVQKSk7CisgIC8vIHsgJy8nPT5QLCAnL0EvQic9PlAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi8iKSAgIC5nZXROYW1lKCksIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46L0EiKSAgLmdldE5hbWUoKSwgbmFtZVApOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIm5kbjovQS9CIikuZ2V0TmFtZSgpLCBuYW1lUCk7CisgIC8vIHNhbWUgaW5zdGFuY2UKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoJnRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi8iKSwgICAgc3RyYXRlZ3lQLmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoJnRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi9BIiksICAgc3RyYXRlZ3lQLmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoJnRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi9BL0IiKSwgc3RyYXRlZ3lQLmdldCgpKTsKKworICB0YWJsZS5lcmFzZSgibmRuOi9BIik7IC8vIG5vIGVmZmVjdAorICAvLyB7ICcvJz0+UCwgJy9BL0InPT5QIH0KKworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIm5kbjovIikgICAuZ2V0TmFtZSgpLCBuYW1lUCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi9BIikgIC5nZXROYW1lKCksIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46L0EvQiIpLmdldE5hbWUoKSwgbmFtZVApOworCisgIEJPT1NUX0NIRUNLKHRhYmxlLmluc2VydCgibmRuOi9BIiwgbmFtZVEpKTsKKyAgLy8geyAnLyc9PlAsICcvQS9CJz0+UCwgJy9BJz0+USB9CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46LyIpICAgLmdldE5hbWUoKSwgbmFtZVApOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIm5kbjovQSIpICAuZ2V0TmFtZSgpLCBuYW1lUSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi9BL0IiKS5nZXROYW1lKCksIG5hbWVQKTsKKworICB0YWJsZS5lcmFzZSgibmRuOi9BL0IiKTsKKyAgLy8geyAnLyc9PlAsICcvQSc9PlEgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi8iKSAgIC5nZXROYW1lKCksIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46L0EiKSAgLmdldE5hbWUoKSwgbmFtZVEpOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIm5kbjovQS9CIikuZ2V0TmFtZSgpLCBuYW1lUSk7CisKKyAgQk9PU1RfQ0hFQ0soIXRhYmxlLmluc2VydCgibmRuOi8iLCBuYW1lWikpOyAvLyBub24gZXhpc3RlbnQgc3RyYXRlZ3kKKworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVEpKTsKKyAgQk9PU1RfQ0hFQ0sodGFibGUuaW5zZXJ0KCJuZG46L0EiLCBuYW1lUCkpOworICAvLyB7ICcvJz0+USwgJy9BJz0+UCB9CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46LyIpICAgLmdldE5hbWUoKSwgbmFtZVEpOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIm5kbjovQSIpICAuZ2V0TmFtZSgpLCBuYW1lUCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi9BL0IiKS5nZXROYW1lKCksIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46L0QiKSAgLmdldE5hbWUoKSwgbmFtZVEpOworfQorCisvL1hYWCBCT09TVF9DT05DRVBUX0FTU0VSVCgoRm9yd2FyZEl0ZXJhdG9yPHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yPikpCisvLyAgICBpcyBhbHNvIGZhaWxpbmcuIFRoZXJlIG1pZ2h0IGJlIGEgcHJvYmxlbSB3aXRoIEZvcndhcmRJdGVyYXRvciBjb25jZXB0IGNoZWNraW5nLgorLy9CT09TVF9DT05DRVBUX0FTU0VSVCgoRm9yd2FyZEl0ZXJhdG9yPFN0cmF0ZWd5Q2hvaWNlOjpjb25zdF9pdGVyYXRvcj4pKTsKKworQk9PU1RfQVVUT19URVNUX0NBU0UoRW51bWVyYXRlKQoreworCisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIE5hbWUgbmFtZVAoIm5kbjovc3RyYXRlZ3kvUCIpOworICBOYW1lIG5hbWVRKCJuZG46L3N0cmF0ZWd5L1EiKTsKKyAgc2hhcmVkX3B0cjxTdHJhdGVneT4gc3RyYXRlZ3lQID0gbWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKGZvcndhcmRlciksIG5hbWVQKTsKKyAgc2hhcmVkX3B0cjxTdHJhdGVneT4gc3RyYXRlZ3lRID0gbWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKGZvcndhcmRlciksIG5hbWVRKTsKKworICBTdHJhdGVneUNob2ljZSYgdGFibGUgPSBmb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKyAgdGFibGUuaW5zdGFsbChzdHJhdGVneVApOworICB0YWJsZS5pbnN0YWxsKHN0cmF0ZWd5USk7CisKKyAgdGFibGUuaW5zZXJ0KCJuZG46LyIsICAgICAgbmFtZVApOworICB0YWJsZS5pbnNlcnQoIm5kbjovQS9CIiwgICBuYW1lUSk7CisgIHRhYmxlLmluc2VydCgibmRuOi9BL0IvQyIsIG5hbWVQKTsKKyAgdGFibGUuaW5zZXJ0KCJuZG46L0QiLCAgICAgbmFtZVApOworICB0YWJsZS5pbnNlcnQoIm5kbjovRSIsICAgICBuYW1lUSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuc2l6ZSgpLCA1KTsKKworICBzdGQ6Om1hcDxOYW1lLCBOYW1lPiBtYXA7IC8vIG5hbWVzcGFjZT0+c3RyYXRlZ3lOYW1lCisgIGZvciAoU3RyYXRlZ3lDaG9pY2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFibGUuYmVnaW4oKTsgaXQgIT0gdGFibGUuZW5kKCk7ICsraXQpIHsKKyAgICBtYXBbaXQtPmdldFByZWZpeCgpXSA9IGl0LT5nZXRTdHJhdGVneU5hbWUoKTsKKyAgfQorICBCT09TVF9DSEVDS19FUVVBTChtYXAuc2l6ZSgpLCA1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWFwWyJuZG46LyJdLCAgICAgIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWFwWyJuZG46L0EvQiJdLCAgIG5hbWVRKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWFwWyJuZG46L0EvQi9DIl0sIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWFwWyJuZG46L0QiXSwgICAgIG5hbWVQKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWFwWyJuZG46L0UiXSwgICAgIG5hbWVRKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWFwLnNpemUoKSwgNSk7Cit9CisKK2NsYXNzIFBTdHJhdGVneUluZm8gOiBwdWJsaWMgZnc6OlN0cmF0ZWd5SW5mbworeworcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGludAorICBnZXRUeXBlSWQoKQorICB7CisgICAgcmV0dXJuIDEwOworICB9Cit9OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDbGVhclN0cmF0ZWd5SW5mbykKK3sKKyAgRm9yd2FyZGVyIGZvcndhcmRlcjsKKyAgTmFtZSBuYW1lUCgibmRuOi9zdHJhdGVneS9QIik7CisgIE5hbWUgbmFtZVEoIm5kbjovc3RyYXRlZ3kvUSIpOworICBzaGFyZWRfcHRyPFN0cmF0ZWd5PiBzdHJhdGVneVAgPSBtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PihyZWYoZm9yd2FyZGVyKSwgbmFtZVApOworICBzaGFyZWRfcHRyPFN0cmF0ZWd5PiBzdHJhdGVneVEgPSBtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PihyZWYoZm9yd2FyZGVyKSwgbmFtZVEpOworCisgIFN0cmF0ZWd5Q2hvaWNlJiB0YWJsZSA9IGZvcndhcmRlci5nZXRTdHJhdGVneUNob2ljZSgpOworICBNZWFzdXJlbWVudHMmIG1lYXN1cmVtZW50cyA9IGZvcndhcmRlci5nZXRNZWFzdXJlbWVudHMoKTsKKworICAvLyBpbnN0YWxsCisgIHRhYmxlLmluc3RhbGwoc3RyYXRlZ3lQKTsKKyAgdGFibGUuaW5zdGFsbChzdHJhdGVneVEpOworCisgIEJPT1NUX0NIRUNLKHRhYmxlLmluc2VydCgibmRuOi8iLCBuYW1lUCkpOworICAvLyB7ICcvJz0+UCB9CisgIG1lYXN1cmVtZW50cy5nZXQoIm5kbjovIikgICAgIC0+Z2V0T3JDcmVhdGVTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKTsKKyAgbWVhc3VyZW1lbnRzLmdldCgibmRuOi9BIikgICAgLT5nZXRPckNyZWF0ZVN0cmF0ZWd5SW5mbzxQU3RyYXRlZ3lJbmZvPigpOworICBtZWFzdXJlbWVudHMuZ2V0KCJuZG46L0EvQiIpICAtPmdldE9yQ3JlYXRlU3RyYXRlZ3lJbmZvPFBTdHJhdGVneUluZm8+KCk7CisgIG1lYXN1cmVtZW50cy5nZXQoIm5kbjovQS9DIikgIC0+Z2V0T3JDcmVhdGVTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKTsKKworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovQS9CIiwgbmFtZVApKTsKKyAgLy8geyAnLyc9PlAsICcvQS9CJz0+UCB9CisgIEJPT1NUX0NIRUNLKCBzdGF0aWNfY2FzdDxib29sPihtZWFzdXJlbWVudHMuZ2V0KCJuZG46LyIpICAgLT5nZXRTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKSkpOworICBCT09TVF9DSEVDSyggc3RhdGljX2Nhc3Q8Ym9vbD4obWVhc3VyZW1lbnRzLmdldCgibmRuOi9BIikgIC0+Z2V0U3RyYXRlZ3lJbmZvPFBTdHJhdGVneUluZm8+KCkpKTsKKyAgQk9PU1RfQ0hFQ0soIHN0YXRpY19jYXN0PGJvb2w+KG1lYXN1cmVtZW50cy5nZXQoIm5kbjovQS9CIiktPmdldFN0cmF0ZWd5SW5mbzxQU3RyYXRlZ3lJbmZvPigpKSk7CisgIEJPT1NUX0NIRUNLKCBzdGF0aWNfY2FzdDxib29sPihtZWFzdXJlbWVudHMuZ2V0KCJuZG46L0EvQyIpLT5nZXRTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKSkpOworCisgIEJPT1NUX0NIRUNLKHRhYmxlLmluc2VydCgibmRuOi9BIiwgbmFtZVEpKTsKKyAgLy8geyAnLyc9PlAsICcvQS9CJz0+UCwgJy9BJz0+USB9CisgIEJPT1NUX0NIRUNLKCBzdGF0aWNfY2FzdDxib29sPihtZWFzdXJlbWVudHMuZ2V0KCJuZG46LyIpICAgLT5nZXRTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKSkpOworICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4obWVhc3VyZW1lbnRzLmdldCgibmRuOi9BIikgIC0+Z2V0U3RyYXRlZ3lJbmZvPFBTdHJhdGVneUluZm8+KCkpKTsKKyAgQk9PU1RfQ0hFQ0soIHN0YXRpY19jYXN0PGJvb2w+KG1lYXN1cmVtZW50cy5nZXQoIm5kbjovQS9CIiktPmdldFN0cmF0ZWd5SW5mbzxQU3RyYXRlZ3lJbmZvPigpKSk7CisgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihtZWFzdXJlbWVudHMuZ2V0KCJuZG46L0EvQyIpLT5nZXRTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKSkpOworCisgIHRhYmxlLmVyYXNlKCJuZG46L0EvQiIpOworICAvLyB7ICcvJz0+UCwgJy9BJz0+USB9CisgIEJPT1NUX0NIRUNLKCBzdGF0aWNfY2FzdDxib29sPihtZWFzdXJlbWVudHMuZ2V0KCJuZG46LyIpICAgLT5nZXRTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKSkpOworICBCT09TVF9DSEVDSyghc3RhdGljX2Nhc3Q8Ym9vbD4obWVhc3VyZW1lbnRzLmdldCgibmRuOi9BIikgIC0+Z2V0U3RyYXRlZ3lJbmZvPFBTdHJhdGVneUluZm8+KCkpKTsKKyAgQk9PU1RfQ0hFQ0soIXN0YXRpY19jYXN0PGJvb2w+KG1lYXN1cmVtZW50cy5nZXQoIm5kbjovQS9CIiktPmdldFN0cmF0ZWd5SW5mbzxQU3RyYXRlZ3lJbmZvPigpKSk7CisgIEJPT1NUX0NIRUNLKCFzdGF0aWNfY2FzdDxib29sPihtZWFzdXJlbWVudHMuZ2V0KCJuZG46L0EvQyIpLT5nZXRTdHJhdGVneUluZm88UFN0cmF0ZWd5SW5mbz4oKSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFcmFzZU5hbWVUcmVlRW50cnkpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIE5hbWVUcmVlJiBuYW1lVHJlZSA9IGZvcndhcmRlci5nZXROYW1lVHJlZSgpOworICBTdHJhdGVneUNob2ljZSYgdGFibGUgPSBmb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKworICBOYW1lIG5hbWVQKCJuZG46L3N0cmF0ZWd5L1AiKTsKKyAgTmFtZSBuYW1lUSgibmRuOi9zdHJhdGVneS9RIik7CisgIHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5UCA9IG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihmb3J3YXJkZXIpLCBuYW1lUCk7CisgIHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5USA9IG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihmb3J3YXJkZXIpLCBuYW1lUSk7CisgIHRhYmxlLmluc3RhbGwoc3RyYXRlZ3lQKTsKKyAgdGFibGUuaW5zdGFsbChzdHJhdGVneVEpOworCisgIHRhYmxlLmluc2VydCgibmRuOi8iLCBuYW1lUCk7CisKKyAgc2l6ZV90IG5OYW1lVHJlZUVudHJpZXNCZWZvcmUgPSBuYW1lVHJlZS5zaXplKCk7CisKKyAgdGFibGUuaW5zZXJ0KCJuZG46L0EvQiIsIG5hbWVRKTsKKyAgdGFibGUuZXJhc2UoIm5kbjovQS9CIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5hbWVUcmVlLnNpemUoKSwgbk5hbWVUcmVlRW50cmllc0JlZm9yZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFZlcnNpb25pbmcpCit7CisgIEZvcndhcmRlciBmb3J3YXJkZXI7CisgIE5hbWUgbmFtZVAoIm5kbjovc3RyYXRlZ3kvUCIpOworICBOYW1lIG5hbWVQMSgibmRuOi9zdHJhdGVneS9QLyVGRCUwMSIpOworICBOYW1lIG5hbWVQMigibmRuOi9zdHJhdGVneS9QLyVGRCUwMiIpOworICBOYW1lIG5hbWUzKCJuZG46LyVGRCUwMyIpOworICBOYW1lIG5hbWU0KCJuZG46LyVGRCUwNCIpOworICBOYW1lIG5hbWVRKCJuZG46L3N0cmF0ZWd5L1EiKTsKKyAgTmFtZSBuYW1lUTUoIm5kbjovc3RyYXRlZ3kvUS8lRkQlMDUiKTsKKyAgc2hhcmVkX3B0cjxTdHJhdGVneT4gc3RyYXRlZ3lQMSA9IG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihmb3J3YXJkZXIpLCBuYW1lUDEpOworICBzaGFyZWRfcHRyPFN0cmF0ZWd5PiBzdHJhdGVneVAyID0gbWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKGZvcndhcmRlciksIG5hbWVQMik7CisgIHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5MyAgPSBtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PihyZWYoZm9yd2FyZGVyKSwgbmFtZTMpOworICBzaGFyZWRfcHRyPFN0cmF0ZWd5PiBzdHJhdGVneTQgID0gbWFrZV9zaGFyZWQ8RHVtbXlTdHJhdGVneT4ocmVmKGZvcndhcmRlciksIG5hbWU0KTsKKyAgc2hhcmVkX3B0cjxTdHJhdGVneT4gc3RyYXRlZ3lRICA9IG1ha2Vfc2hhcmVkPER1bW15U3RyYXRlZ3k+KHJlZihmb3J3YXJkZXIpLCBuYW1lUSk7CisgIHNoYXJlZF9wdHI8U3RyYXRlZ3k+IHN0cmF0ZWd5UTUgPSBtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5PihyZWYoZm9yd2FyZGVyKSwgbmFtZVE1KTsKKworICBTdHJhdGVneUNob2ljZSYgdGFibGUgPSBmb3J3YXJkZXIuZ2V0U3RyYXRlZ3lDaG9pY2UoKTsKKworICAvLyBpbnN0YWxsCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmluc3RhbGwoc3RyYXRlZ3lQMSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5pbnN0YWxsKHN0cmF0ZWd5UDEpLCBmYWxzZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmhhc1N0cmF0ZWd5KG5hbWVQLCAgZmFsc2UpLCB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuaGFzU3RyYXRlZ3kobmFtZVAsICB0cnVlKSwgIGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuaGFzU3RyYXRlZ3kobmFtZVAxLCB0cnVlKSwgIHRydWUpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmluc3RhbGwoc3RyYXRlZ3lQMiksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5pbnN0YWxsKHN0cmF0ZWd5MyksICB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuaW5zdGFsbChzdHJhdGVneTQpLCAgdHJ1ZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmluc3RhbGwoc3RyYXRlZ3lRKSwgIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5pbnN0YWxsKHN0cmF0ZWd5UTUpLCB0cnVlKTsKKworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVEpKTsKKyAgLy8gZXhhY3QgbWF0Y2gsIHsgJy8nPT5RIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46LyIpLmdldE5hbWUoKSwgbmFtZVEpOworCisgIEJPT1NUX0NIRUNLKHRhYmxlLmluc2VydCgibmRuOi8iLCBuYW1lUSkpOworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVApKTsKKyAgLy8geyAnLyc9PlAyIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46LyIpLmdldE5hbWUoKSwgbmFtZVAyKTsKKworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVEpKTsKKyAgQk9PU1RfQ0hFQ0sodGFibGUuaW5zZXJ0KCJuZG46LyIsIG5hbWVQMSkpOworICAvLyB7ICcvJz0+UDEgfQorICBCT09TVF9DSEVDS19FUVVBTCh0YWJsZS5maW5kRWZmZWN0aXZlU3RyYXRlZ3koIm5kbjovIikuZ2V0TmFtZSgpLCBuYW1lUDEpOworCisgIEJPT1NUX0NIRUNLKHRhYmxlLmluc2VydCgibmRuOi8iLCBuYW1lUSkpOworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVAyKSk7CisgIC8vIHsgJy8nPT5QMiB9CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi8iKS5nZXROYW1lKCksIG5hbWVQMik7CisKKyAgQk9PU1RfQ0hFQ0sodGFibGUuaW5zZXJ0KCJuZG46LyIsIG5hbWVRKSk7CisgIEJPT1NUX0NIRUNLKCEgdGFibGUuaW5zZXJ0KCJuZG46LyIsICJuZG46L3N0cmF0ZWd5L0EiKSk7CisgIC8vIG5vdCBpbnN0YWxsZWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46LyIpLmdldE5hbWUoKSwgbmFtZVEpOworCisgIEJPT1NUX0NIRUNLKHRhYmxlLmluc2VydCgibmRuOi8iLCBuYW1lUSkpOworICBCT09TVF9DSEVDSyghIHRhYmxlLmluc2VydCgibmRuOi8iLCAibmRuOi9zdHJhdGVneS9aIikpOworICAvLyBub3QgaW5zdGFsbGVkCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRhYmxlLmZpbmRFZmZlY3RpdmVTdHJhdGVneSgibmRuOi8iKS5nZXROYW1lKCksIG5hbWVRKTsKKworICBCT09TVF9DSEVDSyh0YWJsZS5pbnNlcnQoIm5kbjovIiwgbmFtZVAxKSk7CisgIEJPT1NUX0NIRUNLKHRhYmxlLmluc2VydCgibmRuOi8iLCAibmRuOi8iKSk7CisgIC8vIG1hdGNoIG9uZSBjb21wb25lbnQgbG9uZ2VyIG9ubHksIHsgJy8nPT40IH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodGFibGUuZmluZEVmZmVjdGl2ZVN0cmF0ZWd5KCJuZG46LyIpLmdldE5hbWUoKSwgbmFtZTQpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9zdHJhdGVneS1pbmZvLWhvc3QuY3BwIGIvTkZEL3Rlc3RzL2RhZW1vbi90YWJsZS9zdHJhdGVneS1pbmZvLWhvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGMxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZGFlbW9uL3RhYmxlL3N0cmF0ZWd5LWluZm8taG9zdC5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJ0YWJsZS9zdHJhdGVneS1pbmZvLWhvc3QuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK3VzaW5nIGZ3OjpTdHJhdGVneUluZm87CisKK3N0YXRpYyBpbnQgZ19EdW1teVN0cmF0ZWd5SW5mb19jb3VudCA9IDA7CisKK2NsYXNzIER1bW15U3RyYXRlZ3lJbmZvIDogcHVibGljIFN0cmF0ZWd5SW5mbworeworcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGludAorICBnZXRUeXBlSWQoKQorICB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBEdW1teVN0cmF0ZWd5SW5mbyhpbnQgaWQpCisgICAgOiBtX2lkKGlkKQorICB7CisgICAgKytnX0R1bW15U3RyYXRlZ3lJbmZvX2NvdW50OworICB9CisKKyAgdmlydHVhbAorICB+RHVtbXlTdHJhdGVneUluZm8oKQorICB7CisgICAgLS1nX0R1bW15U3RyYXRlZ3lJbmZvX2NvdW50OworICB9CisKKyAgaW50IG1faWQ7Cit9OworCitjbGFzcyBEdW1teVN0cmF0ZWd5SW5mbzIgOiBwdWJsaWMgU3RyYXRlZ3lJbmZvCit7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdGV4cHIgaW50CisgIGdldFR5cGVJZCgpCisgIHsKKyAgICByZXR1cm4gMjsKKyAgfQorCisgIER1bW15U3RyYXRlZ3lJbmZvMihpbnQgaWQpCisgICAgOiBtX2lkKGlkKQorICB7CisgIH0KKworICBpbnQgbV9pZDsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUYWJsZVN0cmF0ZWd5SW5mb0hvc3QsIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXRHZXRDbGVhcikKK3sKKyAgU3RyYXRlZ3lJbmZvSG9zdCBob3N0OworCisgIEJPT1NUX0NIRUNLKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpID09IG51bGxwdHIpOworCisgIGdfRHVtbXlTdHJhdGVneUluZm9fY291bnQgPSAwOworCisgIHNoYXJlZF9wdHI8RHVtbXlTdHJhdGVneUluZm8+IGluZm8gPSBtYWtlX3NoYXJlZDxEdW1teVN0cmF0ZWd5SW5mbz4oNzU5MSk7CisgIGhvc3Quc2V0U3RyYXRlZ3lJbmZvKGluZm8pOworICBCT09TVF9SRVFVSVJFKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDS19FUVVBTChob3N0LmdldFN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4oKS0+bV9pZCwgNzU5MSk7CisKKyAgaW5mby5yZXNldCgpOyAvLyB1bmxpbmsgbG9jYWwgcmVmZXJlbmNlCisgIC8vIGhvc3Qgc2hvdWxkIHN0aWxsIGhhdmUgYSByZWZlcmVuY2UgdG8gaW5mbworICBCT09TVF9SRVFVSVJFKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDS19FUVVBTChob3N0LmdldFN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4oKS0+bV9pZCwgNzU5MSk7CisKKyAgaG9zdC5jbGVhclN0cmF0ZWd5SW5mbygpOworICBCT09TVF9DSEVDSyhob3N0LmdldFN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4oKSA9PSBudWxscHRyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19EdW1teVN0cmF0ZWd5SW5mb19jb3VudCwgMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENyZWF0ZSkKK3sKKyAgU3RyYXRlZ3lJbmZvSG9zdCBob3N0OworCisgIGhvc3QuZ2V0T3JDcmVhdGVTdHJhdGVneUluZm88RHVtbXlTdHJhdGVneUluZm8+KDM1MDMpOworICBCT09TVF9SRVFVSVJFKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDS19FUVVBTChob3N0LmdldFN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4oKS0+bV9pZCwgMzUwMyk7CisKKyAgaG9zdC5nZXRPckNyZWF0ZVN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4oMTAzMik7CisgIEJPT1NUX1JFUVVJUkUoaG9zdC5nZXRTdHJhdGVneUluZm88RHVtbXlTdHJhdGVneUluZm8+KCkgIT0gbnVsbHB0cik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpLT5tX2lkLCAzNTAzKTsKKworICBob3N0LnNldFN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4obnVsbHB0cik7CisgIGhvc3QuZ2V0T3JDcmVhdGVTdHJhdGVneUluZm88RHVtbXlTdHJhdGVneUluZm8+KDk5NTYpOworICBCT09TVF9SRVFVSVJFKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDS19FUVVBTChob3N0LmdldFN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4oKS0+bV9pZCwgOTk1Nik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFR5cGVzKQoreworICBTdHJhdGVneUluZm9Ib3N0IGhvc3Q7CisKKyAgaG9zdC5nZXRPckNyZWF0ZVN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbz4oODA2Myk7CisgIEJPT1NUX1JFUVVJUkUoaG9zdC5nZXRTdHJhdGVneUluZm88RHVtbXlTdHJhdGVneUluZm8+KCkgIT0gbnVsbHB0cik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpLT5tX2lkLCA4MDYzKTsKKworICBob3N0LmdldE9yQ3JlYXRlU3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvMj4oMjg3MSk7CisgIEJPT1NUX1JFUVVJUkUoaG9zdC5nZXRTdHJhdGVneUluZm88RHVtbXlTdHJhdGVneUluZm8yPigpICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDS19FUVVBTChob3N0LmdldFN0cmF0ZWd5SW5mbzxEdW1teVN0cmF0ZWd5SW5mbzI+KCktPm1faWQsIDI4NzEpOworCisgIEJPT1NUX1JFUVVJUkUoaG9zdC5nZXRTdHJhdGVneUluZm88RHVtbXlTdHJhdGVneUluZm8+KCkgIT0gbnVsbHB0cik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGhvc3QuZ2V0U3RyYXRlZ3lJbmZvPER1bW15U3RyYXRlZ3lJbmZvPigpLT5tX2lkLCA4MDYzKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9nbG9iYWwtY29uZmlndXJhdGlvbi5jcHAgYi9ORkQvdGVzdHMvZ2xvYmFsLWNvbmZpZ3VyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGNlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvZ2xvYmFsLWNvbmZpZ3VyYXRpb24uY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJ0ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorI2luY2x1ZGUgImNvcmUvY29uZmlnLWZpbGUuaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworY2xhc3MgR2xvYmFsQ29uZmlndXJhdGlvbkZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgR2xvYmFsQ29uZmlndXJhdGlvbkZpeHR1cmUoKQorICB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSAidW5pdC10ZXN0cy5jb25mIjsKKyAgICBpZiAoYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhmaWxlbmFtZSkpCisgICAgICB7CisgICAgICAgIENvbmZpZ0ZpbGUgY29uZmlnOworICAgICAgICBMb2dnZXJGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICAgICAgICBjb25maWcucGFyc2UoZmlsZW5hbWUsIGZhbHNlKTsKKyAgICAgIH0KKyAgfQorfTsKKworQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsQ29uZmlndXJhdGlvbkZpeHR1cmUpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9pZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuY3BwIGIvTkZEL3Rlc3RzL2lkZW50aXR5LW1hbmFnZW1lbnQtZml4dHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2OGY1NAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9pZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBuZG4tY3h4IGxpYnJhcnkgKE5ETiBDKysgbGlicmFyeSB3aXRoIGVYcGVyaW1lbnRhbCBlWHRlbnNpb25zKS4KKyAqCisgKiBuZG4tY3h4IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5kbi1jeHggbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIEdOVSBMZXNzZXIKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCBuZG4tY3h4LCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZQorICogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIG5kbi1jeHggYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICovCisKKyNpbmNsdWRlICJpZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0lkZW50aXR5TWFuYWdlbWVudEZpeHR1cmU6OklkZW50aXR5TWFuYWdlbWVudEZpeHR1cmUoKQorICA6IG1fa2V5Q2hhaW4oInNxbGl0ZTMiLCAiZmlsZSIpCit7Cit9CisKK0lkZW50aXR5TWFuYWdlbWVudEZpeHR1cmU6On5JZGVudGl0eU1hbmFnZW1lbnRGaXh0dXJlKCkKK3sKKyAgZm9yIChhdXRvJiYgaWQgOiBtX2lkZW50aXRpZXMpIHsKKyAgICBtX2tleUNoYWluLmRlbGV0ZUlkZW50aXR5KGlkKTsKKyAgfQorfQorCitib29sCitJZGVudGl0eU1hbmFnZW1lbnRGaXh0dXJlOjphZGRJZGVudGl0eShjb25zdCBuZG46Ok5hbWUmIGlkZW50aXR5LCBjb25zdCBuZG46OktleVBhcmFtcyYgcGFyYW1zKQoreworICB0cnkgeworICAgIG1fa2V5Q2hhaW4uY3JlYXRlSWRlbnRpdHkoaWRlbnRpdHksIHBhcmFtcyk7CisgICAgbV9pZGVudGl0aWVzLnB1c2hfYmFjayhpZGVudGl0eSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL2lkZW50aXR5LW1hbmFnZW1lbnQtZml4dHVyZS5ocHAgYi9ORkQvdGVzdHMvaWRlbnRpdHktbWFuYWdlbWVudC1maXh0dXJlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjVjM2JjCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL2lkZW50aXR5LW1hbmFnZW1lbnQtZml4dHVyZS5ocHAKQEAgLTAsMCArMSw1NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG5kbi1jeHggbGlicmFyeSAoTkROIEMrKyBsaWJyYXJ5IHdpdGggZVhwZXJpbWVudGFsIGVYdGVuc2lvbnMpLgorICoKKyAqIG5kbi1jeHggbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbmRuLWN4eCBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgR05VIExlc3NlcgorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIG5kbi1jeHgsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlCisgKiA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgbmRuLWN4eCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKi8KKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYm9vc3QtdGVzdC5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworLyoqCisgKiBAYnJpZWYgSWRlbnRpdHlNYW5hZ2VtZW50Rml4dHVyZSBpcyBhIHRlc3Qgc3VpdGUgbGV2ZWwgZml4dHVyZS4KKyAqCisgKiBUZXN0IGNhc2VzIGluIHRoZSBzdWl0ZSBjYW4gdXNlIHRoaXMgZml4dHVyZSB0byBjcmVhdGUgaWRlbnRpdGllcy4KKyAqIElkZW50aXRpZXMgYWRkZWQgdmlhIGFkZElkZW50aXR5IG1ldGhvZCBhcmUgYXV0b21hdGljYWxseSBkZWxldGVkCisgKiBkdXJpbmcgdGVzdCB0ZWFyZG93bi4KKyAqLworY2xhc3MgSWRlbnRpdHlNYW5hZ2VtZW50Rml4dHVyZSA6IHB1YmxpYyBuZmQ6OnRlc3RzOjpCYXNlRml4dHVyZQoreworcHVibGljOgorICBJZGVudGl0eU1hbmFnZW1lbnRGaXh0dXJlKCk7CisKKyAgfklkZW50aXR5TWFuYWdlbWVudEZpeHR1cmUoKTsKKworICAvLyBAYnJpZWYgYWRkIGlkZW50aXR5LCByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkLgorICBib29sCisgIGFkZElkZW50aXR5KGNvbnN0IG5kbjo6TmFtZSYgaWRlbnRpdHksCisgICAgICAgICAgICAgIGNvbnN0IG5kbjo6S2V5UGFyYW1zJiBwYXJhbXMgPSBuZG46OktleUNoYWluOjpERUZBVUxUX0tFWV9QQVJBTVMpOworCitwcm90ZWN0ZWQ6CisgIG5kbjo6S2V5Q2hhaW4gbV9rZXlDaGFpbjsKKyAgc3RkOjp2ZWN0b3I8bmRuOjpOYW1lPiBtX2lkZW50aXRpZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvbGltaXRlZC1pby5jcHAgYi9ORkQvdGVzdHMvbGltaXRlZC1pby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZDgwMgotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9saW1pdGVkLWlvLmNwcApAQCAtMCwwICsxLDEyNiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImxpbWl0ZWQtaW8uaHBwIgorI2luY2x1ZGUgImNvcmUvbG9nZ2VyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCitORkRfTE9HX0lOSVQoIkxpbWl0ZWRJbyIpOworCitjb25zdCBpbnQgTGltaXRlZElvOjpVTkxJTUlURURfT1BTID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKK2NvbnN0IHRpbWU6Om5hbm9zZWNvbmRzIExpbWl0ZWRJbzo6VU5MSU1JVEVEX1RJTUUgPSB0aW1lOjpuYW5vc2Vjb25kczo6bWluKCk7CisKK0xpbWl0ZWRJbzo6TGltaXRlZElvKCkKKyAgOiBtX3V0dGYobnVsbHB0cikKKyAgLCBtX2lzUnVubmluZyhmYWxzZSkKKyAgLCBtX25PcHNSZW1haW5pbmcoMCkKK3sKK30KKworTGltaXRlZElvOjpMaW1pdGVkSW8oVW5pdFRlc3RUaW1lRml4dHVyZSogdXR0ZikKKyAgOiBtX3V0dGYodXR0ZikKKyAgLCBtX2lzUnVubmluZyhmYWxzZSkKKyAgLCBtX25PcHNSZW1haW5pbmcoMCkKK3sKK30KKworTGltaXRlZElvOjpTdG9wUmVhc29uCitMaW1pdGVkSW86OnJ1bihpbnQgbk9wc0xpbWl0LCBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgdGltZUxpbWl0LCBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgdGljaykKK3sKKyAgQk9PU1RfQVNTRVJUKCFtX2lzUnVubmluZyk7CisKKyAgaWYgKG5PcHNMaW1pdCA8PSAwKSB7CisgICAgcmV0dXJuIEVYQ0VFRF9PUFM7CisgIH0KKworICBtX2lzUnVubmluZyA9IHRydWU7CisKKyAgbV9yZWFzb24gPSBOT19XT1JLOworICBtX25PcHNSZW1haW5pbmcgPSBuT3BzTGltaXQ7CisgIGlmICh0aW1lTGltaXQgPj0gdGltZTo6bmFub3NlY29uZHM6Onplcm8oKSkgeworICAgIG1fdGltZW91dCA9IHNjaGVkdWxlcjo6c2NoZWR1bGUodGltZUxpbWl0LCBiaW5kKCZMaW1pdGVkSW86OmFmdGVyVGltZW91dCwgdGhpcykpOworICB9CisKKyAgdHJ5IHsKKyAgICBpZiAobV91dHRmID09IG51bGxwdHIpIHsKKyAgICAgIGdldEdsb2JhbElvU2VydmljZSgpLnJ1bigpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIHRpbWVMaW1pdCBpcyBlbmZvcmNlZCBieSBhZnRlclRpbWVvdXQKKyAgICAgIG1fdXR0Zi0+YWR2YW5jZUNsb2Nrcyh0aWNrLCB0aW1lOjpuYW5vc2Vjb25kczo6bWF4KCkpOworICAgIH0KKyAgfQorICBjYXRjaCAoU3RvcEV4Y2VwdGlvbiYpIHsKKyAgfQorICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KSB7CisgICAgbV9yZWFzb24gPSBFWENFUFRJT047CisgICAgTkZEX0xPR19FUlJPUigiZ19pby5ydW4oKSBleGNlcHRpb246ICIgPDwgZXgud2hhdCgpKTsKKyAgICBtX2xhc3RFeGNlcHRpb24gPSBleDsKKyAgfQorCisgIGdldEdsb2JhbElvU2VydmljZSgpLnJlc2V0KCk7CisgIHNjaGVkdWxlcjo6Y2FuY2VsKG1fdGltZW91dCk7CisgIG1faXNSdW5uaW5nID0gZmFsc2U7CisgIHJldHVybiBtX3JlYXNvbjsKK30KKwordm9pZAorTGltaXRlZElvOjphZnRlck9wKCkKK3sKKyAgaWYgKCFtX2lzUnVubmluZykgeworICAgIC8vIERvIG5vdCBwcm9jZWVkIGZ1cnRoZXIgaWYgLmFmdGVyT3AoKSBpcyBpbnZva2VkIG91dCBvZiAucnVuKCksCisgICAgcmV0dXJuOworICB9CisKKyAgLS1tX25PcHNSZW1haW5pbmc7CisgIGlmIChtX25PcHNSZW1haW5pbmcgPD0gMCkgeworICAgIG1fcmVhc29uID0gRVhDRUVEX09QUzsKKyAgICBnZXRHbG9iYWxJb1NlcnZpY2UoKS5zdG9wKCk7CisgICAgaWYgKG1fdXR0ZiAhPSBudWxscHRyKSB7CisgICAgICB0aHJvdyBTdG9wRXhjZXB0aW9uKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK0xpbWl0ZWRJbzo6YWZ0ZXJUaW1lb3V0KCkKK3sKKyAgbV9yZWFzb24gPSBFWENFRURfVElNRTsKKyAgZ2V0R2xvYmFsSW9TZXJ2aWNlKCkuc3RvcCgpOworICBpZiAobV91dHRmICE9IG51bGxwdHIpIHsKKyAgICB0aHJvdyBTdG9wRXhjZXB0aW9uKCk7CisgIH0KK30KKworY29uc3Qgc3RkOjpleGNlcHRpb24mCitMaW1pdGVkSW86OmdldExhc3RFeGNlcHRpb24oKSBjb25zdAoreworICByZXR1cm4gbV9sYXN0RXhjZXB0aW9uOworfQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvbGltaXRlZC1pby5ocHAgYi9ORkQvdGVzdHMvbGltaXRlZC1pby5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzNThiMAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9saW1pdGVkLWlvLmhwcApAQCAtMCwwICsxLDExMyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfVEVTVFNfTElNSVRFRF9JT19IUFAKKyNkZWZpbmUgTkZEX1RFU1RTX0xJTUlURURfSU9fSFBQCisKKyNpbmNsdWRlICJ0ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiY29yZS9nbG9iYWwtaW8uaHBwIgorI2luY2x1ZGUgImNvcmUvc2NoZWR1bGVyLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworCisvKiogXGJyaWVmIHByb3ZpZGVzIElPIG9wZXJhdGlvbnMgbGltaXQgYW5kL29yIHRpbWUgbGltaXQgZm9yIHVuaXQgdGVzdGluZworICovCitjbGFzcyBMaW1pdGVkSW8gOiBub25jb3B5YWJsZQoreworcHVibGljOgorICBMaW1pdGVkSW8oKTsKKworICAvKiogXGJyaWVmIGNvbnN0cnVjdCB3aXRoIFVuaXRUZXN0VGltZUZpeHR1cmUKKyAgICovCisgIExpbWl0ZWRJbyhVbml0VGVzdFRpbWVGaXh0dXJlKiB1dHRmKTsKKworICAvLy8gaW5kaWNhdGVzIHdoeSAucnVuIHJldHVybnMKKyAgZW51bSBTdG9wUmVhc29uCisgIHsKKyAgICAvLy8gZ19pby5ydW4oKSByZXR1cm5zIG5vcm1hbGx5IGJlY2F1c2UgdGhlcmUncyBubyB3b3JrIHRvIGRvCisgICAgTk9fV09SSywKKyAgICAvLy8gLmFmdGVyT3AoKSBoYXMgYmVlbiBpbnZva2VkIG5PcHNMaW1pdCB0aW1lcworICAgIEVYQ0VFRF9PUFMsCisgICAgLy8vIG5UaW1lTGltaXQgaGFzIGVsYXBzZWQKKyAgICBFWENFRURfVElNRSwKKyAgICAvLy8gYW4gZXhjZXB0aW9uIGlzIHRocm93bgorICAgIEVYQ0VQVElPTgorICB9OworCisgIC8qKiBcYnJpZWYgZ19pby5ydW4oKSB3aXRoIG9wZXJhdGlvbiBjb3VudCBhbmQvb3IgdGltZSBsaW1pdAorICAgKiAgXHBhcmFtIG5PcHNMaW1pdCBvcGVyYXRpb24gY291bnQgbGltaXQsIHBhc3MgVU5MSU1JVEVEX09QUyBmb3Igbm8gbGltaXQKKyAgICogIFxwYXJhbSB0aW1lTGltaXQgdGltZSBsaW1pdCwgcGFzcyBVTkxJTUlURURfVElNRSBmb3Igbm8gbGltaXQKKyAgICogIFxwYXJhbSB0aWNrIGlmIHRoaXMgTGltaXRlZElvIGlzIGNvbnN0cnVjdGVkIHdpdGggVW5pdFRlc3RUaW1lRml4dHVyZSwKKyAgICogICAgICAgICAgICAgIHRoaXMgaXMgcGFzc2VkIHRvIC5hZHZhbmNlQ2xvY2tzKCksIG90aGVyd2lzZSBpZ25vcmVkCisgICAqLworICBTdG9wUmVhc29uCisgIHJ1bihpbnQgbk9wc0xpbWl0LCBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgdGltZUxpbWl0LAorICAgICAgY29uc3QgdGltZTo6bmFub3NlY29uZHMmIHRpY2sgPSB0aW1lOjptaWxsaXNlY29uZHMoMSkpOworCisgIC8vLyBjb3VudCBhbiBvcGVyYXRpb24KKyAgdm9pZAorICBhZnRlck9wKCk7CisKKyAgY29uc3Qgc3RkOjpleGNlcHRpb24mCisgIGdldExhc3RFeGNlcHRpb24oKSBjb25zdDsKKworICAvKiogXGJyaWVmIGRlZmVyIGZvciBzcGVjaWZpZWQgZHVyYXRpb24KKyAgICoKKyAgICogIGVxdWl2YWxlbnQgdG8gLnJ1bihVTkxJTUlURURfT1BTLCBkKQorICAgKi8KKyAgdm9pZAorICBkZWZlcihjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgZCkKKyAgeworICAgIHRoaXMtPnJ1bihVTkxJTUlURURfT1BTLCBkKTsKKyAgfQorCitwcml2YXRlOgorICAvKiogXGJyaWVmIGFuIGV4Y2VwdGlvbiB0byBzdG9wIElPIG9wZXJhdGlvbgorICAgKi8KKyAgY2xhc3MgU3RvcEV4Y2VwdGlvbgorICB7CisgIH07CisKKyAgdm9pZAorICBhZnRlclRpbWVvdXQoKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IFVOTElNSVRFRF9PUFM7CisgIHN0YXRpYyBjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyBVTkxJTUlURURfVElNRTsKKworcHJpdmF0ZToKKyAgVW5pdFRlc3RUaW1lRml4dHVyZSogbV91dHRmOworICBib29sIG1faXNSdW5uaW5nOworICBpbnQgbV9uT3BzUmVtYWluaW5nOworICBFdmVudElkIG1fdGltZW91dDsKKyAgU3RvcFJlYXNvbiBtX3JlYXNvbjsKKyAgc3RkOjpleGNlcHRpb24gbV9sYXN0RXhjZXB0aW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1RFU1RTX0xJTUlURURfSU9fSFBQCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvbWFpbi5jcHAgYi9ORkQvdGVzdHMvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczMzYzNAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9tYWluLmNwcApAQCAtMCwwICsxLDI4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTUFJTiAxCisjZGVmaW5lIEJPT1NUX1RFU1RfRFlOX0xJTksgMQorCisjaW5jbHVkZSAiYm9vc3QtdGVzdC5ocHAiCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvb3RoZXIvY3Mtc21va2V0ZXN0LmNwcCBiL05GRC90ZXN0cy9vdGhlci9jcy1zbW9rZXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzk3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvb3RoZXIvY3Mtc21va2V0ZXN0LmNwcApAQCAtMCwwICsxLDExMSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInRhYmxlL2NzLmhwcCIKKyNpbmNsdWRlICJ0YWJsZS9jcy1lbnRyeS5ocHAiCisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9rZXktY2hhaW4uaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSBjc19zbW9rZXRlc3QgeworCitzdGF0aWMgdm9pZAorcnVuU3RyZXNzVGVzdCgpCit7CisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YVdvcmtsb2FkWzcwMDAwXTsKKyAgc2hhcmVkX3B0cjxJbnRlcmVzdD4gaW50ZXJlc3RXb3JrbG9hZFs3MDAwMF07CisKKyAgbmRuOjpTaWduYXR1cmVTaGEyNTZXaXRoUnNhIGZha2VTaWduYXR1cmU7CisgIGZha2VTaWduYXR1cmUuc2V0VmFsdWUobmRuOjpkYXRhQmxvY2sodGx2OjpTaWduYXR1cmVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigwKSwgMCkpOworCisgIC8vIDE4MiBNQiBpbiBtZW1vcnkKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA3MDAwMDsgaSsrKSB7CisgICAgTmFtZSBuYW1lKCIvc3RyZXNzL3Rlc3QiKTsKKyAgICBuYW1lLmFwcGVuZE51bWJlcihpICUgNCk7CisgICAgbmFtZS5hcHBlbmROdW1iZXIoaSk7CisKKyAgICBzaGFyZWRfcHRyPEludGVyZXN0PiBpbnRlcmVzdCA9IG1ha2Vfc2hhcmVkPEludGVyZXN0PihuYW1lKTsKKyAgICBpbnRlcmVzdFdvcmtsb2FkW2ldID0gaW50ZXJlc3Q7CisKKyAgICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlX3NoYXJlZDxEYXRhPihuYW1lKTsKKyAgICBkYXRhLT5zZXRTaWduYXR1cmUoZmFrZVNpZ25hdHVyZSk7CisgICAgZGF0YVdvcmtsb2FkW2ldID0gZGF0YTsKKyAgfQorCisgIHRpbWU6OmR1cmF0aW9uPGRvdWJsZSwgYm9vc3Q6Om5hbm8+IHByZXZpb3VzUmVzdWx0KDApOworCisgIGZvciAoc2l6ZV90IG5JbnNlcnRpb25zID0gMTAwMDsgbkluc2VydGlvbnMgPCAxMDAwMDAwMDsgbkluc2VydGlvbnMgKj0gMikgeworICAgIENzIGNzOworICAgIHNyYW5kKHRpbWU6OnRvVW5peFRpbWVzdGFtcCh0aW1lOjpzeXN0ZW1fY2xvY2s6Om5vdygpKS5jb3VudCgpKTsKKworICAgIHRpbWU6OnN0ZWFkeV9jbG9jazo6VGltZVBvaW50IHN0YXJ0VGltZSA9IHRpbWU6OnN0ZWFkeV9jbG9jazo6bm93KCk7CisKKyAgICBzaXplX3Qgd29ya2xvYWRDb3VudGVyID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5JbnNlcnRpb25zOyBpKyspIHsKKyAgICAgIGlmICh3b3JrbG9hZENvdW50ZXIgPiA2OTk5OSkKKyAgICAgICAgd29ya2xvYWRDb3VudGVyID0gMDsKKworICAgICAgY3MuZmluZCgqaW50ZXJlc3RXb3JrbG9hZFt3b3JrbG9hZENvdW50ZXJdKTsKKyAgICAgIERhdGEmIGRhdGEgPSAqZGF0YVdvcmtsb2FkW3dvcmtsb2FkQ291bnRlcl07CisgICAgICBkYXRhLnNldE5hbWUoZGF0YS5nZXROYW1lKCkpOyAvLyByZXNldCBkYXRhLm1fZnVsbE5hbWUKKyAgICAgIGRhdGEud2lyZUVuY29kZSgpOworICAgICAgY3MuaW5zZXJ0KGRhdGEpOworCisgICAgICB3b3JrbG9hZENvdW50ZXIrKzsKKyAgICB9CisKKyAgICB0aW1lOjpzdGVhZHlfY2xvY2s6OlRpbWVQb2ludCBlbmRUaW1lID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKworICAgIHRpbWU6OmR1cmF0aW9uPGRvdWJsZSwgYm9vc3Q6Om5hbm8+IHJ1bkR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZTsKKyAgICB0aW1lOjpkdXJhdGlvbjxkb3VibGUsIGJvb3N0OjpuYW5vPiBwZXJPcGVyYXRpb25UaW1lID0gcnVuRHVyYXRpb24gLyBuSW5zZXJ0aW9uczsKKworICAgIHN0ZDo6Y291dCA8PCAibkl0ZW0gPSAiIDw8IG5JbnNlcnRpb25zIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlRvdGFsIHJ1bm5pbmcgdGltZSA9ICIKKyAgICAgICAgICAgICAgPDwgdGltZTo6ZHVyYXRpb25fY2FzdDx0aW1lOjpkdXJhdGlvbjxkb3VibGU+ID4ocnVuRHVyYXRpb24pCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIkF2ZXJhZ2UgcGVyLW9wZXJhdGlvbiB0aW1lID0gIgorICAgICAgICAgICAgICA8PCB0aW1lOjpkdXJhdGlvbl9jYXN0PHRpbWU6OmR1cmF0aW9uPGRvdWJsZSwgYm9vc3Q6Om1pY3JvPiA+KHBlck9wZXJhdGlvblRpbWUpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmIChwcmV2aW91c1Jlc3VsdCA+IHRpbWU6Om5hbm9zZWNvbmRzKDEpKQorICAgICAgc3RkOjpjb3V0IDw8ICJDaGFuZ2UgY29tcGFyZWQgdG8gdGhlIHByZXZpb3VzOiAiCisgICAgICAgICAgICAgICAgPDwgKDEwMC4wICogcGVyT3BlcmF0aW9uVGltZSAvIHByZXZpb3VzUmVzdWx0KSA8PCAiJSIgPDwgc3RkOjplbmRsOworCisgICAgc3RkOjpjb3V0IDw8ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBwcmV2aW91c1Jlc3VsdCA9IHBlck9wZXJhdGlvblRpbWU7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgY3Nfc21va2V0ZXN0Cit9IC8vIG5hbWVzcGFjZSBuZmQKKworaW50CittYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgbmZkOjpjc19zbW9rZXRlc3Q6OnJ1blN0cmVzc1Rlc3QoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9vdGhlci93c2NyaXB0IGIvTkZEL3Rlc3RzL290aGVyL3dzY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhYTJiYgotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9vdGhlci93c2NyaXB0CkBAIC0wLDAgKzEsMzMgQEAKKyMgLSotIE1vZGU6IHB5dGhvbjsgcHktaW5kZW50LW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjb2Rpbmc6IHV0Zi04OyAtKi0KKworIiIiCitDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KK1NlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisKK05GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKK3dpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCitORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyIiIgorCit0b3AgPSAnLi4vLi4nCisKK2RlZiBidWlsZChibGQpOgorICAgIGJsZC5wcm9ncmFtKHRhcmdldD0iLi4vLi4vY3Mtc21va2V0ZXN0IiwKKyAgICAgICAgICAgICAgICBzb3VyY2U9ImNzLXNtb2tldGVzdC5jcHAiLAorICAgICAgICAgICAgICAgIHVzZT0nZGFlbW9uLW9iamVjdHMnLAorICAgICAgICAgICAgICAgIGluc3RhbGxfcGF0aD1Ob25lLAorICAgICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9yaWIvZmliLXVwZGF0ZXMtY29tbW9uLmhwcCBiL05GRC90ZXN0cy9yaWIvZmliLXVwZGF0ZXMtY29tbW9uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGMwYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL3JpYi9maWItdXBkYXRlcy1jb21tb24uaHBwCkBAIC0wLDAgKzEsMTEyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSByaWIgeworbmFtZXNwYWNlIHRlc3RzIHsKKworaW5saW5lIEZhY2VFbnRyeQorY3JlYXRlRmFjZUVudHJ5KHVpbnQ2NF90IGZhY2VJZCwgdWludDY0X3Qgb3JpZ2luLCB1aW50NjRfdCBjb3N0LCB1aW50NjRfdCBmbGFncykKK3sKKyAgRmFjZUVudHJ5IHRlbXA7CisgIHRlbXAuZmFjZUlkID0gZmFjZUlkOworICB0ZW1wLm9yaWdpbiA9IG9yaWdpbjsKKyAgdGVtcC5jb3N0ID0gY29zdDsKKyAgdGVtcC5mbGFncyA9IGZsYWdzOworCisgIHJldHVybiB0ZW1wOworfQorCitpbmxpbmUgYm9vbAorY29tcGFyZU5hbWVGYWNlSWRDb3N0QWN0aW9uKGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgRmliVXBkYXRlPiYgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8Y29uc3QgRmliVXBkYXRlPiYgcmhzKQoreworICBpZiAobGhzLT5uYW1lIDwgcmhzLT5uYW1lKQorICAgIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZSBpZiAobGhzLT5uYW1lID09IHJocy0+bmFtZSkKKyAgICB7CisgICAgICBpZiAobGhzLT5mYWNlSWQgPCByaHMtPmZhY2VJZCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChsaHMtPmZhY2VJZCA9PSByaHMtPmZhY2VJZCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChsaHMtPmNvc3QgPCByaHMtPmNvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGxocy0+Y29zdCA9PSByaHMtPmNvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBsaHMtPmFjdGlvbiA8IHJocy0+YWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgRmliVXBkYXRlc0ZpeHR1cmUgOiBwdWJsaWMgbmZkOjp0ZXN0czo6QmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgdm9pZAorICBpbnNlcnRGYWNlRW50cnkoY29uc3QgTmFtZSYgbmFtZSwgdWludDY0X3QgZmFjZUlkLCB1aW50NjRfdCBvcmlnaW4sIHVpbnQ2NF90IGNvc3QsIHVpbnQ2NF90IGZsYWdzKQorICB7CisgICAgcmliOjpGYWNlRW50cnkgZmFjZUVudHJ5OworICAgIGZhY2VFbnRyeS5mYWNlSWQgPSBmYWNlSWQ7CisgICAgZmFjZUVudHJ5Lm9yaWdpbiA9IG9yaWdpbjsKKyAgICBmYWNlRW50cnkuY29zdCA9IGNvc3Q7CisgICAgZmFjZUVudHJ5LmZsYWdzID0gZmxhZ3M7CisKKyAgICByaWIuaW5zZXJ0KG5hbWUsIGZhY2VFbnRyeSk7CisgIH0KKworICB2b2lkCisgIGVyYXNlRmFjZUVudHJ5KGNvbnN0IE5hbWUmIG5hbWUsIHVpbnQ2NF90IGZhY2VJZCwgdWludDY0X3Qgb3JpZ2luKQorICB7CisgICAgcmliOjpGYWNlRW50cnkgZmFjZUVudHJ5OworICAgIGZhY2VFbnRyeS5mYWNlSWQgPSBmYWNlSWQ7CisgICAgZmFjZUVudHJ5Lm9yaWdpbiA9IG9yaWdpbjsKKworICAgIHJpYi5lcmFzZShuYW1lLCBmYWNlRW50cnkpOworICB9CisKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QKKyAgZ2V0U29ydGVkRmliVXBkYXRlcygpCisgIHsKKyAgICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IHJpYi5nZXRGaWJVcGRhdGVzKCk7CisgICAgdXBkYXRlcy5zb3J0KCZjb21wYXJlTmFtZUZhY2VJZENvc3RBY3Rpb24pOworICAgIHJldHVybiB1cGRhdGVzOworICB9CisKK3B1YmxpYzoKKyAgcmliOjpSaWIgcmliOworfTsKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIHJpYgorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvcmliL2ZpYi11cGRhdGVzLWVyYXNlLWZhY2UuY3BwIGIvTkZEL3Rlc3RzL3JpYi9maWItdXBkYXRlcy1lcmFzZS1mYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZjMGQzCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL3JpYi9maWItdXBkYXRlcy1lcmFzZS1mYWNlLmNwcApAQCAtMCwwICsxLDM5NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInJpYi9yaWIuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgImZpYi11cGRhdGVzLWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoRmliVXBkYXRlcywgRmliVXBkYXRlc0ZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShFcmFzZUZhY2UpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFdpdGhJbmhlcml0ZWRGYWNlX1Jvb3QpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDEwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDEsIDAsIDUwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMiwgMCwgNzUsIDApOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDEgdXBkYXRlczogMSB0byByZW1vdmUgZmFjZSAxIGZyb20gLworICBlcmFzZUZhY2VFbnRyeSgiLyIsIDEsIDApOworCisgIFJpYjo6RmliVXBkYXRlTGlzdCB1cGRhdGVzID0gZ2V0U29ydGVkRmliVXBkYXRlcygpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHVwZGF0ZXMuc2l6ZSgpLCAxKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIHVwZGF0ZSA9IHVwZGF0ZXMuYmVnaW4oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi8iKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpSRU1PVkVfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFdpdGhJbmhlcml0ZWRGYWNlKQoreworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgNSwgMCwgMTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgNSwgMjU1LCA1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDIwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMywgMCwgNSwgMCk7CisKKyAgLy8gL2Egc2hvdWxkIGhhdmUgZmFjZSA1IHdpdGggY29zdCAxMDsgL2EvYiBzaG91bGQgaGF2ZSBmYWNlIDMgd2l0aCBjb3N0IDUgYW5kCisgIC8vIGZhY2UgNSB3aXRoIGNvc3QgMTAKKyAgZXJhc2VGYWNlRW50cnkoIi9hIiwgNSwgMjU1KTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAyIHVwZGF0ZXM6IDEgdG8gcmVtb3ZlIGZhY2UgMyBmcm9tIC9hL2IgYW5kIG9uZSB0byByZW1vdmUgaW5oZXJpdGVkIGZhY2UuCisgIGVyYXNlRmFjZUVudHJ5KCIvYS9iIiwgMywgMCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OlJFTU9WRV9ORVhUSE9QKTsKKworICArK3VwZGF0ZTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hL2IiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDUpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpSRU1PVkVfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE11bHRpcGxlRmFjZXMpCit7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCA1LCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCA1LCAyNTUsIDUsIDApOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDEgdXBkYXRlczogMSB0byB1cGRhdGUgY29zdCB0byAxMCBmb3IgL2EKKyAgZXJhc2VGYWNlRW50cnkoIi9hIiwgNSwgMjU1KTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgMTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE5vRmxhZ3NfTm9DYXB0dXJlQ2hhbmdlX05vQ2FwdHVyZU9uUm91dGUpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDUsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAzLCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYyIsIDEsIDAsIDEwMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAxLCAxMjgsIDUwLCAwKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAxIHVwZGF0ZXM6IDEgdG8gdXBkYXRlIGNvc3QgZm9yIC9hCisgIGVyYXNlRmFjZUVudHJ5KCIvYSIsIDEsIDEyOCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDEpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDUpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE1ha2VSaWJFbXB0eSkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNSwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMSB1cGRhdGVzOiAxIHRvIHJlbW92ZSBmYWNlIGZyb20gLworICBlcmFzZUZhY2VFbnRyeSgiLyIsIDEsIDApOworCisgIFJpYjo6RmliVXBkYXRlTGlzdCB1cGRhdGVzID0gZ2V0U29ydGVkRmliVXBkYXRlcygpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHVwZGF0ZXMuc2l6ZSgpLCAxKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIHVwZGF0ZSA9IHVwZGF0ZXMuYmVnaW4oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi8iKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpSRU1PVkVfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE5vRmxhZ3NfTm9DYXB0dXJlQ2hhbmdlX0NhcHR1cmVPblJvdXRlKQoreworICBpbnNlcnRGYWNlRW50cnkoIi8iLCAxLCAwLCA1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDEwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMywgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCAxLCAwLCAxMDAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMSwgMTI4LCA1MCwgMCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMSB1cGRhdGVzOiAxIHRvIHJlbW92ZSBmYWNlIGZyb20gL2EKKyAgZXJhc2VGYWNlRW50cnkoIi9hIiwgMSwgMTI4KTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OlJFTU9WRV9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQm90aEZsYWdzX05vQ2FwdHVyZUNoYW5nZV9DYXB0dXJlT25Sb3V0ZSkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNSwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAyLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYiIsIDMsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9jIiwgMSwgMCwgMTAwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDEsIDEyOCwgNTAsIChuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKSk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzOiAxIHRvIHJlbW92ZSBmYWNlMSBmcm9tIC9hIGFuZAorICAvLyAxIHRvIHJlbW92ZSBmYWNlMSB0byAvYS9iCisgIGVyYXNlRmFjZUVudHJ5KCIvYSIsIDEsIDEyOCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpSRU1PVkVfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCb3RoRmxhZ3NfQ2FwdHVyZUNoYW5nZV9Ob0NhcHR1cmVPblJvdXRlKQoreworICBpbnNlcnRGYWNlRW50cnkoIi8iLCAxLCAwLCA1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMywgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCAxLCAwLCAxMDAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMSwgMTI4LCA1MCwgKG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkUpKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAyIHVwZGF0ZXM6IDEgdG8gYWRkIGZhY2UxIHRvIC9hIGFuZAorICAvLyAxIHRvIGFkZCBmYWNlMSB0byAvYS9iCisgIGVyYXNlRmFjZUVudHJ5KCIvYSIsIDEsIDEyOCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDUpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCA1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDaGlsZEluaGVyaXRfTm9DYXB0dXJlQ2hhbmdlX05vQ2FwdHVyZU9uUm91dGUpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDUsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAzLCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYyIsIDEsIDAsIDEwMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAxLCAxMjgsIDUwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAyIHVwZGF0ZXM6IDIgdG8gYWRkIGZhY2UxIHRvIC9hIGFuZCAvYS9iCisgIGVyYXNlRmFjZUVudHJ5KCIvYSIsIDEsIDEyOCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDUpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCA1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDaGlsZEluaGVyaXRfTm9DYXB0dXJlQ2hhbmdlX0NhcHR1cmVPblJvdXRlKQoreworICBpbnNlcnRGYWNlRW50cnkoIi8iLCAxLCAwLCA1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDEwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMywgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCAxLCAwLCAxMDAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMSwgMTI4LCA1MCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzOiAyIHRvIHJlbW92ZSBmYWNlIDEgZnJvbSAvYSBhbmQgL2EvYgorICBlcmFzZUZhY2VFbnRyeSgiL2EiLCAxLCAxMjgpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdCB1cGRhdGVzID0gZ2V0U29ydGVkRmliVXBkYXRlcygpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHVwZGF0ZXMuc2l6ZSgpLCAyKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIHVwZGF0ZSA9IHVwZGF0ZXMuYmVnaW4oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OlJFTU9WRV9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2FwdHVyZV9DYXB0dXJlQ2hhbmdlX05vQ2FwdHVyZU9uUm91dGUpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDUsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAzLCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYyIsIDEsIDAsIDEwMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAxLCAxMjgsIDUwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAyIHVwZGF0ZXM6IDEgdG8gdXBkYXRlIGNvc3Qgb24gL2EgYW5kCisgIC8vIDEgdG8gYWRkIGZhY2UxIHRvIC9hL2IKKyAgZXJhc2VGYWNlRW50cnkoIi9hIiwgMSAsMTI4KTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMik7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKKworICArK3VwZGF0ZTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hL2IiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDUpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENhcHR1cmVfTm9DYXB0dXJlQ2hhbmdlX0NhcHR1cmVPblJvdXRlKQoreworICBpbnNlcnRGYWNlRW50cnkoIi8iLCAxLCAwLCA1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDEwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMywgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCAxLCAwLCAxMDAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMSwgMTI4LCA1MCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMSB1cGRhdGVzOiAxIHRvIHJlbW92ZSBmYWNlIGZyb20gL2EKKyAgZXJhc2VGYWNlRW50cnkoIi9hIiwgMSwgMTI4KTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OlJFTU9WRV9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRXJhc2VGYWNlQnlJZCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNSwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAyLCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYiIsIDMsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9jIiwgNCwgMCwgMTAwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDEsIDEyOCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDQgdXBkYXRlczogNCB0byByZW1vdmUgZmFjZSBJRCAxIGZyb20gLywgL2EsIC9hL2IsIGFuZCAvYS9jCisgIHJpYi5lcmFzZSgxKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgNCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpSRU1PVkVfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYyIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OlJFTU9WRV9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpIC8vIEVyYXNlRmFjZQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkgLy8gRmliVXBkYXRlcworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9yaWIvZmliLXVwZGF0ZXMtbmV3LWZhY2UuY3BwIGIvTkZEL3Rlc3RzL3JpYi9maWItdXBkYXRlcy1uZXctZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlN2Q2OQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9yaWIvZmliLXVwZGF0ZXMtbmV3LWZhY2UuY3BwCkBAIC0wLDAgKzEsMjcyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAicmliL3JpYi5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiZmliLXVwZGF0ZXMtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcmliIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGaWJVcGRhdGVzLCBGaWJVcGRhdGVzRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE5ld0ZhY2UpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEJhc2ljKQoreworICAvLyBzaG91bGQgZ2VuZXJhdGUgMSB1cGRhdGUKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdCB1cGRhdGVzID0gcmliLmdldEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi8iKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgNTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgLy8gQ2xlYXIgYW55IHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gc2hvdWxkIGdlbmVyYXRlIDIgdXBkYXRlcworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgNTAsIDApOworCisgIHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIHVwZGF0ZSA9IHVwZGF0ZXMuYmVnaW4oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCAgIDUwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgNTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBzaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzCisgIGluc2VydEZhY2VFbnRyeSgiL2EvYiIsIDMsIDAsIDEwLCAwKTsKKworICB1cGRhdGVzID0gZ2V0U29ydGVkRmliVXBkYXRlcygpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHVwZGF0ZXMuc2l6ZSgpLCAyKTsKKworICB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCAgIDUwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgICAxMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVXBkYXRlT25Mb3dlckNvc3ROb0NoaWxkSW5oZXJpdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIDApOworCisgIC8vIENsZWFyIGFueSB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAwIHVwZGF0ZXMKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMTI4LCA3NSwgMCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmliLmdldEZpYlVwZGF0ZXMoKS5zaXplKCksIDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShVcGRhdGVPbkxvd2VyQ29zdE9ubHkpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsICAxLCAwLCA1MCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAyLCAwLCAxMCwgMCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzOiB0byB1cGRhdGUgY29zdCBmb3IgZmFjZSAxIG9uIC8gYW5kIC9hCisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDI1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMik7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCAgIDI1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgMjUpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMCB1cGRhdGVzCisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDEyOCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHJpYi5nZXRGaWJVcGRhdGVzKCkuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9DYXB0dXJlQ2hhbmdlV2l0aG91dENoaWxkSW5oZXJpdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgICAgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgICAyLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYiIsIDMsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9jIiwgNCwgMCwgMTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkUpOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDEgdXBkYXRlOiAxIHRvIGFkZCBmYWNlIDUgdG8gL2EKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDUsIDEyOCwgNTAsIDApOworCisgIGNvbnN0IFJpYjo6RmliVXBkYXRlTGlzdCYgdXBkYXRlcyA9IHJpYi5nZXRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDEpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgICA1MCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9DYXB0dXJlQ2hhbmdlV2l0aENoaWxkSW5oZXJpdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgICAgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgICAyLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYiIsIDMsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9jIiwgNCwgMCwgMTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkUpOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDIgdXBkYXRlczogb25lIGZvciB0aGUgaW5zZXJ0ZWQgZmFjZSBhbmQKKyAgLy8gb25lIHRvIGFkZCBmYWNlIHRvIC9hL2IKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDQsIDEyOCwgNSwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDQpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKKworICArK3VwZGF0ZTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hL2IiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDQpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2FwdHVyZVR1cm5lZE9uV2l0aG91dENoaWxkSW5oZXJpdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgICAgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgICAyLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYiIsIDMsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9jIiwgNCwgMCwgMTAsIDApOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDMgdXBkYXRlczoKKyAgLy8gLSBvbmUgZm9yIHRoZSBpbnNlcnRlZCBmYWNlIGZvciAvYSBhbmQKKyAgLy8gLSB0d28gdG8gcmVtb3ZlIGZhY2UxIGZyb20gL2EvYiBhbmQgL2EvYworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMSwgMTI4LCA1MCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDMpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgNTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYyIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OlJFTU9WRV9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2FwdHVyZVR1cm5lZE9uV2l0aENoaWxkSW5oZXJpdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgICAgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgICAyLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYiIsIDMsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9jIiwgNCwgMCwgMTAsIDApOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDIgdXBkYXRlczoKKyAgLy8gLSBvbmUgZm9yIHRoZSBpbnNlcnRlZCBmYWNlIGZvciAvYSBhbmQKKyAgLy8gLSBvbmUgdG8gdXBkYXRlIC9hL2Igd2l0aCB0aGUgbmV3IGNvc3QKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDEsIDEyOCwgNTAsIChuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDMpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgNTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCAgIDUwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkgLy8gTmV3RmFjZQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkgLy8gRmliVXBkYXRlcworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9yaWIvZmliLXVwZGF0ZXMtbmV3LW5hbWVzcGFjZS5jcHAgYi9ORkQvdGVzdHMvcmliL2ZpYi11cGRhdGVzLW5ldy1uYW1lc3BhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDljNTEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvcmliL2ZpYi11cGRhdGVzLW5ldy1uYW1lc3BhY2UuY3BwCkBAIC0wLDAgKzEsMjAyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAicmliL3JpYi5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSAiZmliLXVwZGF0ZXMtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcmliIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGaWJVcGRhdGVzLCBGaWJVcGRhdGVzRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE5ld05hbWVzcGFjZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoTm9GbGFncykKK3sKKyAgLy8gTm8gZmxhZ3MsIGVtcHR5IFJJQiwgc2hvdWxkIGdlbmVyYXRlIDEgdXBkYXRlIGZvciB0aGUgaW5zZXJ0ZWQgZmFjZQorICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAxLCAwLCAxMCwgMCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDEpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgMTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgLy8gUmVzZXQgUklCCisgIGVyYXNlRmFjZUVudHJ5KCIvYS9iIiwgMSwgMCk7CisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBQYXJlbnQgd2l0aCBjaGlsZCBpbmhlcml0IGZsYWcKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDcwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDMsIDAsIDMwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAzIHVwZGF0ZXMsIDEgZm9yIHRoZSBpbnNlcnRlZCBmYWNlIGFuZCAyIGZyb20gaW5oZXJpdGFuY2UKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMSwgMCwgMTAsIDApOworCisgIHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDMpOworCisgIHVwZGF0ZSA9IHVwZGF0ZXMuYmVnaW4oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hL2IiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgNzApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCAzMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQm90aEZsYWdzKQoreworICAvLyBFbXB0eSBSSUIsIHNob3VsZCBnZW5lcmF0ZSAxIHVwZGF0ZSBmb3IgdGhlIGluc2VydGVkIGZhY2UKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDEsIDAsIDEwLCAobmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkUpKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgMTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgLy8gUmVzZXQgUklCCisgIGVyYXNlRmFjZUVudHJ5KCIvYSIsIDEsIDApOworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMiwgMCwgNzAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAzLCAwLCAzMCwgMCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMyB1cGRhdGVzLCAxIGZvciB0aGUgaW5zZXJ0ZWQgZmFjZSwgMSB0byBhZGQgdGhlIGZhY2UgdG8gdGhlIGNoaWxkLAorICAvLyBhbmQgMSB0byByZW1vdmUgdGhlIHByZXZpb3VzbHkgaW5oZXJpdGVkIGVudHJ5CisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAxLCAwLCAxMCwgKG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKSk7CisKKyAgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMyk7CisKKyAgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgMTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDaGlsZEluaGVyaXQpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDUwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCAzLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzOiAxIGZvciB0aGUgaW5zZXJ0ZWQgZmFjZSBhbmQgMSB0byBhZGQgdGhlIGZhY2UgdG8gIi9hL2IiCisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAxLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgMTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENhcHR1cmUpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDUwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCAzLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzOiAxIGZvciB0aGUgaW5zZXJ0ZWQgZmFjZSBhbmQKKyAgLy8gMSB0byByZW1vdmUgaW5oZXJpdGVkIGZhY2UgZnJvbSAiL2EvYiIKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDEsIDAsIDEwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMik7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0Ojpjb25zdF9pdGVyYXRvciB1cGRhdGUgPSB1cGRhdGVzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYSIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgMTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkgLy8gTmV3TmFtZXNwYWNlCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKSAvLyBGaWJVcGRhdGVzCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSByaWIKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL3JpYi9maWItdXBkYXRlcy11cGRhdGUtZmFjZS5jcHAgYi9ORkQvdGVzdHMvcmliL2ZpYi11cGRhdGVzLXVwZGF0ZS1mYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Y1ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL3JpYi9maWItdXBkYXRlcy11cGRhdGUtZmFjZS5jcHAKQEAgLTAsMCArMSwyNjYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJyaWIvcmliLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICJmaWItdXBkYXRlcy1jb21tb24uaHBwIgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSByaWIgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEZpYlVwZGF0ZXMsIEZpYlVwZGF0ZXNGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVXBkYXRlRmFjZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoVHVybk9mZkNoaWxkSW5oZXJpdExvd2VyQ29zdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi8iLCAxLCAxMjgsIDI1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAyIHVwZGF0ZXM6IDEgdG8gdXBkYXRlIHRoZSBjb3N0IG9mIC8gZmFjZSAxIHRvIDUwIGFuZAorICAvLyAxIHRvIHVwZGF0ZSB0aGUgY29zdCBvZiAvYSBmYWNlIDEgdG8gNTAKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMTI4LCA3NSwgMCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiLyIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgICA1MCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKKworICArK3VwZGF0ZTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCAgIDUwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShVcGRhdGVPbkxvd2VyQ29zdE9ubHkpCit7CisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDAsIDUwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDEwLCAwKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMTI4LCAxMDAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworCisgIC8vIENsZWFyIHVwZGF0ZXMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgaW5zZXJ0aW9ucworICByaWIuY2xlYXJGaWJVcGRhdGVzKCk7CisKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDAgdXBkYXRlcworICBpbnNlcnRGYWNlRW50cnkoIi8iLCAxLCAxMjgsIDc1LCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKworICBSaWI6OkZpYlVwZGF0ZUxpc3QgdXBkYXRlcyA9IGdldFNvcnRlZEZpYlVwZGF0ZXMoKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCh1cGRhdGVzLnNpemUoKSwgMCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzCisgIGluc2VydEZhY2VFbnRyeSgiLyIsIDEsIDEyOCwgMjUsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworCisgIHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiLyIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgICAyNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKKworICArK3VwZGF0ZTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5uYW1lLCAgIi9hIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5jb3N0LCAgIDI1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShOb0NoYW5nZUluQ29zdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMywgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCA0LCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMCB1cGRhdGVzCisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAyLCAwLCAxMDAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdCB1cGRhdGVzID0gZ2V0U29ydGVkRmliVXBkYXRlcygpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHVwZGF0ZXMuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ2hhbmdlQ29zdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMywgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCA0LCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBTaG91bGQgZ2VuZXJhdGUgMiB1cGRhdGVzOiAxIHRvIGFkZCBmYWNlMiB3aXRoIG5ldyBjb3N0IHRvIC9hIGFuZAorICAvLyAxIHRvIGFkZCBmYWNlMiB3aXRoIG5ldyBjb3N0IHRvIC9hL2IKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDIsIDAsIDMwMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsICAgMzAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgICAzMDApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFR1cm5PbkNoaWxkSW5oZXJpdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAzLCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYyIsIDQsIDAsIDEwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFR1cm4gb24gY2hpbGQgaW5oZXJpdCBmbGFnIGZvciB0aGUgZW50cnkgaW4gL2EKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDEgdXBkYXRlczogMSB0byBhZGQgZmFjZSB0byAvYS9iCisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAyLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDEpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgICAxMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVHVybk9mZkNoaWxkSW5oZXJpdCkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMSwgMCwgMTAwLCBuZG46Om5mZDo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYS9iIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2MiLCAxLCAwLCAyNSwgMCk7CisKKyAgLy8gQ2xlYXIgdXBkYXRlcyBnZW5lcmF0ZWQgZnJvbSBwcmV2aW91cyBpbnNlcnRpb25zCisgIHJpYi5jbGVhckZpYlVwZGF0ZXMoKTsKKworICAvLyBUdXJuIG9mZiBjaGlsZCBpbmhlcml0IGZsYWcgZm9yIHRoZSBlbnRyeSBpbiAvYQorICAvLyBTaG91bGQgZ2VuZXJhdGUgMSB1cGRhdGU6IDEgdG8gYWRkIGZhY2UxIHRvIC9hL2IKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvYSIsIDEsIDAsIDEwMCwgMCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDEpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgICA1MCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+YWN0aW9uLCBGaWJVcGRhdGU6OkFERF9ORVhUSE9QKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoVHVybk9uQ2FwdHVyZSkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAsIDApOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAzLCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYyIsIDEsIDAsIDEwLCAwKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFR1cm4gb24gY2FwdHVyZSBmbGFnIGZvciB0aGUgZW50cnkgaW4gL2EKKyAgLy8gU2hvdWxkIGdlbmVyYXRlIDIgdXBkYXRlczogMSB0byByZW1vdmUgZmFjZTEgZnJvbSAvYSBhbmQKKyAgLy8gMSB0byByZW1vdmUgZmFjZTEgZnJvbSAvYS9iCisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAyLCAwLCAxMCwgbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0FQVFVSRSk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpSRU1PVkVfTkVYVEhPUCk7CisKKyAgKyt1cGRhdGU7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+bmFtZSwgICIvYS9iIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+ZmFjZUlkLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6UkVNT1ZFX05FWFRIT1ApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUdXJuT2ZmQ2FwdHVyZSkKK3sKKyAgaW5zZXJ0RmFjZUVudHJ5KCIvIiwgMSwgMCwgNTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpOworICBpbnNlcnRGYWNlRW50cnkoIi9hIiwgMiwgMCwgMTAsIG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkUpOworICBpbnNlcnRGYWNlRW50cnkoIi9hL2IiLCAzLCAwLCAxMCwgMCk7CisgIGluc2VydEZhY2VFbnRyeSgiL2EvYyIsIDEsIDAsIDEwLCAwKTsKKworICAvLyBDbGVhciB1cGRhdGVzIGdlbmVyYXRlZCBmcm9tIHByZXZpb3VzIGluc2VydGlvbnMKKyAgcmliLmNsZWFyRmliVXBkYXRlcygpOworCisgIC8vIFR1cm4gb2ZmIGNhcHR1cmUgZmxhZyBmb3IgdGhlIGVudHJ5IGluIC9hCisgIC8vIFNob3VsZCBnZW5lcmF0ZSAyIHVwZGF0ZXM6IDEgdG8gYWRkIGZhY2UxIHRvIC9hIGFuZAorICAvLyAxIHRvIGFkZCBmYWNlMSB0byAvYS9iCisgIGluc2VydEZhY2VFbnRyeSgiL2EiLCAyLCAwLCAxMCwgMCk7CisKKyAgUmliOjpGaWJVcGRhdGVMaXN0IHVwZGF0ZXMgPSBnZXRTb3J0ZWRGaWJVcGRhdGVzKCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwodXBkYXRlcy5zaXplKCksIDIpOworCisgIFJpYjo6RmliVXBkYXRlTGlzdDo6Y29uc3RfaXRlcmF0b3IgdXBkYXRlID0gdXBkYXRlcy5iZWdpbigpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5mYWNlSWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmNvc3QsIDUwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKCp1cGRhdGUpLT5hY3Rpb24sIEZpYlVwZGF0ZTo6QUREX05FWFRIT1ApOworCisgICsrdXBkYXRlOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPm5hbWUsICAiL2EvYiIpOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmZhY2VJZCwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKCgqdXBkYXRlKS0+Y29zdCwgNTApOworICBCT09TVF9DSEVDS19FUVVBTCgoKnVwZGF0ZSktPmFjdGlvbiwgRmliVXBkYXRlOjpBRERfTkVYVEhPUCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKSAvLyBVcGRhdGVGYWNlCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKSAvLyBGaWJVcGRhdGVzCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSByaWIKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL3JpYi9yZW1vdGUtcmVnaXN0cmF0b3IuY3BwIGIvTkZEL3Rlc3RzL3JpYi9yZW1vdGUtcmVnaXN0cmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZWY1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvcmliL3JlbW90ZS1yZWdpc3RyYXRvci5jcHAKQEAgLTAsMCArMSw1MjAgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJyaWIvcmVtb3RlLXJlZ2lzdHJhdG9yLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL2xpbWl0ZWQtaW8uaHBwIgorI2luY2x1ZGUgInRlc3RzL2lkZW50aXR5LW1hbmFnZW1lbnQtZml4dHVyZS5ocHAiCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2R1bW15LWNsaWVudC1mYWNlLmhwcD4KKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgcmliIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK2NsYXNzIFJlbW90ZVJlZ2lzdHJhdG9yRml4dHVyZSA6IHB1YmxpYyBuZmQ6OnRlc3RzOjpJZGVudGl0eU1hbmFnZW1lbnRGaXh0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwdWJsaWMgbmZkOjp0ZXN0czo6VW5pdFRlc3RUaW1lRml4dHVyZQoreworcHVibGljOgorICBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUoKQorICAgIDogZmFjZShuZG46OnV0aWw6Om1ha2VEdW1teUNsaWVudEZhY2UoZ2V0R2xvYmFsSW9TZXJ2aWNlKCkpKQorICAgICwgY29udHJvbGxlcihtYWtlX3NoYXJlZDxuZG46Om5mZDo6Q29udHJvbGxlcj4oc3RkOjpyZWYoKmZhY2UpLCBtX2tleUNoYWluKSkKKyAgICAsIHJlbW90ZVJlZ2lzdHJhdG9yKG1ha2Vfc2hhcmVkPFJlbW90ZVJlZ2lzdHJhdG9yPihzdGQ6OnJlZigqY29udHJvbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9rZXlDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWIpKQorICAgICwgQ09NTUFORF9QUkVGSVgoIi9sb2NhbGhvcC9uZmQvcmliIikKKyAgICAsIFJFR0lTVEVSX1ZFUkIoInJlZ2lzdGVyIikKKyAgICAsIFVOUkVHSVNURVJfVkVSQigidW5yZWdpc3RlciIpCisgIHsKKyAgICByZWFkQ29uZmlnKCk7CisKKyAgICByZW1vdGVSZWdpc3RyYXRvci0+ZW5hYmxlKCk7CisKKyAgICBhZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxKSk7CisgICAgZmFjZS0+c2VudEludGVyZXN0cy5jbGVhcigpOworICB9CisKKyAgdm9pZAorICByZWFkQ29uZmlnKGJvb2wgaXNTZXRSZXRyeSA9IGZhbHNlKQorICB7CisgICAgQ29uZmlnRmlsZSBjb25maWc7CisgICAgY29uZmlnLmFkZFNlY3Rpb25IYW5kbGVyKCJyZW1vdGVfcmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZSZW1vdGVSZWdpc3RyYXRvcjo6bG9hZENvbmZpZywgcmVtb3RlUmVnaXN0cmF0b3IsIF8xKSk7CisKKworICAgIGlmIChpc1NldFJldHJ5KQorICAgICAgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUdfU1RSSU5HID0KKyAgICAgICAgInJlbW90ZV9yZWdpc3RlclxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICBjb3N0IDE1XG4iCisgICAgICAgICIgIHRpbWVvdXQgMTAwMFxuIgorICAgICAgICAiICByZXRyeSAxXG4iCisgICAgICAgICIgIHJlZnJlc2hfaW50ZXJ2YWwgNVxuIgorICAgICAgICAifSI7CisKKyAgICAgICAgY29uZmlnLnBhcnNlKENPTkZJR19TVFJJTkcsIHRydWUsICJ0ZXN0LXJlbW90ZS1yZWdpc3RlciIpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHX1NUUklORyA9CisgICAgICAgICJyZW1vdGVfcmVnaXN0ZXJcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgY29zdCAxNVxuIgorICAgICAgICAiICB0aW1lb3V0IDEwMDAwMFxuIgorICAgICAgICAiICByZXRyeSAwXG4iCisgICAgICAgICIgIHJlZnJlc2hfaW50ZXJ2YWwgNVxuIgorICAgICAgICAifSI7CisKKyAgICAgICAgY29uZmlnLnBhcnNlKENPTkZJR19TVFJJTkcsIHRydWUsICJ0ZXN0LXJlbW90ZS1yZWdpc3RlciIpOworICAgICAgfQorICB9CisKKyAgdm9pZAorICB3YWl0Rm9yVGltZW91dCgpCisgIHsKKyAgICBhZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxMDApLCB0aW1lOjpzZWNvbmRzKDEpKTsKKyAgfQorCisgIHZvaWQKKyAgaW5zZXJ0RW50cnlXaXRoSWRlbnRpdHkoTmFtZSBpZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTo6Q29tcG9uZW50IGFwcE5hbWUgPSBERUZBVUxUX0FQUF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmYWNlSWQgPSAwKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoYWRkSWRlbnRpdHkoaWRlbnRpdHkpLCB0cnVlKTsKKworICAgIEZhY2VFbnRyeSBmYWNlRW50cnk7CisgICAgZmFjZUVudHJ5LmZhY2VJZCA9IGZhY2VJZDsKKworICAgIHJpYi5pbnNlcnQoaWRlbnRpdHkuYXBwZW5kKGFwcE5hbWUpLCBmYWNlRW50cnkpOworCisgICAgYWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMSkpOworICB9CisKKyAgdm9pZAorICBpbnNlcnRFbnRyeVdpdGhvdXRJZGVudGl0eShOYW1lIGlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOjpDb21wb25lbnQgYXBwTmFtZSA9IERFRkFVTFRfQVBQX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZhY2VJZCA9IDApCisgIHsKKyAgICBGYWNlRW50cnkgZmFjZUVudHJ5OworICAgIGZhY2VFbnRyeS5mYWNlSWQgPSBmYWNlSWQ7CisKKyAgICByaWIuaW5zZXJ0KGlkZW50aXR5LmFwcGVuZChhcHBOYW1lKSwgZmFjZUVudHJ5KTsKKworICAgIGFkdmFuY2VDbG9ja3ModGltZTo6bWlsbGlzZWNvbmRzKDEpKTsKKyAgfQorCisgIHZvaWQKKyAgZXJhc2VFbnRyeVdpdGhJZGVudGl0eShOYW1lIGlkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6OkNvbXBvbmVudCBhcHBOYW1lID0gREVGQVVMVF9BUFBfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmYWNlSWQgPSAwKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoYWRkSWRlbnRpdHkoaWRlbnRpdHkpLCB0cnVlKTsKKworICAgIEZhY2VFbnRyeSBmYWNlRW50cnk7CisgICAgZmFjZUVudHJ5LmZhY2VJZCA9IGZhY2VJZDsKKworICAgIHJpYi5lcmFzZShpZGVudGl0eS5hcHBlbmQoYXBwTmFtZSksIGZhY2VFbnRyeSk7CisKKyAgICBhZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxKSk7CisgIH0KKworICB2b2lkCisgIGVyYXNlRW50cnlXaXRob3V0SWRlbnRpdHkoTmFtZSBpZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOjpDb21wb25lbnQgYXBwTmFtZSA9IERFRkFVTFRfQVBQX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZmFjZUlkID0gMCkKKyAgeworICAgIEZhY2VFbnRyeSBmYWNlRW50cnk7CisgICAgZmFjZUVudHJ5LmZhY2VJZCA9IGZhY2VJZDsKKworICAgIHJpYi5lcmFzZShpZGVudGl0eS5hcHBlbmQoYXBwTmFtZSksIGZhY2VFbnRyeSk7CisKKyAgICBhZHZhbmNlQ2xvY2tzKHRpbWU6Om1pbGxpc2Vjb25kcygxKSk7CisgIH0KKworICB2b2lkCisgIGVyYXNlRmFjZSh1aW50NjRfdCBmYWNlSWQpCisgIHsKKyAgICByaWIuZXJhc2UoZmFjZUlkKTsKKworICAgIGFkdmFuY2VDbG9ja3ModGltZTo6bWlsbGlzZWNvbmRzKDEpKTsKKyAgfQorCisgIHZvaWQKKyAgY29ubmVjdFRvSHViKCkKKyAgeworICAgIHJpYi5pbnNlcnQoQ09NTUFORF9QUkVGSVgsIEZhY2VFbnRyeSgpKTsKKworICAgIGFkdmFuY2VDbG9ja3ModGltZTo6bWlsbGlzZWNvbmRzKDEpKTsKKyAgfQorCisgIHZvaWQKKyAgZGlzY29ubmVjdFRvSHViKCkKKyAgeworICAgIHJpYi5lcmFzZShDT01NQU5EX1BSRUZJWCwgRmFjZUVudHJ5KCkpOworCisgICAgYWR2YW5jZUNsb2Nrcyh0aW1lOjptaWxsaXNlY29uZHMoMSkpOworICB9CisKKyAgdm9pZAorICBleHRyYWN0UGFyYW1ldGVycyhJbnRlcmVzdCYgaW50ZXJlc3QsIE5hbWU6OkNvbXBvbmVudCYgdmVyYiwKKyAgICAgICAgICAgICAgICAgICAgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzJiBleHRyYWN0ZWRQYXJhbWV0ZXJzKQorICB7CisgICAgY29uc3QgTmFtZSYgbmFtZSA9IGludGVyZXN0LmdldE5hbWUoKTsKKyAgICB2ZXJiID0gbmFtZVtDT01NQU5EX1BSRUZJWC5zaXplKCldOworICAgIGNvbnN0IE5hbWU6OkNvbXBvbmVudCYgcGFyYW1ldGVyQ29tcG9uZW50ID0gbmFtZVtDT01NQU5EX1BSRUZJWC5zaXplKCkgKyAxXTsKKworICAgIEJsb2NrIHJhd1BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJDb21wb25lbnQuYmxvY2tGcm9tVmFsdWUoKTsKKyAgICBleHRyYWN0ZWRQYXJhbWV0ZXJzLndpcmVEZWNvZGUocmF3UGFyYW1ldGVycyk7CisgIH0KKworcHVibGljOgorICBSaWIgcmliOworICBzaGFyZWRfcHRyPG5kbjo6dXRpbDo6RHVtbXlDbGllbnRGYWNlPiBmYWNlOworICBzaGFyZWRfcHRyPG5kbjo6bmZkOjpDb250cm9sbGVyPiBjb250cm9sbGVyOworICBzaGFyZWRfcHRyPFJlbW90ZVJlZ2lzdHJhdG9yPiByZW1vdGVSZWdpc3RyYXRvcjsKKworICBjb25zdCBOYW1lIENPTU1BTkRfUFJFRklYOworICBjb25zdCBuYW1lOjpDb21wb25lbnQgUkVHSVNURVJfVkVSQjsKKyAgY29uc3QgbmFtZTo6Q29tcG9uZW50IFVOUkVHSVNURVJfVkVSQjsKKworICBzdGF0aWMgY29uc3QgbmFtZTo6Q29tcG9uZW50IERFRkFVTFRfQVBQX05BTUU7Cit9OworCitjb25zdCBuYW1lOjpDb21wb25lbnQgUmVtb3RlUmVnaXN0cmF0b3JGaXh0dXJlOjpERUZBVUxUX0FQUF9OQU1FKCJhcHAiKTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFJlbW90ZVJlZ2lzdHJhdG9yLCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKEF1dG9UZXN0LCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoMSwgMSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFJlZ2lzdGVyV2l0aG91dENvbm5lY3Rpb24sIFJlbW90ZVJlZ2lzdHJhdG9yRml4dHVyZSkKK3sKKyAgaW5zZXJ0RW50cnlXaXRoSWRlbnRpdHkoIi9yZW1vdGUvcmVnaXN0ZXIiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVnaXN0ZXJXaXRob3V0SWRlbnRpdHksIFJlbW90ZVJlZ2lzdHJhdG9yRml4dHVyZSkKK3sKKyAgY29ubmVjdFRvSHViKCk7CisKKyAgaW5zZXJ0RW50cnlXaXRob3V0SWRlbnRpdHkoIi9yZW1vdGUvcmVnaXN0ZXIiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVnaXN0ZXJXaXRoSHViUHJlZml4LCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIGNvbm5lY3RUb0h1YigpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZS0+c2VudEludGVyZXN0cy5zaXplKCksIDApOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShSZWdpc3RlcldpdGhMb2NhbFByZWZpeCwgUmVtb3RlUmVnaXN0cmF0b3JGaXh0dXJlKQoreworICBjb25uZWN0VG9IdWIoKTsKKworICBpbnNlcnRFbnRyeVdpdGhJZGVudGl0eSgiL2xvY2FsaG9zdC9wcmVmaXgiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVnaXN0ZXJCYXNpYywgUmVtb3RlUmVnaXN0cmF0b3JGaXh0dXJlKQoreworICBjb25uZWN0VG9IdWIoKTsKKworICBOYW1lIGlkZW50aXR5KCIvcmVtb3RlL3JlZ2lzdGVyIik7CisgIGluc2VydEVudHJ5V2l0aElkZW50aXR5KGlkZW50aXR5KTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKworICBJbnRlcmVzdCYgcmVxdWVzdCA9IGZhY2UtPnNlbnRJbnRlcmVzdHNbMF07CisKKyAgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzIGV4dHJhY3RlZFBhcmFtZXRlcnM7CisgIE5hbWU6OkNvbXBvbmVudCB2ZXJiOworICBleHRyYWN0UGFyYW1ldGVycyhyZXF1ZXN0LCB2ZXJiLCBleHRyYWN0ZWRQYXJhbWV0ZXJzKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh2ZXJiLCBSRUdJU1RFUl9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXROYW1lKCksIGlkZW50aXR5KTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVnaXN0ZXJBZHZhbmNlZCwgUmVtb3RlUmVnaXN0cmF0b3JGaXh0dXJlKQoreworICBjb25uZWN0VG9IdWIoKTsKKworICBOYW1lIGlkZW50aXR5KCIvcmVtb3RlL3JlZ2lzdGVyIik7CisgIE5hbWUgaWRlbnRpdHlBZGRSaWIoIi9yZW1vdGUvcmVnaXN0ZXIvcmliIik7CisgIGluc2VydEVudHJ5V2l0aElkZW50aXR5KGlkZW50aXR5QWRkUmliKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKKworICBJbnRlcmVzdCYgcmVxdWVzdCA9IGZhY2UtPnNlbnRJbnRlcmVzdHNbMF07CisKKyAgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzIGV4dHJhY3RlZFBhcmFtZXRlcnM7CisgIE5hbWU6OkNvbXBvbmVudCB2ZXJiOworICBleHRyYWN0UGFyYW1ldGVycyhyZXF1ZXN0LCB2ZXJiLCBleHRyYWN0ZWRQYXJhbWV0ZXJzKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh2ZXJiLCBSRUdJU1RFUl9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXROYW1lKCksIGlkZW50aXR5KTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVnaXN0ZXJXaXRoUmVkdW5kYW50Q2FsbGJhY2ssIFJlbW90ZVJlZ2lzdHJhdG9yRml4dHVyZSkKK3sKKyAgcmVtb3RlUmVnaXN0cmF0b3ItPmVuYWJsZSgpOworCisgIGNvbm5lY3RUb0h1YigpOworCisgIE5hbWUgaWRlbnRpdHkoIi9yZW1vdGUvcmVnaXN0ZXIiKTsKKyAgaW5zZXJ0RW50cnlXaXRoSWRlbnRpdHkoaWRlbnRpdHkpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZS0+c2VudEludGVyZXN0cy5zaXplKCksIDEpOworCisgIEludGVyZXN0JiByZXF1ZXN0ID0gZmFjZS0+c2VudEludGVyZXN0c1swXTsKKworICBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnMgZXh0cmFjdGVkUGFyYW1ldGVyczsKKyAgTmFtZTo6Q29tcG9uZW50IHZlcmI7CisgIGV4dHJhY3RQYXJhbWV0ZXJzKHJlcXVlc3QsIHZlcmIsIGV4dHJhY3RlZFBhcmFtZXRlcnMpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHZlcmIsIFJFR0lTVEVSX1ZFUkIpOworICBCT09TVF9DSEVDS19FUVVBTChleHRyYWN0ZWRQYXJhbWV0ZXJzLmdldE5hbWUoKSwgaWRlbnRpdHkpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShSZWdpc3RlclJldHJ5LCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIC8vIHNldFJldHJ5CisgIHJlYWRDb25maWcodHJ1ZSk7CisKKyAgY29ubmVjdFRvSHViKCk7CisKKyAgTmFtZSBpZGVudGl0eSgiL3JlbW90ZS9yZWdpc3RlciIpOworICBpbnNlcnRFbnRyeVdpdGhJZGVudGl0eShpZGVudGl0eSk7CisKKyAgd2FpdEZvclRpbWVvdXQoKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAyKTsKKworICBJbnRlcmVzdCYgcmVxdWVzdEZpcnN0ICA9IGZhY2UtPnNlbnRJbnRlcmVzdHNbMF07CisgIEludGVyZXN0JiByZXF1ZXN0U2Vjb25kID0gZmFjZS0+c2VudEludGVyZXN0c1sxXTsKKworICBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnMgZXh0cmFjdGVkUGFyYW1ldGVyc0ZpcnN0LCBleHRyYWN0ZWRQYXJhbWV0ZXJzU2Vjb25kOworICBOYW1lOjpDb21wb25lbnQgdmVyYkZpcnN0LCB2ZXJiU2Vjb25kOworICBleHRyYWN0UGFyYW1ldGVycyhyZXF1ZXN0Rmlyc3QsICB2ZXJiRmlyc3QsICBleHRyYWN0ZWRQYXJhbWV0ZXJzRmlyc3QpOworICBleHRyYWN0UGFyYW1ldGVycyhyZXF1ZXN0U2Vjb25kLCB2ZXJiU2Vjb25kLCBleHRyYWN0ZWRQYXJhbWV0ZXJzU2Vjb25kKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh2ZXJiRmlyc3QsICBSRUdJU1RFUl9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmVyYlNlY29uZCwgUkVHSVNURVJfVkVSQik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4dHJhY3RlZFBhcmFtZXRlcnNGaXJzdC5nZXROYW1lKCksICBpZGVudGl0eSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4dHJhY3RlZFBhcmFtZXRlcnNTZWNvbmQuZ2V0TmFtZSgpLCBpZGVudGl0eSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVucmVnaXN0ZXJXaXRob3V0SW5zZXJ0LCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIGNvbm5lY3RUb0h1YigpOworCisgIGVyYXNlRW50cnlXaXRoSWRlbnRpdHkoIi9yZW1vdGUvcmVnaXN0ZXIiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVW5yZWdpc3RlcldpdGhvdXRDb25uZWN0aW9uLCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIGNvbm5lY3RUb0h1YigpOworCisgIGRpc2Nvbm5lY3RUb0h1YigpOworCisgIE5hbWUgaW5kZW50aXR5KCIvcmVtb3RlL3JlZ2lzdGVyIik7CisgIHJlbW90ZVJlZ2lzdHJhdG9yLT5tX3JlZ0VudHJpZXMuaW5zZXJ0KAorICAgICAgICAgICAgbmZkOjpyaWI6OlJlbW90ZVJlZ2lzdHJhdG9yOjpSZWdpc3RlcmVkRW50cnkoaW5kZW50aXR5LCBFdmVudElkKCkpKTsKKworICBlcmFzZUVudHJ5V2l0aElkZW50aXR5KGluZGVudGl0eSk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50SW50ZXJlc3RzLnNpemUoKSwgMCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVucmVnaXN0ZXJXaXRob3V0U3VjY2Vzc2Z1bGxSZWdpc3RyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIGNvbm5lY3RUb0h1YigpOworCisgIE5hbWUgaWRlbnRpdHkoIi9yZW1vdGUvcmVnaXN0ZXIiKTsKKworICBpbnNlcnRFbnRyeVdpdGhJZGVudGl0eShpZGVudGl0eSk7CisKKyAgZXJhc2VFbnRyeVdpdGhJZGVudGl0eShpZGVudGl0eSk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50SW50ZXJlc3RzLnNpemUoKSwgMSk7CisKKyAgSW50ZXJlc3QmIHJlcXVlc3QgPSBmYWNlLT5zZW50SW50ZXJlc3RzWzBdOworCisgIG5kbjo6bmZkOjpDb250cm9sUGFyYW1ldGVycyBleHRyYWN0ZWRQYXJhbWV0ZXJzOworICBOYW1lOjpDb21wb25lbnQgdmVyYjsKKyAgZXh0cmFjdFBhcmFtZXRlcnMocmVxdWVzdCwgdmVyYiwgZXh0cmFjdGVkUGFyYW1ldGVycyk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmVyYiwgUkVHSVNURVJfVkVSQik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4dHJhY3RlZFBhcmFtZXRlcnMuZ2V0TmFtZSgpLCBpZGVudGl0eSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVucmVnaXN0ZXJCYXNpYywgUmVtb3RlUmVnaXN0cmF0b3JGaXh0dXJlKQoreworICBjb25uZWN0VG9IdWIoKTsKKworICBOYW1lIGlkZW50aXR5KCIvcmVtb3RlL3JlZ2lzdGVyIik7CisKKyAgaW5zZXJ0RW50cnlXaXRoSWRlbnRpdHkoaWRlbnRpdHkpOworCisgIEV2ZW50SWQgZXZlbnQ7CisKKyAgcmVtb3RlUmVnaXN0cmF0b3ItPm1fcmVnRW50cmllcy5pbnNlcnQoCisgICAgICAgICAgbmZkOjpyaWI6OlJlbW90ZVJlZ2lzdHJhdG9yOjpSZWdpc3RlcmVkRW50cnkoaWRlbnRpdHksIGV2ZW50KSk7CisKKyAgZXJhc2VFbnRyeVdpdGhJZGVudGl0eShpZGVudGl0eSk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50SW50ZXJlc3RzLnNpemUoKSwgMik7CisKKyAgSW50ZXJlc3QmIHJlcXVlc3QgPSBmYWNlLT5zZW50SW50ZXJlc3RzWzFdOworCisgIG5kbjo6bmZkOjpDb250cm9sUGFyYW1ldGVycyBleHRyYWN0ZWRQYXJhbWV0ZXJzOworICBOYW1lOjpDb21wb25lbnQgdmVyYjsKKyAgZXh0cmFjdFBhcmFtZXRlcnMocmVxdWVzdCwgdmVyYiwgZXh0cmFjdGVkUGFyYW1ldGVycyk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmVyYiwgVU5SRUdJU1RFUl9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXROYW1lKCksIGlkZW50aXR5KTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoVW5yZWdpc3RlckFkdmFuY2VkLCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIGNvbm5lY3RUb0h1YigpOworCisgIE5hbWUgaWRlbnRpdHlTaG9ydCgiL3JlbW90ZS9yZWdpc3RlciIpOworICBOYW1lIGlkZW50aXR5TG9uZygiL3JlbW90ZS9yZWdpc3Rlci9sb25nIik7CisKKyAgRXZlbnRJZCBldmVudFNob3J0OworICBFdmVudElkIGV2ZW50TG9uZzsKKworICBpbnNlcnRFbnRyeVdpdGhJZGVudGl0eShpZGVudGl0eVNob3J0LCBuYW1lOjpDb21wb25lbnQoImFwcEEiKSk7CisKKyAgcmVtb3RlUmVnaXN0cmF0b3ItPm1fcmVnRW50cmllcy5pbnNlcnQoCisgICAgICAgICAgbmZkOjpyaWI6OlJlbW90ZVJlZ2lzdHJhdG9yOjpSZWdpc3RlcmVkRW50cnkoaWRlbnRpdHlTaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFNob3J0KSk7CisKKyAgaW5zZXJ0RW50cnlXaXRoSWRlbnRpdHkoaWRlbnRpdHlTaG9ydCwgbmFtZTo6Q29tcG9uZW50KCJhcHBCIikpOworCisgIGluc2VydEVudHJ5V2l0aElkZW50aXR5KGlkZW50aXR5TG9uZyk7CisKKyAgcmVtb3RlUmVnaXN0cmF0b3ItPm1fcmVnRW50cmllcy5pbnNlcnQoCisgICAgICAgICAgbmZkOjpyaWI6OlJlbW90ZVJlZ2lzdHJhdG9yOjpSZWdpc3RlcmVkRW50cnkoaWRlbnRpdHlMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9uZykpOworCisgIC8vIHR3byByZWdpc3RyYXRpb24gY29tbWFuZHMgYXJlIGdlbmVyYXRlZCBmb3IgaWRlbnRpdHlTaG9ydCBhbmQgaWRlbnRpdHlMb25nCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZS0+c2VudEludGVyZXN0cy5zaXplKCksIDIpOworCisgIGVyYXNlRW50cnlXaXRoSWRlbnRpdHkoaWRlbnRpdHlTaG9ydCwgbmFtZTo6Q29tcG9uZW50KCJhcHBBIikpOworCisgIC8vIG5vIHVucmVnaXN0cmF0aW9uIGNvbW1hbmQgaXMgZ2VuZXJhdGVkIGFzIGFwcEIgYWxzbyBleGlzdHMKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50SW50ZXJlc3RzLnNpemUoKSwgMik7CisKKyAgZXJhc2VFbnRyeVdpdGhJZGVudGl0eShpZGVudGl0eVNob3J0LCBuYW1lOjpDb21wb25lbnQoImFwcEIiKSk7CisKKyAgLy8gb25lIHVucmVnaXN0cmF0aW9uIGNvbW1hbmQgaXMgZ2VuZXJhdGVkIGZvciBpZGVudGl0eVNob3J0CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZS0+c2VudEludGVyZXN0cy5zaXplKCksIDMpOworCisgIEludGVyZXN0JiByZXF1ZXN0ID0gZmFjZS0+c2VudEludGVyZXN0c1syXTsKKworICBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnMgZXh0cmFjdGVkUGFyYW1ldGVyczsKKyAgTmFtZTo6Q29tcG9uZW50IHZlcmI7CisgIGV4dHJhY3RQYXJhbWV0ZXJzKHJlcXVlc3QsIHZlcmIsIGV4dHJhY3RlZFBhcmFtZXRlcnMpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHZlcmIsIFVOUkVHSVNURVJfVkVSQik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4dHJhY3RlZFBhcmFtZXRlcnMuZ2V0TmFtZSgpLCBpZGVudGl0eVNob3J0KTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoRXJhc2VGYWNlLCBSZW1vdGVSZWdpc3RyYXRvckZpeHR1cmUpCit7CisgIGNvbm5lY3RUb0h1YigpOworCisgIE5hbWUgaWRlbnRpdHkoIi9yZW1vdGUvcmVnaXN0ZXIiKTsKKyAgdWludDY0X3QgZmFjZUlkID0gNTE3OworCisgIGluc2VydEVudHJ5V2l0aElkZW50aXR5KGlkZW50aXR5LCBERUZBVUxUX0FQUF9OQU1FLCBmYWNlSWQpOworCisgIEV2ZW50SWQgZXZlbnQ7CisKKyAgcmVtb3RlUmVnaXN0cmF0b3ItPm1fcmVnRW50cmllcy5pbnNlcnQoCisgICAgICAgICAgbmZkOjpyaWI6OlJlbW90ZVJlZ2lzdHJhdG9yOjpSZWdpc3RlcmVkRW50cnkoaWRlbnRpdHksIGV2ZW50KSk7CisKKyAgZXJhc2VGYWNlKGZhY2VJZCk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50SW50ZXJlc3RzLnNpemUoKSwgMik7CisKKyAgSW50ZXJlc3QmIHJlcXVlc3QgPSBmYWNlLT5zZW50SW50ZXJlc3RzWzFdOworCisgIG5kbjo6bmZkOjpDb250cm9sUGFyYW1ldGVycyBleHRyYWN0ZWRQYXJhbWV0ZXJzOworICBOYW1lOjpDb21wb25lbnQgdmVyYjsKKyAgZXh0cmFjdFBhcmFtZXRlcnMocmVxdWVzdCwgdmVyYiwgZXh0cmFjdGVkUGFyYW1ldGVycyk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmVyYiwgVU5SRUdJU1RFUl9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXROYW1lKCksIGlkZW50aXR5KTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVidWlsZENvbm5lY3Rpb24sIFJlbW90ZVJlZ2lzdHJhdG9yRml4dHVyZSkKK3sKKyAgY29ubmVjdFRvSHViKCk7CisKKyAgTmFtZSBpZGVudGl0eSgiL3JlbW90ZS9yZWdpc3RlciIpOworCisgIGluc2VydEVudHJ5V2l0aElkZW50aXR5KGlkZW50aXR5KTsKKworICBFdmVudElkIGV2ZW50OworCisgIHJlbW90ZVJlZ2lzdHJhdG9yLT5tX3JlZ0VudHJpZXMuaW5zZXJ0KAorICAgICAgICAgIG5mZDo6cmliOjpSZW1vdGVSZWdpc3RyYXRvcjo6UmVnaXN0ZXJlZEVudHJ5KGlkZW50aXR5LCBldmVudCkpOworCisgIGRpc2Nvbm5lY3RUb0h1YigpOworCisgIGNvbm5lY3RUb0h1YigpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZS0+c2VudEludGVyZXN0cy5zaXplKCksIDIpOworCisgIEludGVyZXN0JiByZXF1ZXN0MSA9IGZhY2UtPnNlbnRJbnRlcmVzdHNbMF07CisgIEludGVyZXN0JiByZXF1ZXN0MiA9IGZhY2UtPnNlbnRJbnRlcmVzdHNbMV07CisKKyAgbmRuOjpuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzIGV4dHJhY3RlZFBhcmFtZXRlcnMxLCBleHRyYWN0ZWRQYXJhbWV0ZXJzMjsKKyAgTmFtZTo6Q29tcG9uZW50IHZlcmIxLCB2ZXJiMjsKKyAgZXh0cmFjdFBhcmFtZXRlcnMocmVxdWVzdDEsIHZlcmIxLCBleHRyYWN0ZWRQYXJhbWV0ZXJzMSk7CisgIGV4dHJhY3RQYXJhbWV0ZXJzKHJlcXVlc3QyLCB2ZXJiMiwgZXh0cmFjdGVkUGFyYW1ldGVyczIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHZlcmIxLCBSRUdJU1RFUl9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmVyYjIsIFJFR0lTVEVSX1ZFUkIpOworICBCT09TVF9DSEVDS19FUVVBTChleHRyYWN0ZWRQYXJhbWV0ZXJzMS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZFBhcmFtZXRlcnMyLmdldE5hbWUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9yaWIvcmliLW1hbmFnZXIuY3BwIGIvTkZEL3Rlc3RzL3JpYi9yaWItbWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhNGE1ZAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy9yaWIvcmliLW1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMzYwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAicmliL3JpYi1tYW5hZ2VyLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZhY2Utc3RhdHVzLmhwcD4KKyNpbmNsdWRlICJyaWIvcmliLXN0YXR1cy1wdWJsaXNoZXItY29tbW9uLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlICJ0ZXN0cy9saW1pdGVkLWlvLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvZHVtbXktY2xpZW50LWZhY2UuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSByaWIgeworbmFtZXNwYWNlIHRlc3RzIHsKKworY2xhc3MgUmliTWFuYWdlckZpeHR1cmUgOiBwdWJsaWMgbmZkOjp0ZXN0czo6QmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgUmliTWFuYWdlckZpeHR1cmUoKQorICAgIDogQ09NTUFORF9QUkVGSVgoIi9sb2NhbGhvc3QvbmZkL3JpYiIpCisgICAgLCBBRERfTkVYVEhPUF9WRVJCKCJhZGQtbmV4dGhvcCIpCisgICAgLCBSRU1PVkVfTkVYVEhPUF9WRVJCKCJyZW1vdmUtbmV4dGhvcCIpCisgIHsKKyAgICBmYWNlID0gbmRuOjp1dGlsOjptYWtlRHVtbXlDbGllbnRGYWNlKCk7CisKKyAgICBtYW5hZ2VyID0gbWFrZV9zaGFyZWQ8UmliTWFuYWdlcj4obmRuOjpyZWYoKmZhY2UpKTsKKyAgICBtYW5hZ2VyLT5yZWdpc3RlcldpdGhOZmQoKTsKKworICAgIGZhY2UtPnByb2Nlc3NFdmVudHModGltZTo6bWlsbGlzZWNvbmRzKDEpKTsKKyAgICBmYWNlLT5zZW50SW50ZXJlc3RzLmNsZWFyKCk7CisgIH0KKworICB+UmliTWFuYWdlckZpeHR1cmUoKQorICB7CisgICAgbWFuYWdlci5yZXNldCgpOworICAgIGZhY2UucmVzZXQoKTsKKyAgfQorCisgIHZvaWQgZXh0cmFjdFBhcmFtZXRlcnMoSW50ZXJlc3QmIGludGVyZXN0LCBOYW1lOjpDb21wb25lbnQmIHZlcmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMmIGV4dHJhY3RlZFBhcmFtZXRlcnMpCisgIHsKKyAgICBjb25zdCBOYW1lJiBuYW1lID0gaW50ZXJlc3QuZ2V0TmFtZSgpOworICAgIHZlcmIgPSBuYW1lW0NPTU1BTkRfUFJFRklYLnNpemUoKV07CisgICAgY29uc3QgTmFtZTo6Q29tcG9uZW50JiBwYXJhbWV0ZXJDb21wb25lbnQgPSBuYW1lW0NPTU1BTkRfUFJFRklYLnNpemUoKSArIDFdOworCisgICAgQmxvY2sgcmF3UGFyYW1ldGVycyA9IHBhcmFtZXRlckNvbXBvbmVudC5ibG9ja0Zyb21WYWx1ZSgpOworICAgIGV4dHJhY3RlZFBhcmFtZXRlcnMud2lyZURlY29kZShyYXdQYXJhbWV0ZXJzKTsKKyAgfQorCisgIHZvaWQgcmVjZWl2ZUNvbW1hbmRJbnRlcmVzdChOYW1lJiBuYW1lLCBDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycykKKyAgeworICAgIHJlY2VpdmVDb21tYW5kSW50ZXJlc3QobmFtZS5hcHBlbmQocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpKTsKKyAgfQorCisgIHZvaWQgcmVjZWl2ZUNvbW1hbmRJbnRlcmVzdChjb25zdCBOYW1lJiBuYW1lKQorICB7CisgICAgSW50ZXJlc3QgY29tbWFuZChuYW1lKTsKKworICAgIGZhY2UtPnJlY2VpdmUoY29tbWFuZCk7CisgICAgZmFjZS0+cHJvY2Vzc0V2ZW50cyh0aW1lOjptaWxsaXNlY29uZHMoMSkpOworICB9CisKK3B1YmxpYzoKKyAgc2hhcmVkX3B0cjxSaWJNYW5hZ2VyPiBtYW5hZ2VyOworICBzaGFyZWRfcHRyPG5kbjo6dXRpbDo6RHVtbXlDbGllbnRGYWNlPiBmYWNlOworCisgIGNvbnN0IE5hbWUgQ09NTUFORF9QUkVGSVg7CisgIGNvbnN0IE5hbWU6OkNvbXBvbmVudCBBRERfTkVYVEhPUF9WRVJCOworICBjb25zdCBOYW1lOjpDb21wb25lbnQgUkVNT1ZFX05FWFRIT1BfVkVSQjsKK307CisKK2NsYXNzIEF1dGhvcml6ZWRSaWJNYW5hZ2VyIDogcHVibGljIFJpYk1hbmFnZXJGaXh0dXJlCit7CitwdWJsaWM6CisgIEF1dGhvcml6ZWRSaWJNYW5hZ2VyKCkKKyAgeworICAgIENvbmZpZ0ZpbGUgY29uZmlnOworICAgIG1hbmFnZXItPnNldENvbmZpZ0ZpbGUoY29uZmlnKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIENPTkZJR19TVFJJTkcgPQorICAgICJyaWJcbiIKKyAgICAie1xuIgorICAgICIgIGxvY2FsaG9zdF9zZWN1cml0eVxuIgorICAgICIgIHtcbiIKKyAgICAiICAgIHRydXN0LWFuY2hvclxuIgorICAgICIgICAge1xuIgorICAgICIgICAgICB0eXBlIGFueVxuIgorICAgICIgICAgfVxuIgorICAgICIgIH0iCisgICAgIn0iOworCisgICAgY29uZmlnLnBhcnNlKENPTkZJR19TVFJJTkcsIHRydWUsICJ0ZXN0LXJpYiIpOworICB9Cit9OworCit0eXBlZGVmIFJpYk1hbmFnZXJGaXh0dXJlIFVuYXV0aG9yaXplZFJpYk1hbmFnZXI7CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShSaWJNYW5hZ2VyLCBSaWJNYW5hZ2VyRml4dHVyZSkKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoU2hvcnROYW1lLCBBdXRob3JpemVkUmliTWFuYWdlcikKK3sKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliIik7CisgIHJlY2VpdmVDb21tYW5kSW50ZXJlc3QoY29tbWFuZE5hbWUpOworICAvLyBUT0RPIHZlcmlmeSBlcnJvciByZXNwb25zZQorfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShCYXNpYywgQXV0aG9yaXplZFJpYk1hbmFnZXIpCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMKKyAgICAuc2V0TmFtZSgiL2hlbGxvIikKKyAgICAuc2V0RmFjZUlkKDEpCisgICAgLnNldENvc3QoMTApCisgICAgLnNldEZsYWdzKDApCisgICAgLnNldE9yaWdpbigxMjgpCisgICAgLnNldEV4cGlyYXRpb25QZXJpb2QobmRuOjp0aW1lOjptaWxsaXNlY29uZHM6Om1heCgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9yaWIvcmVnaXN0ZXIiKTsKKworICByZWNlaXZlQ29tbWFuZEludGVyZXN0KGNvbW1hbmROYW1lLCBwYXJhbWV0ZXJzKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAxKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVnaXN0ZXIsIEF1dGhvcml6ZWRSaWJNYW5hZ2VyKQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzCisgICAgLnNldE5hbWUoIi9oZWxsbyIpCisgICAgLnNldEZhY2VJZCgxKQorICAgIC5zZXRDb3N0KDEwKQorICAgIC5zZXRGbGFncygwKQorICAgIC5zZXRPcmlnaW4oMTI4KQorICAgIC5zZXRFeHBpcmF0aW9uUGVyaW9kKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzOjptYXgoKSk7CisKKyAgTmFtZSBjb21tYW5kTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliL3JlZ2lzdGVyIik7CisKKyAgcmVjZWl2ZUNvbW1hbmRJbnRlcmVzdChjb21tYW5kTmFtZSwgcGFyYW1ldGVycyk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50SW50ZXJlc3RzLnNpemUoKSwgMSk7CisKKyAgSW50ZXJlc3QmIHJlcXVlc3QgPSBmYWNlLT5zZW50SW50ZXJlc3RzWzBdOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIGV4dHJhY3RlZFBhcmFtZXRlcnM7CisgIE5hbWU6OkNvbXBvbmVudCB2ZXJiOworICBleHRyYWN0UGFyYW1ldGVycyhyZXF1ZXN0LCB2ZXJiLCBleHRyYWN0ZWRQYXJhbWV0ZXJzKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh2ZXJiLCBBRERfTkVYVEhPUF9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXROYW1lKCksIHBhcmFtZXRlcnMuZ2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXRGYWNlSWQoKSwgcGFyYW1ldGVycy5nZXRGYWNlSWQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4dHJhY3RlZFBhcmFtZXRlcnMuZ2V0Q29zdCgpLCBwYXJhbWV0ZXJzLmdldENvc3QoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVucmVnaXN0ZXIsIEF1dGhvcml6ZWRSaWJNYW5hZ2VyKQoreworICBDb250cm9sUGFyYW1ldGVycyBhZGRQYXJhbWV0ZXJzOworICBhZGRQYXJhbWV0ZXJzCisgICAgLnNldE5hbWUoIi9oZWxsbyIpCisgICAgLnNldEZhY2VJZCgxKQorICAgIC5zZXRDb3N0KDEwKQorICAgIC5zZXRGbGFncygwKQorICAgIC5zZXRPcmlnaW4oMTI4KQorICAgIC5zZXRFeHBpcmF0aW9uUGVyaW9kKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzOjptYXgoKSk7CisKKyAgTmFtZSByZWdpc3Rlck5hbWUoIi9sb2NhbGhvc3QvbmZkL3JpYi9yZWdpc3RlciIpOworCisgIHJlY2VpdmVDb21tYW5kSW50ZXJlc3QocmVnaXN0ZXJOYW1lLCBhZGRQYXJhbWV0ZXJzKTsKKyAgZmFjZS0+c2VudEludGVyZXN0cy5jbGVhcigpOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHJlbW92ZVBhcmFtZXRlcnM7CisgIHJlbW92ZVBhcmFtZXRlcnMKKyAgICAuc2V0TmFtZSgiL2hlbGxvIikKKyAgICAuc2V0RmFjZUlkKDEpCisgICAgLnNldE9yaWdpbigxMjgpOworCisgIE5hbWUgdW5yZWdpc3Rlck5hbWUoIi9sb2NhbGhvc3QvbmZkL3JpYi91bnJlZ2lzdGVyIik7CisKKyAgcmVjZWl2ZUNvbW1hbmRJbnRlcmVzdCh1bnJlZ2lzdGVyTmFtZSwgcmVtb3ZlUGFyYW1ldGVycyk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChmYWNlLT5zZW50SW50ZXJlc3RzLnNpemUoKSwgMSk7CisKKyAgSW50ZXJlc3QmIHJlcXVlc3QgPSBmYWNlLT5zZW50SW50ZXJlc3RzWzBdOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIGV4dHJhY3RlZFBhcmFtZXRlcnM7CisgIE5hbWU6OkNvbXBvbmVudCB2ZXJiOworICBleHRyYWN0UGFyYW1ldGVycyhyZXF1ZXN0LCB2ZXJiLCBleHRyYWN0ZWRQYXJhbWV0ZXJzKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh2ZXJiLCBSRU1PVkVfTkVYVEhPUF9WRVJCKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXROYW1lKCksIHJlbW92ZVBhcmFtZXRlcnMuZ2V0TmFtZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXh0cmFjdGVkUGFyYW1ldGVycy5nZXRGYWNlSWQoKSwgcmVtb3ZlUGFyYW1ldGVycy5nZXRGYWNlSWQoKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKFVuYXV0aG9yaXplZENvbW1hbmQsIFVuYXV0aG9yaXplZFJpYk1hbmFnZXIpCit7CisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMKKyAgICAuc2V0TmFtZSgiL2hlbGxvIikKKyAgICAuc2V0RmFjZUlkKDEpCisgICAgLnNldENvc3QoMTApCisgICAgLnNldEZsYWdzKDApCisgICAgLnNldE9yaWdpbigxMjgpCisgICAgLnNldEV4cGlyYXRpb25QZXJpb2QobmRuOjp0aW1lOjptaWxsaXNlY29uZHM6Om1heCgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9yaWIvcmVnaXN0ZXIiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKKworICByZWNlaXZlQ29tbWFuZEludGVyZXN0KGNvbW1hbmROYW1lLCBwYXJhbWV0ZXJzKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmliU3RhdHVzUmVxdWVzdCwgQXV0aG9yaXplZFJpYk1hbmFnZXIpCit7CisgIEZhY2VFbnRyeSBlbnRyeTsKKyAgTmFtZSBuYW1lKCIvIik7CisgIGVudHJ5LmZhY2VJZCA9IDE7CisgIGVudHJ5Lm9yaWdpbiA9IDEyODsKKyAgZW50cnkuY29zdCA9IDMyOworICBlbnRyeS5mbGFncyA9IG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkU7CisKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycworICAgIC5zZXROYW1lKG5hbWUpCisgICAgLnNldEZhY2VJZChlbnRyeS5mYWNlSWQpCisgICAgLnNldE9yaWdpbihlbnRyeS5vcmlnaW4pCisgICAgLnNldENvc3QoZW50cnkuY29zdCkKKyAgICAuc2V0RmxhZ3MoZW50cnkuZmxhZ3MpCisgICAgLnNldEV4cGlyYXRpb25QZXJpb2QobmRuOjp0aW1lOjptaWxsaXNlY29uZHM6Om1heCgpKTsKKworICBOYW1lIGNvbW1hbmROYW1lKCIvbG9jYWxob3N0L25mZC9yaWIvcmVnaXN0ZXIiKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnRJbnRlcmVzdHMuc2l6ZSgpLCAwKTsKKworICByZWNlaXZlQ29tbWFuZEludGVyZXN0KGNvbW1hbmROYW1lLCBwYXJhbWV0ZXJzKTsKKyAgZmFjZS0+c2VudEludGVyZXN0cy5jbGVhcigpOworICBmYWNlLT5zZW50RGF0YXMuY2xlYXIoKTsKKworICBmYWNlLT5yZWNlaXZlKEludGVyZXN0KCIvbG9jYWxob3N0L25mZC9yaWIvbGlzdCIpKTsKKyAgZmFjZS0+cHJvY2Vzc0V2ZW50cyh0aW1lOjptaWxsaXNlY29uZHMoMSkpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZS0+c2VudERhdGFzLnNpemUoKSwgMSk7CisgIFJpYlN0YXR1c1B1Ymxpc2hlckZpeHR1cmU6OmRlY29kZVJpYkVudHJ5QmxvY2soZmFjZS0+c2VudERhdGFzWzBdLCBuYW1lLCBlbnRyeSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKENhbmNlbEV4cGlyYXRpb25FdmVudCwgQXV0aG9yaXplZFJpYk1hbmFnZXIpCit7CisgIC8vIFJlZ2lzdGVyIGZhY2UKKyAgQ29udHJvbFBhcmFtZXRlcnMgYWRkUGFyYW1ldGVyczsKKyAgYWRkUGFyYW1ldGVycworICAgIC5zZXROYW1lKCIvZXhwaXJlIikKKyAgICAuc2V0RmFjZUlkKDEpCisgICAgLnNldENvc3QoMTApCisgICAgLnNldEZsYWdzKDApCisgICAgLnNldE9yaWdpbigxMjgpCisgICAgLnNldEV4cGlyYXRpb25QZXJpb2QobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoNTAwKSk7CisKKyAgTmFtZSByZWdpc3Rlck5hbWUoIi9sb2NhbGhvc3QvbmZkL3JpYi9yZWdpc3RlciIpOworCisgIHJlY2VpdmVDb21tYW5kSW50ZXJlc3QocmVnaXN0ZXJOYW1lLCBhZGRQYXJhbWV0ZXJzKTsKKyAgZmFjZS0+c2VudEludGVyZXN0cy5jbGVhcigpOworCisgIC8vIFVucmVnaXN0ZXIgZmFjZQorICBDb250cm9sUGFyYW1ldGVycyByZW1vdmVQYXJhbWV0ZXJzOworICByZW1vdmVQYXJhbWV0ZXJzCisgICAgLnNldE5hbWUoIi9leHBpcmUiKQorICAgIC5zZXRGYWNlSWQoMSkKKyAgICAuc2V0T3JpZ2luKDEyOCk7CisKKyAgTmFtZSB1bnJlZ2lzdGVyTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliL3VucmVnaXN0ZXIiKTsKKworICByZWNlaXZlQ29tbWFuZEludGVyZXN0KHVucmVnaXN0ZXJOYW1lLCByZW1vdmVQYXJhbWV0ZXJzKTsKKworICAvLyBSZXJlZ2lzdGVyIGZhY2UKKyAgTmFtZSByZVJlZ2lzdGVyTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliL3JlZ2lzdGVyIik7CisgIGFkZFBhcmFtZXRlcnMuc2V0RXhwaXJhdGlvblBlcmlvZChuZG46OnRpbWU6Om1pbGxpc2Vjb25kczo6bWF4KCkpOworICByZWNlaXZlQ29tbWFuZEludGVyZXN0KHJlUmVnaXN0ZXJOYW1lLCBhZGRQYXJhbWV0ZXJzKTsKKworICBuZmQ6OnRlc3RzOjpMaW1pdGVkSW8gbGltaXRlZElvOworICBsaW1pdGVkSW8ucnVuKG5mZDo6dGVzdHM6OkxpbWl0ZWRJbzo6VU5MSU1JVEVEX09QUywgdGltZTo6c2Vjb25kcygxKSk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChtYW5hZ2VyLT5tX21hbmFnZWRSaWIuc2l6ZSgpLCAxKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoUmVtb3ZlSW52YWxpZEZhY2VzLCBBdXRob3JpemVkUmliTWFuYWdlcikKK3sKKyAgLy8gUmVnaXN0ZXIgdmFsaWQgZmFjZQorICBDb250cm9sUGFyYW1ldGVycyB2YWxpZFBhcmFtZXRlcnM7CisgIHZhbGlkUGFyYW1ldGVycworICAgIC5zZXROYW1lKCIvdGVzdCIpCisgICAgLnNldEZhY2VJZCgxKTsKKworICBOYW1lIHZhbGlkTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliL3JlZ2lzdGVyIik7CisgIHJlY2VpdmVDb21tYW5kSW50ZXJlc3QodmFsaWROYW1lLCB2YWxpZFBhcmFtZXRlcnMpOworCisgIC8vIFJlZ2lzdGVyIGludmFsaWQgZmFjZQorICBDb250cm9sUGFyYW1ldGVycyBpbnZhbGlkUGFyYW1ldGVyczsKKyAgaW52YWxpZFBhcmFtZXRlcnMKKyAgICAuc2V0TmFtZSgiL3Rlc3QiKQorICAgIC5zZXRGYWNlSWQoMik7CisKKyAgTmFtZSBpbnZhbGlkTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliL3JlZ2lzdGVyIik7CisgIHJlY2VpdmVDb21tYW5kSW50ZXJlc3QoaW52YWxpZE5hbWUsIGludmFsaWRQYXJhbWV0ZXJzKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKG1hbmFnZXItPm1fbWFuYWdlZFJpYi5zaXplKCksIDIpOworCisgIC8vIFJlY2VpdmUgc3RhdHVzIHdpdGggb25seSBmYWNlSWQ6IDEKKyAgbmRuOjpuZmQ6OkZhY2VTdGF0dXMgc3RhdHVzOworICBzdGF0dXMuc2V0RmFjZUlkKDEpOworCisgIHNoYXJlZF9wdHI8RGF0YT4gZGF0YSA9IG5mZDo6dGVzdHM6Om1ha2VEYXRhKCIvbG9jYWxob3N0L25mZC9mYWNlcy9saXN0Iik7CisgIGRhdGEtPnNldENvbnRlbnQoc3RhdHVzLndpcmVFbmNvZGUoKSk7CisKKyAgc2hhcmVkX3B0cjxuZG46Ok9CdWZmZXJTdHJlYW0+IGJ1ZmZlciA9IG1ha2Vfc2hhcmVkPG5kbjo6T0J1ZmZlclN0cmVhbT4oKTsKKyAgYnVmZmVyLT53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhLT5nZXRDb250ZW50KCkudmFsdWUoKSksCisgICAgICAgICAgICAgICAgZGF0YS0+Z2V0Q29udGVudCgpLnZhbHVlX3NpemUoKSk7CisKKyAgbWFuYWdlci0+cmVtb3ZlSW52YWxpZEZhY2VzKGJ1ZmZlcik7CisKKyAgLy8gUnVuIHNjaGVkdWxlcgorICBuZmQ6OnRlc3RzOjpMaW1pdGVkSW8gbGltaXRlZElvOworICBsaW1pdGVkSW8ucnVuKG5mZDo6dGVzdHM6OkxpbWl0ZWRJbzo6VU5MSU1JVEVEX09QUywgdGltZTo6c2Vjb25kcygxKSk7CisKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChtYW5hZ2VyLT5tX21hbmFnZWRSaWIuc2l6ZSgpLCAxKTsKKworICBSaWI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFuYWdlci0+bV9tYW5hZ2VkUmliLmZpbmQoIi90ZXN0Iik7CisgIEJPT1NUX1JFUVVJUkUoaXQgIT0gbWFuYWdlci0+bV9tYW5hZ2VkUmliLmVuZCgpKTsKKworICBzaGFyZWRfcHRyPFJpYkVudHJ5PiBlbnRyeSA9IGl0LT5zZWNvbmQ7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LT5oYXNGYWNlSWQoMSksIHRydWUpOworICBCT09TVF9DSEVDS19FUVVBTChlbnRyeS0+aGFzRmFjZUlkKDIpLCBmYWxzZSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9yaWIvcmliLXN0YXR1cy1wdWJsaXNoZXItY29tbW9uLmhwcCBiL05GRC90ZXN0cy9yaWIvcmliLXN0YXR1cy1wdWJsaXNoZXItY29tbW9uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNjZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL3JpYi9yaWItc3RhdHVzLXB1Ymxpc2hlci1jb21tb24uaHBwCkBAIC0wLDAgKzEsOTMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgUklCX1RFU1RTX1VOSVRfVEVTVFNfUklCX1NUQVRVU19QVUJMSVNIRVJfQ09NTU9OX0hQUAorI2RlZmluZSBSSUJfVEVTVFNfVU5JVF9URVNUU19SSUJfU1RBVFVTX1BVQkxJU0hFUl9DT01NT05fSFBQCisKKyNpbmNsdWRlICJyaWIvcmliLXN0YXR1cy1wdWJsaXNoZXIuaHBwIgorCisjaW5jbHVkZSAidGVzdHMvdGVzdC1jb21tb24uaHBwIgorI2luY2x1ZGUgInJpYi9yaWIuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sLXBhcmFtZXRlcnMuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtcmliLWVudHJ5LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L2VuY29kaW5nL3Rsdi5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CituYW1lc3BhY2UgdGVzdHMgeworCit1c2luZyBuZG46Om5mZDo6Q29udHJvbFBhcmFtZXRlcnM7CisKK2NsYXNzIFJpYlN0YXR1c1B1Ymxpc2hlckZpeHR1cmUgOiBwdWJsaWMgbmZkOjp0ZXN0czo6QmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQKKyAgdmFsaWRhdGVSaWJFbnRyeShjb25zdCBCbG9jayYgYmxvY2ssIGNvbnN0IE5hbWUmIHJlZmVyZW5jZU5hbWUsIGNvbnN0IEZhY2VFbnRyeSYgcmVmZXJlbmNlRmFjZSkKKyAgeworICAgIG5kbjo6bmZkOjpSaWJFbnRyeSBlbnRyeTsKKyAgICBCT09TVF9SRVFVSVJFX05PX1RIUk9XKGVudHJ5LndpcmVEZWNvZGUoYmxvY2spKTsKKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LmdldE5hbWUoKSwgcmVmZXJlbmNlTmFtZSk7CisKKyAgICBzdGQ6Omxpc3Q8bmRuOjpuZmQ6OlJvdXRlPiByb3V0ZXMgPSBlbnRyeS5nZXRSb3V0ZXMoKTsKKworICAgIHN0ZDo6bGlzdDxuZG46Om5mZDo6Um91dGU+OjppdGVyYXRvciBpdCA9IHJvdXRlcy5iZWdpbigpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGl0LT5nZXRGYWNlSWQoKSwgcmVmZXJlbmNlRmFjZS5mYWNlSWQpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGl0LT5nZXRPcmlnaW4oKSwgcmVmZXJlbmNlRmFjZS5vcmlnaW4pOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGl0LT5nZXRDb3N0KCksIHJlZmVyZW5jZUZhY2UuY29zdCk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXQtPmdldEZsYWdzKCksIHJlZmVyZW5jZUZhY2UuZmxhZ3MpOworICB9CisKKyAgc3RhdGljIHZvaWQKKyAgZGVjb2RlUmliRW50cnlCbG9jayhjb25zdCBEYXRhJiBkYXRhLCBjb25zdCBOYW1lJiByZWZlcmVuY2VOYW1lLCBjb25zdCBGYWNlRW50cnkmIHJlZmVyZW5jZUZhY2UpCisgIHsKKyAgICBuZG46OkVuY29kaW5nQnVmZmVyIGJ1ZmZlcjsKKworICAgIEJsb2NrIHBheWxvYWQgPSBkYXRhLmdldENvbnRlbnQoKTsKKworICAgIGJ1ZmZlci5hcHBlbmRCeXRlQXJyYXkocGF5bG9hZC52YWx1ZSgpLCBwYXlsb2FkLnZhbHVlX3NpemUoKSk7CisgICAgYnVmZmVyLnByZXBlbmRWYXJOdW1iZXIoYnVmZmVyLnNpemUoKSk7CisgICAgYnVmZmVyLnByZXBlbmRWYXJOdW1iZXIodGx2OjpDb250ZW50KTsKKworICAgIG5kbjo6QmxvY2sgcGFyc2VyKGJ1ZmZlci5idWYoKSwgYnVmZmVyLnNpemUoKSk7CisgICAgcGFyc2VyLnBhcnNlKCk7CisKKyAgICBCbG9jazo6ZWxlbWVudF9jb25zdF9pdGVyYXRvciBpID0gcGFyc2VyLmVsZW1lbnRzX2JlZ2luKCk7CisKKyAgICBpZiAoaS0+dHlwZSgpICE9IG5kbjo6dGx2OjpuZmQ6OlJpYkVudHJ5KSB7CisgICAgICBCT09TVF9GQUlMKCJleHBlY3RlZCBSaWJFbnRyeSwgZ290IHR5cGUgIyIgPDwgaS0+dHlwZSgpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2YWxpZGF0ZVJpYkVudHJ5KCppLCByZWZlcmVuY2VOYW1lLCByZWZlcmVuY2VGYWNlKTsKKyAgICB9CisgIH0KK307CisKKyNlbmRpZiAvLyBSSUJfVEVTVFNfVU5JVF9URVNUU19SSUJfU1RBVFVTX1BVQkxJU0hFUl9DT01NT05fSFBQCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSByaWIKK30gLy8gbmFtZXNwYWNlIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL3JpYi9yaWItc3RhdHVzLXB1Ymxpc2hlci5jcHAgYi9ORkQvdGVzdHMvcmliL3JpYi1zdGF0dXMtcHVibGlzaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTQxNGNjCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL3JpYi9yaWItc3RhdHVzLXB1Ymxpc2hlci5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInJpYi9yaWItc3RhdHVzLXB1Ymxpc2hlci5ocHAiCisjaW5jbHVkZSAicmliLXN0YXR1cy1wdWJsaXNoZXItY29tbW9uLmhwcCIKKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvZHVtbXktY2xpZW50LWZhY2UuaHBwPgorCituYW1lc3BhY2UgbmZkIHsKK25hbWVzcGFjZSByaWIgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFJpYlN0YXR1c1B1Ymxpc2hlclN1aXRlLCBSaWJTdGF0dXNQdWJsaXNoZXJGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCYXNpYykKK3sKKyAgUmliIHJpYjsKKworICBGYWNlRW50cnkgZW50cnk7CisgIE5hbWUgbmFtZSgiLyIpOworICBlbnRyeS5mYWNlSWQgPSAxOworICBlbnRyeS5vcmlnaW4gPSAxMjg7CisgIGVudHJ5LmNvc3QgPSAzMjsKKyAgZW50cnkuZmxhZ3MgPSBuZG46Om5mZDo6Uk9VVEVfRkxBR19DQVBUVVJFOworICByaWIuaW5zZXJ0KG5hbWUsIGVudHJ5KTsKKworICBuZG46OktleUNoYWluIGtleUNoYWluOworICBzaGFyZWRfcHRyPG5kbjo6dXRpbDo6RHVtbXlDbGllbnRGYWNlPiBmYWNlID0gbmRuOjp1dGlsOjptYWtlRHVtbXlDbGllbnRGYWNlKCk7CisgIFJpYlN0YXR1c1B1Ymxpc2hlciBwdWJsaXNoZXIocmliLCAqZmFjZSwgIi9sb2NhbGhvc3QvbmZkL3JpYi9saXN0Iiwga2V5Q2hhaW4pOworCisgIHB1Ymxpc2hlci5wdWJsaXNoKCk7CisgIGZhY2UtPnByb2Nlc3NFdmVudHModGltZTo6bWlsbGlzZWNvbmRzKDEpKTsKKworICBCT09TVF9SRVFVSVJFX0VRVUFMKGZhY2UtPnNlbnREYXRhcy5zaXplKCksIDEpOworICBkZWNvZGVSaWJFbnRyeUJsb2NrKGZhY2UtPnNlbnREYXRhc1swXSwgbmFtZSwgZW50cnkpOworfQorCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgcmliCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy9yaWIvcmliLmNwcCBiL05GRC90ZXN0cy9yaWIvcmliLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjI2ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL3JpYi9yaWIuY3BwCkBAIC0wLDAgKzEsMzM1IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAicmliL3JpYi5ocHAiCisKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHJpYiB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoUmliLCBuZmQ6OnRlc3RzOjpCYXNlRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmliRW50cnkpCit7CisgIHJpYjo6UmliRW50cnkgZW50cnk7CisKKyAgcmliOjpGYWNlRW50cnkgZmFjZTE7CisgIGZhY2UxLmZhY2VJZCA9IDE7CisgIGZhY2UxLm9yaWdpbiA9IDA7CisKKyAgZW50cnkuaW5zZXJ0RmFjZShmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LmdldEZhY2VzKCkuc2l6ZSgpLCAxKTsKKworICBGYWNlRW50cnkgZmFjZTI7CisgIGZhY2UyLmZhY2VJZCA9IDE7CisgIGZhY2UyLm9yaWdpbiA9IDEyODsKKworICBlbnRyeS5pbnNlcnRGYWNlKGZhY2UyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkuZ2V0RmFjZXMoKS5zaXplKCksIDIpOworCisgIGVudHJ5LmVyYXNlRmFjZShmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LmdldEZhY2VzKCkuc2l6ZSgpLCAxKTsKKworICBCT09TVF9DSEVDSyhlbnRyeS5maW5kRmFjZShmYWNlMSkgPT0gZW50cnkuZ2V0RmFjZXMoKS5lbmQoKSk7CisgIEJPT1NUX0NIRUNLKGVudHJ5LmZpbmRGYWNlKGZhY2UyKSAhPSBlbnRyeS5nZXRGYWNlcygpLmVuZCgpKTsKKworICBlbnRyeS5pbnNlcnRGYWNlKGZhY2UyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZW50cnkuZ2V0RmFjZXMoKS5zaXplKCksIDEpOworCisgIGVudHJ5LmVyYXNlRmFjZShmYWNlMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGVudHJ5LmdldEZhY2VzKCkuc2l6ZSgpLCAxKTsKKyAgQk9PU1RfQ0hFQ0soZW50cnkuZmluZEZhY2UoZmFjZTIpICE9IGVudHJ5LmdldEZhY2VzKCkuZW5kKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShQYXJlbnQpCit7CisgIHJpYjo6UmliIHJpYjsKKworICBGYWNlRW50cnkgcm9vdDsKKyAgTmFtZSBuYW1lMSgiLyIpOworICByb290LmZhY2VJZCA9IDE7CisgIHJvb3Qub3JpZ2luID0gMjA7CisgIHJpYi5pbnNlcnQobmFtZTEsIHJvb3QpOworCisgIEZhY2VFbnRyeSBlbnRyeTE7CisgIE5hbWUgbmFtZTIoIi9oZWxsbyIpOworICBlbnRyeTEuZmFjZUlkID0gMjsKKyAgZW50cnkxLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUyLCBlbnRyeTEpOworCisgIEZhY2VFbnRyeSBlbnRyeTI7CisgIE5hbWUgbmFtZTMoIi9oZWxsby93b3JsZCIpOworICBlbnRyeTIuZmFjZUlkID0gMzsKKyAgZW50cnkyLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUzLCBlbnRyeTIpOworCisgIHNoYXJlZF9wdHI8cmliOjpSaWJFbnRyeT4gcmliRW50cnkgPSByaWIuZmluZFBhcmVudChuYW1lMyk7CisgIEJPT1NUX1JFUVVJUkUoc3RhdGljX2Nhc3Q8Ym9vbD4ocmliRW50cnkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmliRW50cnktPmdldEZhY2VzKCkuZnJvbnQoKS5mYWNlSWQsIDIpOworCisgIHJpYkVudHJ5ID0gcmliLmZpbmRQYXJlbnQobmFtZTIpOworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KHJpYkVudHJ5KSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJpYkVudHJ5LT5nZXRGYWNlcygpLmZyb250KCkuZmFjZUlkLCAxKTsKKworICBGYWNlRW50cnkgZW50cnkzOworICBOYW1lIG5hbWU0KCIvaGVsbG8vdGVzdC9mb28vYmFyIik7CisgIGVudHJ5Mi5mYWNlSWQgPSAzOworICBlbnRyeTIub3JpZ2luID0gMjA7CisgIHJpYi5pbnNlcnQobmFtZTQsIGVudHJ5Myk7CisKKyAgcmliRW50cnkgPSByaWIuZmluZFBhcmVudChuYW1lNCk7CisgIEJPT1NUX0NIRUNLKHJpYkVudHJ5ICE9IHNoYXJlZF9wdHI8cmliOjpSaWJFbnRyeT4oKSk7CisgIEJPT1NUX0NIRUNLKHJpYkVudHJ5LT5nZXRGYWNlcygpLmZyb250KCkuZmFjZUlkID09IDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShDaGlsZHJlbikKK3sKKyAgcmliOjpSaWIgcmliOworCisgIEZhY2VFbnRyeSBlbnRyeTE7CisgIE5hbWUgbmFtZTEoIi8iKTsKKyAgZW50cnkxLmZhY2VJZCA9IDE7CisgIGVudHJ5MS5vcmlnaW4gPSAyMDsKKyAgcmliLmluc2VydChuYW1lMSwgZW50cnkxKTsKKworICBGYWNlRW50cnkgZW50cnkyOworICBOYW1lIG5hbWUyKCIvaGVsbG8vd29ybGQiKTsKKyAgZW50cnkyLmZhY2VJZCA9IDI7CisgIGVudHJ5Mi5vcmlnaW4gPSAyMDsKKyAgcmliLmluc2VydChuYW1lMiwgZW50cnkyKTsKKworICBGYWNlRW50cnkgZW50cnkzOworICBOYW1lIG5hbWUzKCIvaGVsbG8vdGVzdC9mb28vYmFyIik7CisgIGVudHJ5My5mYWNlSWQgPSAzOworICBlbnRyeTMub3JpZ2luID0gMjA7CisgIHJpYi5pbnNlcnQobmFtZTMsIGVudHJ5Myk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHJpYi5maW5kKG5hbWUxKS0+c2Vjb25kKS0+Z2V0Q2hpbGRyZW4oKS5zaXplKCksIDIpOworICBCT09TVF9DSEVDS19FUVVBTCgocmliLmZpbmQobmFtZTIpLT5zZWNvbmQpLT5nZXRDaGlsZHJlbigpLnNpemUoKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChyaWIuZmluZChuYW1lMyktPnNlY29uZCktPmdldENoaWxkcmVuKCkuc2l6ZSgpLCAwKTsKKworICBGYWNlRW50cnkgZW50cnk0OworICBOYW1lIG5hbWU0KCIvaGVsbG8iKTsKKyAgZW50cnk0LmZhY2VJZCA9IDQ7CisgIGVudHJ5NC5vcmlnaW4gPSAyMDsKKyAgcmliLmluc2VydChuYW1lNCwgZW50cnk0KTsKKworICBCT09TVF9DSEVDS19FUVVBTCgocmliLmZpbmQobmFtZTEpLT5zZWNvbmQpLT5nZXRDaGlsZHJlbigpLnNpemUoKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChyaWIuZmluZChuYW1lMiktPnNlY29uZCktPmdldENoaWxkcmVuKCkuc2l6ZSgpLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHJpYi5maW5kKG5hbWUzKS0+c2Vjb25kKS0+Z2V0Q2hpbGRyZW4oKS5zaXplKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTCgocmliLmZpbmQobmFtZTQpLT5zZWNvbmQpLT5nZXRDaGlsZHJlbigpLnNpemUoKSwgMik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHJpYi5maW5kKG5hbWUxKS0+c2Vjb25kKS0+Z2V0Q2hpbGRyZW4oKS5mcm9udCgpLT5nZXROYW1lKCksICIvaGVsbG8iKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHJpYi5maW5kKG5hbWU0KS0+c2Vjb25kKS0+Z2V0UGFyZW50KCktPmdldE5hbWUoKSwgIi8iKTsKKworICBCT09TVF9SRVFVSVJFKHN0YXRpY19jYXN0PGJvb2w+KChyaWIuZmluZChuYW1lMiktPnNlY29uZCktPmdldFBhcmVudCgpKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChyaWIuZmluZChuYW1lMiktPnNlY29uZCktPmdldFBhcmVudCgpLT5nZXROYW1lKCksIG5hbWU0KTsKKyAgQk9PU1RfUkVRVUlSRShzdGF0aWNfY2FzdDxib29sPigocmliLmZpbmQobmFtZTMpLT5zZWNvbmQpLT5nZXRQYXJlbnQoKSkpOworICBCT09TVF9DSEVDS19FUVVBTCgocmliLmZpbmQobmFtZTMpLT5zZWNvbmQpLT5nZXRQYXJlbnQoKS0+Z2V0TmFtZSgpLCBuYW1lNCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVyYXNlRmFjZSkKK3sKKyAgcmliOjpSaWIgcmliOworCisgIEZhY2VFbnRyeSBlbnRyeTE7CisgIE5hbWUgbmFtZTEoIi8iKTsKKyAgZW50cnkxLmZhY2VJZCA9IDE7CisgIGVudHJ5MS5vcmlnaW4gPSAyMDsKKyAgcmliLmluc2VydChuYW1lMSwgZW50cnkxKTsKKworICBGYWNlRW50cnkgZW50cnkyOworICBOYW1lIG5hbWUyKCIvaGVsbG8vd29ybGQiKTsKKyAgZW50cnkyLmZhY2VJZCA9IDI7CisgIGVudHJ5Mi5vcmlnaW4gPSAyMDsKKyAgcmliLmluc2VydChuYW1lMiwgZW50cnkyKTsKKworICBGYWNlRW50cnkgZW50cnkzOworICBOYW1lIG5hbWUzKCIvaGVsbG8vd29ybGQiKTsKKyAgZW50cnkzLmZhY2VJZCA9IDE7CisgIGVudHJ5My5vcmlnaW4gPSAyMDsKKyAgcmliLmluc2VydChuYW1lMywgZW50cnkzKTsKKworICBGYWNlRW50cnkgZW50cnk0OworICBOYW1lIG5hbWU0KCIvbm90L2luc2VydGVkIik7CisgIGVudHJ5NC5mYWNlSWQgPSAxOworICBlbnRyeTQub3JpZ2luID0gMjA7CisKKyAgcmliLmVyYXNlKG5hbWU0LCBlbnRyeTQpOworICByaWIuZXJhc2UobmFtZTEsIGVudHJ5MSk7CisKKyAgQk9PU1RfQ0hFQ0socmliLmZpbmQobmFtZTEpID09IHJpYi5lbmQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChyaWIuZmluZChuYW1lMiktPnNlY29uZCktPmdldEZhY2VzKCkuc2l6ZSgpLCAyKTsKKworICByaWIuZXJhc2UobmFtZTIsIGVudHJ5Mik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHJpYi5maW5kKG5hbWUyKS0+c2Vjb25kKS0+Z2V0RmFjZXMoKS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgocmliLmZpbmQobmFtZTIpLT5zZWNvbmQpLT5nZXRGYWNlcygpLmZyb250KCkuZmFjZUlkLCAxKTsKKworICByaWIuZXJhc2UobmFtZTMsIGVudHJ5Myk7CisKKyAgQk9PU1RfQ0hFQ0socmliLmZpbmQobmFtZTIpID09IHJpYi5lbmQoKSk7CisKKyAgcmliLmVyYXNlKG5hbWU0LCBlbnRyeTQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFcmFzZVJpYkVudHJ5KQoreworICByaWI6OlJpYiByaWI7CisKKyAgRmFjZUVudHJ5IGVudHJ5MTsKKyAgTmFtZSBuYW1lMSgiLyIpOworICBlbnRyeTEuZmFjZUlkID0gMTsKKyAgZW50cnkxLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUxLCBlbnRyeTEpOworCisgIEZhY2VFbnRyeSBlbnRyeTI7CisgIE5hbWUgbmFtZTIoIi9oZWxsbyIpOworICBlbnRyeTIuZmFjZUlkID0gMjsKKyAgZW50cnkyLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUyLCBlbnRyeTIpOworCisgIEZhY2VFbnRyeSBlbnRyeTM7CisgIE5hbWUgbmFtZTMoIi9oZWxsby93b3JsZCIpOworICBlbnRyeTMuZmFjZUlkID0gMTsKKyAgZW50cnkzLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUzLCBlbnRyeTMpOworCisgIHNoYXJlZF9wdHI8cmliOjpSaWJFbnRyeT4gcmliRW50cnkxID0gcmliLmZpbmQobmFtZTEpLT5zZWNvbmQ7CisgIHNoYXJlZF9wdHI8cmliOjpSaWJFbnRyeT4gcmliRW50cnkyID0gcmliLmZpbmQobmFtZTIpLT5zZWNvbmQ7CisgIHNoYXJlZF9wdHI8cmliOjpSaWJFbnRyeT4gcmliRW50cnkzID0gcmliLmZpbmQobmFtZTMpLT5zZWNvbmQ7CisKKyAgQk9PU1RfQ0hFQ0socmliRW50cnkxLT5nZXRDaGlsZHJlbigpLmZyb250KCkgPT0gcmliRW50cnkyKTsKKyAgQk9PU1RfQ0hFQ0socmliRW50cnkzLT5nZXRQYXJlbnQoKSA9PSByaWJFbnRyeTIpOworCisgIHJpYi5lcmFzZShuYW1lMiwgZW50cnkyKTsKKyAgQk9PU1RfQ0hFQ0socmliRW50cnkxLT5nZXRDaGlsZHJlbigpLmZyb250KCkgPT0gcmliRW50cnkzKTsKKyAgQk9PU1RfQ0hFQ0socmliRW50cnkzLT5nZXRQYXJlbnQoKSA9PSByaWJFbnRyeTEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShFcmFzZUJ5RmFjZUlkKQoreworICByaWI6OlJpYiByaWI7CisKKyAgRmFjZUVudHJ5IGVudHJ5MTsKKyAgTmFtZSBuYW1lMSgiLyIpOworICBlbnRyeTEuZmFjZUlkID0gMTsKKyAgZW50cnkxLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUxLCBlbnRyeTEpOworCisgIEZhY2VFbnRyeSBlbnRyeTI7CisgIE5hbWUgbmFtZTIoIi9oZWxsby93b3JsZCIpOworICBlbnRyeTIuZmFjZUlkID0gMjsKKyAgZW50cnkyLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUyLCBlbnRyeTIpOworCisgIEZhY2VFbnRyeSBlbnRyeTM7CisgIE5hbWUgbmFtZTMoIi9oZWxsby93b3JsZCIpOworICBlbnRyeTMuZmFjZUlkID0gMTsKKyAgZW50cnkzLm9yaWdpbiA9IDIwOworICByaWIuaW5zZXJ0KG5hbWUzLCBlbnRyeTMpOworCisgIHJpYi5lcmFzZSgxKTsKKyAgQk9PU1RfQ0hFQ0socmliLmZpbmQobmFtZTEpID09IHJpYi5lbmQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChyaWIuZmluZChuYW1lMiktPnNlY29uZCktPmdldEZhY2VzKCkuc2l6ZSgpLCAxKTsKKworICByaWIuZXJhc2UoMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChyaWIuZmluZChuYW1lMiktPnNlY29uZCktPmdldEZhY2VzKCkuc2l6ZSgpLCAxKTsKKworICByaWIuZXJhc2UoMik7CisgIEJPT1NUX0NIRUNLKHJpYi5maW5kKG5hbWUyKSA9PSByaWIuZW5kKCkpOworCisgIHJpYi5lcmFzZSgzKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQmFzaWMpCit7CisgIHJpYjo6UmliIHJpYjsKKworICBGYWNlRW50cnkgZW50cnkxOworICBOYW1lIG5hbWUxKCIvaGVsbG8vd29ybGQiKTsKKyAgZW50cnkxLmZhY2VJZCA9IDE7CisgIGVudHJ5MS5vcmlnaW4gPSAyMDsKKyAgZW50cnkxLmNvc3QgPSAxMDsKKyAgZW50cnkxLmZsYWdzID0gbmRuOjpuZmQ6OlJPVVRFX0ZMQUdfQ0hJTERfSU5IRVJJVCB8IG5kbjo6bmZkOjpST1VURV9GTEFHX0NBUFRVUkU7CisgIGVudHJ5MS5leHBpcmVzID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSArIHRpbWU6Om1pbGxpc2Vjb25kcygxNTAwKTsKKworICByaWIuaW5zZXJ0KG5hbWUxLCBlbnRyeTEpOworICBCT09TVF9DSEVDS19FUVVBTChyaWIuc2l6ZSgpLCAxKTsKKworICByaWIuaW5zZXJ0KG5hbWUxLCBlbnRyeTEpOworICBCT09TVF9DSEVDS19FUVVBTChyaWIuc2l6ZSgpLCAxKTsKKworICBGYWNlRW50cnkgZW50cnkyOworICBOYW1lIG5hbWUyKCIvaGVsbG8vd29ybGQiKTsKKyAgZW50cnkyLmZhY2VJZCA9IDE7CisgIGVudHJ5Mi5vcmlnaW4gPSAyMDsKKyAgZW50cnkyLmNvc3QgPSAxMDA7CisgIGVudHJ5Mi5mbGFncyA9IG5kbjo6bmZkOjpST1VURV9GTEFHX0NISUxEX0lOSEVSSVQ7CisgIGVudHJ5Mi5leHBpcmVzID0gdGltZTo6c3RlYWR5X2Nsb2NrOjpub3coKSArIHRpbWU6OnNlY29uZHMoMCk7CisKKyAgcmliLmluc2VydChuYW1lMiwgZW50cnkyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmliLnNpemUoKSwgMSk7CisKKyAgZW50cnkyLmZhY2VJZCA9IDI7CisgIHJpYi5pbnNlcnQobmFtZTIsIGVudHJ5Mik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJpYi5zaXplKCksIDIpOworCisgIEJPT1NUX0NIRUNLKHJpYi5maW5kKG5hbWUxKS0+c2Vjb25kLT5oYXNGYWNlSWQoZW50cnkxLmZhY2VJZCkpOworICBCT09TVF9DSEVDSyhyaWIuZmluZChuYW1lMSktPnNlY29uZC0+aGFzRmFjZUlkKGVudHJ5Mi5mYWNlSWQpKTsKKworICBOYW1lIG5hbWUzKCIvZm9vL2JhciIpOworICByaWIuaW5zZXJ0KG5hbWUzLCBlbnRyeTIpOworICBCT09TVF9DSEVDS19FUVVBTChyaWIuc2l6ZSgpLCAzKTsKKworICBlbnRyeTIub3JpZ2luID0gMTsKKyAgcmliLmluc2VydChuYW1lMywgZW50cnkyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmliLnNpemUoKSwgNCk7CisKKyAgcmliLmVyYXNlKG5hbWUzLCBlbnRyeTIpOworICBCT09TVF9DSEVDS19FUVVBTChyaWIuc2l6ZSgpLCAzKTsKKworICBOYW1lIG5hbWU0KCIvaGVsbG8vd29ybGQiKTsKKyAgcmliLmVyYXNlKG5hbWU0LCBlbnRyeTIpOworICBCT09TVF9DSEVDS19FUVVBTChyaWIuc2l6ZSgpLCAzKTsKKworICBlbnRyeTIub3JpZ2luID0gMjA7CisgIHJpYi5lcmFzZShuYW1lNCwgZW50cnkyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmliLnNpemUoKSwgMik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmliLmZpbmQobmFtZTIsIGVudHJ5MiksIHN0YXRpY19jYXN0PEZhY2VFbnRyeSo+KDApKTsKKyAgQk9PU1RfQ0hFQ0tfTkUocmliLmZpbmQobmFtZTEsIGVudHJ5MSksIHN0YXRpY19jYXN0PEZhY2VFbnRyeSo+KDApKTsKKworICByaWIuZXJhc2UobmFtZTEsIGVudHJ5MSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJpYi5zaXplKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIHJpYgorfSAvLyBuYW1lc3BhY2UgbmZkCmRpZmYgLS1naXQgYS9ORkQvdGVzdHMvdGVzdC1jYXNlLmNwcC5zYW1wbGUgYi9ORkQvdGVzdHMvdGVzdC1jYXNlLmNwcC5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwYWRkMgotLS0gL2Rldi9udWxsCisrKyBiL05GRC90ZXN0cy90ZXN0LWNhc2UuY3BwLnNhbXBsZQpAQCAtMCwwICsxLDY0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvLyAjaW5jbHVkZSAidW5pdC11bmRlci10ZXN0LmhwcCIKKy8vIFVuaXQgYmVpbmcgdGVzdGVkIE1VU1QgYmUgaW5jbHVkZWQgZmlyc3QsIHRvIGVuc3VyZSBoZWFkZXIgY29tcGlsZXMgb24gaXRzIG93bi4KKworI2luY2x1ZGUgInRlc3RzL3Rlc3QtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5mZCB7CituYW1lc3BhY2UgdGVzdHMgeworLy8gVW5pdCB0ZXN0cyBTSE9VTEQgZ28gaW5zaWRlIG5mZDo6dGVzdHMgbmFtZXNwYWNlLgorCisvLyBUZXN0IHN1aXRlIFNIT1VMRCB1c2UgQmFzZUZpeHR1cmUgb3IgYSBzdWJjbGFzcyBvZiBpdC4KK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUZXN0U2tlbGV0b24sIEJhc2VGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUZXN0MSkKK3sKKyAgaW50IGkgPSAwOworICAvKioKKyAgICogRm9yIHJlZmVyZW5jZSBvZiBhdmFpbGFibGUgQm9vc3QuVGVzdCBtYWNyb3MsIEBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvMV81NV8wL2xpYnMvdGVzdC9kb2MvaHRtbC91dGYvdGVzdGluZy10b29scy9yZWZlcmVuY2UuaHRtbAorICAgKi8KKworICBCT09TVF9SRVFVSVJFX05PX1RIUk9XKGkgPSAxKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChpLCAxKTsKK30KKworLy8gQ3VzdG9tIGZpeHR1cmUgU0hPVUxEIGRlcml2ZSBmcm9tIEJhc2VGaXh0dXJlLgorY2xhc3MgVGVzdDJGaXh0dXJlIDogcHJvdGVjdGVkIEJhc2VGaXh0dXJlCit7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShUZXN0MiwgVGVzdDJGaXh0dXJlKQoreworICAvLyBnX2lvIGlzIGEgc2hvcnRoYW5kIG9mIGdldEdsb2JhbElvU2VydmljZSgpCisgIC8vIHJlc2V0R2xvYmFsSW9TZXJ2aWNlKCkgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UKKyAgZ19pby5ydW4oKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZmQKZGlmZiAtLWdpdCBhL05GRC90ZXN0cy90ZXN0LWNvbW1vbi5ocHAgYi9ORkQvdGVzdHMvdGVzdC1jb21tb24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzMzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdGVzdHMvdGVzdC1jb21tb24uaHBwCkBAIC0wLDAgKzEsMTY3IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5GRF9URVNUU19URVNUX0NPTU1PTl9IUFAKKyNkZWZpbmUgTkZEX1RFU1RTX1RFU1RfQ09NTU9OX0hQUAorCisjaW5jbHVkZSAiYm9vc3QtdGVzdC5ocHAiCisKKyNpbmNsdWRlICJjb3JlL2dsb2JhbC1pby5ocHAiCisjaW5jbHVkZSAiY29yZS9sb2dnZXIuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3RpbWUtdW5pdC10ZXN0LWNsb2NrLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisKK25hbWVzcGFjZSBuZmQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworLyoqIFxicmllZiBiYXNlIHRlc3QgZml4dHVyZQorICoKKyAqICBFdmVyeSB0ZXN0IGNhc2Ugc2hvdWxkIGJlIGJhc2VkIG9uIHRoaXMgZml4dHVyZSwKKyAqICB0byBoYXZlIHBlciB0ZXN0IGNhc2UgaW9fc2VydmljZSBpbml0aWFsaXphdGlvbi4KKyAqLworY2xhc3MgQmFzZUZpeHR1cmUKK3sKK3Byb3RlY3RlZDoKKyAgQmFzZUZpeHR1cmUoKQorICAgIDogZ19pbyhnZXRHbG9iYWxJb1NlcnZpY2UoKSkKKyAgeworICB9CisKKyAgfkJhc2VGaXh0dXJlKCkKKyAgeworICAgIHJlc2V0R2xvYmFsSW9TZXJ2aWNlKCk7CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gcmVmZXJlbmNlIHRvIGdsb2JhbCBpb19zZXJ2aWNlCisgIGJvb3N0Ojphc2lvOjppb19zZXJ2aWNlJiBnX2lvOworfTsKKworLyoqIFxicmllZiBhIGJhc2UgdGVzdCBmaXh0dXJlIHRoYXQgb3ZlcnJpZGVzIHN0ZWFkeSBjbG9jayBhbmQgc3lzdGVtIGNsb2NrCisgKi8KK2NsYXNzIFVuaXRUZXN0VGltZUZpeHR1cmUgOiBwdWJsaWMgQmFzZUZpeHR1cmUKK3sKK3Byb3RlY3RlZDoKKyAgVW5pdFRlc3RUaW1lRml4dHVyZSgpCisgICAgOiBzdGVhZHlDbG9jayhtYWtlX3NoYXJlZDx0aW1lOjpVbml0VGVzdFN0ZWFkeUNsb2NrPigpKQorICAgICwgc3lzdGVtQ2xvY2sobWFrZV9zaGFyZWQ8dGltZTo6VW5pdFRlc3RTeXN0ZW1DbG9jaz4oKSkKKyAgeworICAgIHRpbWU6OnNldEN1c3RvbUNsb2NrcyhzdGVhZHlDbG9jaywgc3lzdGVtQ2xvY2spOworICB9CisKKyAgflVuaXRUZXN0VGltZUZpeHR1cmUoKQorICB7CisgICAgdGltZTo6c2V0Q3VzdG9tQ2xvY2tzKG51bGxwdHIsIG51bGxwdHIpOworICB9CisKKyAgLyoqIFxicmllZiBhZHZhbmNlIHN0ZWFkeSBhbmQgc3lzdGVtIGNsb2NrcworICAgKgorICAgKiAgQ2xvY2tzIGFyZSBhZHZhbmNlZCBpbiBpbmNyZW1lbnRzIG9mIFxwIHRpY2sgZm9yIFxwIG5UaWNrcyB0aWNrcy4KKyAgICogIEFmdGVyIGVhY2ggdGljaywgZ2xvYmFsIGlvX3NlcnZpY2UgaXMgcG9sbGVkIHRvIHByb2Nlc3MgcGVuZGluZyBJL08gZXZlbnRzLgorICAgKgorICAgKiAgRXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIEkvTyBldmVudHMgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlci4KKyAgICogIENsb2NrIGFkdmFuY2luZyB3b3VsZCBzdG9wIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uLgorICAgKi8KKyAgdm9pZAorICBhZHZhbmNlQ2xvY2tzKGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzJiB0aWNrLCBzaXplX3QgblRpY2tzID0gMSkKKyAgeworICAgIEJPT1NUX0FTU0VSVChuVGlja3MgPj0gMCk7CisKKyAgICB0aGlzLT5hZHZhbmNlQ2xvY2tzKHRpY2ssIHRpY2sgKiBuVGlja3MpOworICB9CisKKyAgLyoqIFxicmllZiBhZHZhbmNlIHN0ZWFkeSBhbmQgc3lzdGVtIGNsb2NrcworICAgKgorICAgKiAgQ2xvY2tzIGFyZSBhZHZhbmNlZCBpbiBpbmNyZW1lbnRzIG9mIFxwIHRpY2sgZm9yIFxwIHRvdGFsIHRpbWUuCisgICAqICBUaGUgbGFzdCBpbmNyZW1lbnQgbWlnaHQgYmUgc2hvcnRlciB0aGFuIFxwIHRpY2suCisgICAqICBBZnRlciBlYWNoIHRpY2ssIGdsb2JhbCBpb19zZXJ2aWNlIGlzIHBvbGxlZCB0byBwcm9jZXNzIHBlbmRpbmcgSS9PIGV2ZW50cy4KKyAgICoKKyAgICogIEV4Y2VwdGlvbnMgdGhyb3duIGR1cmluZyBJL08gZXZlbnRzIGFyZSBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIuCisgICAqICBDbG9jayBhZHZhbmNpbmcgd291bGQgc3RvcCBpbiBjYXNlIG9mIGFuIGV4Y2VwdGlvbi4KKyAgICovCisgIHZvaWQKKyAgYWR2YW5jZUNsb2Nrcyhjb25zdCB0aW1lOjpuYW5vc2Vjb25kcyYgdGljaywgY29uc3QgdGltZTo6bmFub3NlY29uZHMmIHRvdGFsKQorICB7CisgICAgQk9PU1RfQVNTRVJUKHRpY2sgPiB0aW1lOjpuYW5vc2Vjb25kczo6emVybygpKTsKKyAgICBCT09TVF9BU1NFUlQodG90YWwgPj0gdGltZTo6bmFub3NlY29uZHM6Onplcm8oKSk7CisKKyAgICB0aW1lOjpuYW5vc2Vjb25kcyByZW1haW5pbmcgPSB0b3RhbDsKKyAgICB3aGlsZSAocmVtYWluaW5nID4gdGltZTo6bmFub3NlY29uZHM6Onplcm8oKSkgeworICAgICAgaWYgKHJlbWFpbmluZyA+PSB0aWNrKSB7CisgICAgICAgIHN0ZWFkeUNsb2NrLT5hZHZhbmNlKHRpY2spOworICAgICAgICBzeXN0ZW1DbG9jay0+YWR2YW5jZSh0aWNrKTsKKyAgICAgICAgcmVtYWluaW5nIC09IHRpY2s7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgc3RlYWR5Q2xvY2stPmFkdmFuY2UocmVtYWluaW5nKTsKKyAgICAgICAgc3lzdGVtQ2xvY2stPmFkdmFuY2UocmVtYWluaW5nKTsKKyAgICAgICAgcmVtYWluaW5nID0gdGltZTo6bmFub3NlY29uZHM6Onplcm8oKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdfaW8uc3RvcHBlZCgpKQorICAgICAgICBnX2lvLnJlc2V0KCk7CisgICAgICBnX2lvLnBvbGwoKTsKKyAgICB9CisgIH0KKworICBmcmllbmQgY2xhc3MgTGltaXRlZElvOworCitwcm90ZWN0ZWQ6CisgIHNoYXJlZF9wdHI8dGltZTo6VW5pdFRlc3RTdGVhZHlDbG9jaz4gc3RlYWR5Q2xvY2s7CisgIHNoYXJlZF9wdHI8dGltZTo6VW5pdFRlc3RTeXN0ZW1DbG9jaz4gc3lzdGVtQ2xvY2s7Cit9OworCitpbmxpbmUgc2hhcmVkX3B0cjxJbnRlcmVzdD4KK21ha2VJbnRlcmVzdChjb25zdCBOYW1lJiBuYW1lKQoreworICByZXR1cm4gbWFrZV9zaGFyZWQ8SW50ZXJlc3Q+KG5hbWUpOworfQorCitpbmxpbmUgc2hhcmVkX3B0cjxEYXRhPgorc2lnbkRhdGEoY29uc3Qgc2hhcmVkX3B0cjxEYXRhPiYgZGF0YSkKK3sKKyAgbmRuOjpTaWduYXR1cmVTaGEyNTZXaXRoUnNhIGZha2VTaWduYXR1cmU7CisgIGZha2VTaWduYXR1cmUuc2V0VmFsdWUobmRuOjpkYXRhQmxvY2sodGx2OjpTaWduYXR1cmVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4obnVsbHB0ciksIDApKTsKKyAgZGF0YS0+c2V0U2lnbmF0dXJlKGZha2VTaWduYXR1cmUpOworICBkYXRhLT53aXJlRW5jb2RlKCk7CisKKyAgcmV0dXJuIGRhdGE7Cit9CisKK2lubGluZSBzaGFyZWRfcHRyPERhdGE+CittYWtlRGF0YShjb25zdCBOYW1lJiBuYW1lKQoreworICBzaGFyZWRfcHRyPERhdGE+IGRhdGEgPSBtYWtlX3NoYXJlZDxEYXRhPihuYW1lKTsKKworICByZXR1cm4gc2lnbkRhdGEoZGF0YSk7Cit9CisKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5mZAorCisjZW5kaWYgLy8gTkZEX1RFU1RTX1RFU1RfQ09NTU9OX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3Rlc3RzL3dzY3JpcHQgYi9ORkQvdGVzdHMvd3NjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmNjNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rlc3RzL3dzY3JpcHQKQEAgLTAsMCArMSw5MyBAQAorIyAtKi0gTW9kZTogcHl0aG9uOyBweS1pbmRlbnQtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGNvZGluZzogdXRmLTg7IC0qLQorCisiIiIKK0NvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKworTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCitvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOword2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK05GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIiIiCisKK3RvcCA9ICcuLicKKworZGVmIGJ1aWxkKGJsZCk6CisgICAgIyBVbml0IHRlc3RzCisgICAgaWYgYmxkLmVudlsnV0lUSF9URVNUUyddOgorICAgICAgICAjIG1haW4oKQorICAgICAgICB1bml0X3Rlc3RfbWFpbiA9IGJsZCgKKyAgICAgICAgICAgIHRhcmdldD0ndW5pdC10ZXN0cy1tYWluJywKKyAgICAgICAgICAgIG5hbWU9J3VuaXQtdGVzdHMtbWFpbicsCisgICAgICAgICAgICBmZWF0dXJlcz0nY3h4JywKKyAgICAgICAgICAgIHVzZT0nY29yZS1vYmplY3RzJywKKyAgICAgICAgICAgIHNvdXJjZT0nbWFpbi5jcHAnLAorICAgICAgICAgICkKKworICAgICAgICAjIGNvbW1vbiB0ZXN0IG1vZHVsZXMKKyAgICAgICAgdW5pdF90ZXN0X2Jhc2UgPSBibGQoCisgICAgICAgICAgICB0YXJnZXQ9J3VuaXQtdGVzdHMtYmFzZScsCisgICAgICAgICAgICBuYW1lPSd1bml0LXRlc3RzLWJhc2UnLAorICAgICAgICAgICAgZmVhdHVyZXM9J2N4eCBwY2gnLAorICAgICAgICAgICAgc291cmNlPWJsZC5wYXRoLmFudF9nbG9iKFsnKi5jcHAnXSwgZXhjbD0nbWFpbi5jcHAnKSwKKyAgICAgICAgICAgIHVzZT0nY29yZS1vYmplY3RzJywKKyAgICAgICAgICAgIGhlYWRlcnM9Jy4uL2NvbW1vbi5ocHAgYm9vc3QtdGVzdC5ocHAnLAorICAgICAgICAgICkKKworICAgICAgICAjIGNvcmUgdGVzdHMKKyAgICAgICAgdW5pdF90ZXN0c19jb3JlID0gYmxkLnByb2dyYW0oCisgICAgICAgICAgICB0YXJnZXQ9Jy4uL3VuaXQtdGVzdHMtY29yZScsCisgICAgICAgICAgICBmZWF0dXJlcz0nY3h4IGN4eHByb2dyYW0nLAorICAgICAgICAgICAgc291cmNlPWJsZC5wYXRoLmFudF9nbG9iKFsnY29yZS8qKi8qLmNwcCddKSwKKyAgICAgICAgICAgIHVzZT0nY29yZS1vYmplY3RzIHVuaXQtdGVzdHMtYmFzZSB1bml0LXRlc3RzLW1haW4nLAorICAgICAgICAgICAgaW5jbHVkZXM9Jy4nLAorICAgICAgICAgICAgaW5zdGFsbF9wYXRoPU5vbmUsCisgICAgICAgICAgKQorCisgICAgICAgICMgTkZEIHRlc3RzCisgICAgICAgIHVuaXRfdGVzdHNfbmZkID0gYmxkLnByb2dyYW0oCisgICAgICAgICAgICB0YXJnZXQ9Jy4uL3VuaXQtdGVzdHMtZGFlbW9uJywKKyAgICAgICAgICAgIGZlYXR1cmVzPSdjeHggY3h4cHJvZ3JhbScsCisgICAgICAgICAgICBzb3VyY2U9YmxkLnBhdGguYW50X2dsb2IoWydkYWVtb24vKiovKi5jcHAnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsPVsnZGFlbW9uL2ZhY2UvZXRoZXJuZXQuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGFlbW9uL2ZhY2UvdW5peC0qLmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhZW1vbi9mYWNlL3dlYnNvY2tldCouY3BwJ10pLAorICAgICAgICAgICAgdXNlPSdkYWVtb24tb2JqZWN0cyB1bml0LXRlc3RzLWJhc2UgdW5pdC10ZXN0cy1tYWluJywKKyAgICAgICAgICAgIGluY2x1ZGVzPScuJywKKyAgICAgICAgICAgIGluc3RhbGxfcGF0aD1Ob25lLAorICAgICAgICAgICkKKworICAgICAgICBpZiBibGQuZW52WydIQVZFX0xJQlBDQVAnXToKKyAgICAgICAgICAgIHVuaXRfdGVzdHNfbmZkLnNvdXJjZSArPSBibGQucGF0aC5hbnRfZ2xvYignZGFlbW9uL2ZhY2UvZXRoZXJuZXQuY3BwJykKKworICAgICAgICBpZiBibGQuZW52WydIQVZFX1VOSVhfU09DS0VUUyddOgorICAgICAgICAgICAgdW5pdF90ZXN0c19uZmQuc291cmNlICs9IGJsZC5wYXRoLmFudF9nbG9iKCdkYWVtb24vZmFjZS91bml4LSouY3BwJykKKworICAgICAgICBpZiBibGQuZW52WydIQVZFX1dFQlNPQ0tFVCddOgorICAgICAgICAgICAgdW5pdF90ZXN0c19uZmQuc291cmNlICs9IGJsZC5wYXRoLmFudF9nbG9iKCdkYWVtb24vZmFjZS93ZWJzb2NrZXQqLmNwcCcpCisKKyAgICAgICAgdW5pdF90ZXN0c19yaWIgPSBibGQucHJvZ3JhbSgKKyAgICAgICAgICAgIHRhcmdldD0nLi4vdW5pdC10ZXN0cy1yaWInLAorICAgICAgICAgICAgZmVhdHVyZXM9J2N4eCBjeHhwcm9ncmFtJywKKyAgICAgICAgICAgIHNvdXJjZT1ibGQucGF0aC5hbnRfZ2xvYihbJ3JpYi8qKi8qLmNwcCddKSwKKyAgICAgICAgICAgIHVzZT0ncmliLW9iamVjdHMgdW5pdC10ZXN0cy1iYXNlIHVuaXQtdGVzdHMtbWFpbicsCisgICAgICAgICAgICBpbmNsdWRlcz0nLicsCisgICAgICAgICAgICBpbnN0YWxsX3BhdGg9Tm9uZSwKKyAgICAgICAgICApCisKKyAgICAjIE90aGVyIHRlc3RzIChlLmcuLCBzdHJlc3MgdGVzdHMgdGhhdCBjYW4gYmUgZW5hYmxlZCBldmVuIGlmIHVuaXQgdGVzdHMgYXJlIGRpc2FibGVkKQorICAgIGlmIGJsZC5lbnZbJ1dJVEhfVEVTVFMnXSBvciBibGQuZW52WydXSVRIX09USEVSX1RFU1RTJ106CisgICAgICAgIGJsZC5yZWN1cnNlKCJvdGhlciIpCmRpZmYgLS1naXQgYS9ORkQvdG9vbHMvbmRuLWF1dG9jb25maWctc2VydmVyLmNwcCBiL05GRC90b29scy9uZG4tYXV0b2NvbmZpZy1zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDEwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmRuLWF1dG9jb25maWctc2VydmVyLmNwcApAQCAtMCwwICsxLDIyMSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0ICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgInZlcnNpb24uaHBwIgorI2luY2x1ZGUgPG5kbi1jeHgvZmFjZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9rZXktY2hhaW4uaHBwPgorCituYW1lc3BhY2UgbmRuIHsKKworY29uc3Qgc3RhdGljIE5hbWUgQVVUT0NPTkZJR19QUkVGSVggICAgICAgICAgPSAiL2xvY2FsaG9wL25kbi1hdXRvY29uZiI7Citjb25zdCBzdGF0aWMgTmFtZSBMT0NBTEhPUF9IVUIgICAgICAgICAgICAgICA9ICIvbG9jYWxob3AvbmRuLWF1dG9jb25mL2h1YiI7Citjb25zdCBzdGF0aWMgTmFtZSBMT0NBTEhPUF9ST1VUQUJMRV9QUkVGSVhFUyA9ICIvbG9jYWxob3AvbmRuLWF1dG9jb25mL3JvdXRhYmxlLXByZWZpeGVzIjsKKworc3RhdGljIHZvaWQKK3VzYWdlKGNvbnN0IGNoYXIqIHByb2dyYW1OYW1lKQoreworICBzdGQ6OmNvdXQgPDwgIlVzYWdlOlxuIiA8PCBwcm9ncmFtTmFtZSAgPDwgIiBbLWhdIFstVl0gWy1wIHByZWZpeF0gWy1wIHByZWZpeF0gLi4uIFVyaSBcbiIKKyAgICAgICAgICAgIDw8ICIgICAtaCAgICAgICAgLSBwcmludCB1c2FnZSBhbmQgZXhpdFxuIgorICAgICAgICAgICAgPDwgIiAgIC1WICAgICAgICAtIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iCisgICAgICAgICAgICA8PCAiICAgLXAgcHJlZml4IC0gdGhlIGxvY2FsIHByZWZpeCBvZiB0aGUgaHViXG4iCisgICAgICAgICAgICA8PCAiXG4iCisgICAgICAgICAgICA8PCAiICAgVXJpIC0gYSBGYWNlTWdtdCBVUklcbiIKKyAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKK30KKworY2xhc3MgUHJlZml4Q29sbGVjdGlvbiA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIGJvb2wKKyAgZW1wdHkoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fcHJlZml4ZXMuZW1wdHkoKTsKKyAgfQorCisgIHZvaWQKKyAgYWRkKGNvbnN0IE5hbWUmIHByZWZpeCkKKyAgeworICAgIG1fcHJlZml4ZXMucHVzaF9iYWNrKHByZWZpeCk7CisgIH0KKworICB0ZW1wbGF0ZTxib29sIFQ+CisgIHNpemVfdAorICB3aXJlRW5jb2RlKEVuY29kaW5nSW1wbDxUPiYgZW5jb2RlcikgY29uc3QKKyAgeworICAgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPE5hbWU+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGkgPSBtX3ByZWZpeGVzLnJiZWdpbigpOworICAgICAgICAgaSAhPSBtX3ByZWZpeGVzLnJlbmQoKTsgKytpKSB7CisgICAgICB0b3RhbExlbmd0aCArPSBpLT53aXJlRW5jb2RlKGVuY29kZXIpOworICAgIH0KKworICAgIHRvdGFsTGVuZ3RoICs9IGVuY29kZXIucHJlcGVuZFZhck51bWJlcih0b3RhbExlbmd0aCk7CisgICAgdG90YWxMZW5ndGggKz0gZW5jb2Rlci5wcmVwZW5kVmFyTnVtYmVyKHRsdjo6Q29udGVudCk7CisgICAgcmV0dXJuIHRvdGFsTGVuZ3RoOworICB9CisKKyAgQmxvY2sKKyAgd2lyZUVuY29kZSgpIGNvbnN0CisgIHsKKyAgICBCbG9jayBibG9jazsKKworICAgIEVuY29kaW5nRXN0aW1hdG9yIGVzdGltYXRvcjsKKyAgICBzaXplX3QgZXN0aW1hdGVkU2l6ZSA9IHdpcmVFbmNvZGUoZXN0aW1hdG9yKTsKKworICAgIEVuY29kaW5nQnVmZmVyIGJ1ZmZlcihlc3RpbWF0ZWRTaXplKTsKKyAgICB3aXJlRW5jb2RlKGJ1ZmZlcik7CisKKyAgICByZXR1cm4gYnVmZmVyLmJsb2NrKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8TmFtZT4gbV9wcmVmaXhlczsKK307CisKK2NsYXNzIE5kbkF1dG9jb25maWdTZXJ2ZXIgOiBub25jb3B5YWJsZQoreworcHVibGljOgorICBOZG5BdXRvY29uZmlnU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBodWJGYWNlVXJpLCBjb25zdCBQcmVmaXhDb2xsZWN0aW9uJiByb3V0YWJsZVByZWZpeGVzKQorICB7CisgICAgS2V5Q2hhaW4gbV9rZXlDaGFpbjsKKworICAgIC8vIHByZS1jcmVhdGUgaHViIERhdGEKKyAgICBtX2h1YkRhdGEgPSBtYWtlX3NoYXJlZDxEYXRhPihOYW1lKExPQ0FMSE9QX0hVQikuYXBwZW5kVmVyc2lvbigpKTsKKyAgICBtX2h1YkRhdGEtPnNldEZyZXNobmVzc1BlcmlvZCh0aW1lOjpob3VycygxKSk7IC8vIDEgaG91cgorICAgIG1faHViRGF0YS0+c2V0Q29udGVudChkYXRhQmxvY2sodGx2OjpuZmQ6OlVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGh1YkZhY2VVcmkuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWJGYWNlVXJpLnNpemUoKSkpOworICAgIG1fa2V5Q2hhaW4uc2lnbigqbV9odWJEYXRhKTsKKworICAgIC8vIHByZS1jcmVhdGUgcm91dGFibGUgcHJlZml4IERhdGEKKyAgICBpZiAoIXJvdXRhYmxlUHJlZml4ZXMuZW1wdHkoKSkgeworICAgICAgbV9yb3V0YWJsZVByZWZpeGVzRGF0YSA9IG1ha2Vfc2hhcmVkPERhdGE+KE5hbWUoTE9DQUxIT1BfUk9VVEFCTEVfUFJFRklYRVMpLmFwcGVuZFZlcnNpb24oKSk7CisgICAgICBtX3JvdXRhYmxlUHJlZml4ZXNEYXRhLT5zZXRDb250ZW50KHJvdXRhYmxlUHJlZml4ZXMud2lyZUVuY29kZSgpKTsKKyAgICAgIG1fcm91dGFibGVQcmVmaXhlc0RhdGEtPnNldEZyZXNobmVzc1BlcmlvZCh0aW1lOjpzZWNvbmRzKDUpKTsgLy8gNXMKKyAgICAgIG1fa2V5Q2hhaW4uc2lnbigqbV9yb3V0YWJsZVByZWZpeGVzRGF0YSk7CisgICAgfQorICB9CisKKyAgdm9pZAorICBvbkh1YkludGVyZXN0KGNvbnN0IE5hbWUmIG5hbWUsIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKKyAgeworICAgIG1fZmFjZS5wdXQoKm1faHViRGF0YSk7CisgIH0KKworICB2b2lkCisgIG9uUm91dGFibGVQcmVmaXhlc0ludGVyZXN0KGNvbnN0IE5hbWUmIG5hbWUsIGNvbnN0IEludGVyZXN0JiBpbnRlcmVzdCkKKyAgeworICAgIG1fZmFjZS5wdXQoKm1fcm91dGFibGVQcmVmaXhlc0RhdGEpOworICB9CisKKyAgdm9pZAorICBvblJlZ2lzdGVyRmFpbGVkKGNvbnN0IE5hbWUmIHByZWZpeCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbikKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IEZhaWxlZCB0byByZWdpc3RlciBwcmVmaXggaW4gbG9jYWwgaHViJ3MgZGFlbW9uICgiIDw8CisgICAgICAgICAgICAgIHJlYXNvbiA8PCAiKSIgPDwgc3RkOjplbmRsOworICAgIG1fZmFjZS5zaHV0ZG93bigpOworICB9CisKKyAgdm9pZAorICBhZnRlclByZWZpeFJlZ2lzdGVyZWQoKQorICB7CisgICAgQk9PU1RfQVNTRVJUKEFVVE9DT05GSUdfUFJFRklYLmlzUHJlZml4T2YoTE9DQUxIT1BfSFVCKSk7CisgICAgbV9mYWNlLnNldEludGVyZXN0RmlsdGVyKExPQ0FMSE9QX0hVQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmRuQXV0b2NvbmZpZ1NlcnZlcjo6b25IdWJJbnRlcmVzdCwgdGhpcywgXzEsIF8yKSk7CisKKyAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4obV9yb3V0YWJsZVByZWZpeGVzRGF0YSkpIHsKKyAgICAgIEJPT1NUX0FTU0VSVChBVVRPQ09ORklHX1BSRUZJWC5pc1ByZWZpeE9mKExPQ0FMSE9QX1JPVVRBQkxFX1BSRUZJWEVTKSk7CisgICAgICBtX2ZhY2Uuc2V0SW50ZXJlc3RGaWx0ZXIoTE9DQUxIT1BfUk9VVEFCTEVfUFJFRklYRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmRuQXV0b2NvbmZpZ1NlcnZlcjo6b25Sb3V0YWJsZVByZWZpeGVzSW50ZXJlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfMSwgXzIpKTsKKyAgICB9CisgIH0KKworICB2b2lkCisgIHJ1bigpCisgIHsKKyAgICBtX2ZhY2UucmVnaXN0ZXJQcmVmaXgoQVVUT0NPTkZJR19QUkVGSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5kbkF1dG9jb25maWdTZXJ2ZXI6OmFmdGVyUHJlZml4UmVnaXN0ZXJlZCwgdGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5kbkF1dG9jb25maWdTZXJ2ZXI6Om9uUmVnaXN0ZXJGYWlsZWQsIHRoaXMsIF8xLCBfMikpOworCisgICAgbV9mYWNlLnByb2Nlc3NFdmVudHMoKTsKKyAgfQorCitwcml2YXRlOgorICBGYWNlIG1fZmFjZTsKKworICBzaGFyZWRfcHRyPERhdGE+IG1faHViRGF0YTsKKyAgc2hhcmVkX3B0cjxEYXRhPiBtX3JvdXRhYmxlUHJlZml4ZXNEYXRhOworfTsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgY29uc3QgY2hhciogcHJvZ3JhbU5hbWUgPSBhcmd2WzBdOworCisgIFByZWZpeENvbGxlY3Rpb24gcm91dGFibGVQcmVmaXhlczsKKworICBpbnQgb3B0OworICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaFZwOiIpKSAhPSAtMSkgeworICAgIHN3aXRjaCAob3B0KSB7CisgICAgY2FzZSAnaCc6CisgICAgICB1c2FnZShwcm9ncmFtTmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlICdWJzoKKyAgICAgIHN0ZDo6Y291dCA8PCBORkRfVkVSU0lPTl9CVUlMRF9TVFJJTkcgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAncCc6CisgICAgICByb3V0YWJsZVByZWZpeGVzLmFkZChOYW1lKG9wdGFyZykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHVzYWdlKHByb2dyYW1OYW1lKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmIChhcmdjICE9IG9wdGluZCArIDEpIHsKKyAgICB1c2FnZShwcm9ncmFtTmFtZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdGQ6OnN0cmluZyBodWJGYWNlVXJpID0gYXJndltvcHRpbmRdOworICBOZG5BdXRvY29uZmlnU2VydmVyIGluc3RhbmNlKGh1YkZhY2VVcmksIHJvdXRhYmxlUHJlZml4ZXMpOworCisgIHRyeSB7CisgICAgaW5zdGFuY2UucnVuKCk7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlcnJvcikgeworICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6ICIgPDwgZXJyb3Iud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgbmRuCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIHJldHVybiBuZG46Om1haW4oYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9ORkQvdG9vbHMvbmRuLWF1dG9jb25maWcuY3BwIGIvTkZEL3Rvb2xzL25kbi1hdXRvY29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ4YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rvb2xzL25kbi1hdXRvY29uZmlnLmNwcApAQCAtMCwwICsxLDUzMCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgInZlcnNpb24uaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9mYWNlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sbGVyLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZhY2Utc3RhdHVzLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9lbmNvZGluZy9idWZmZXItc3RyZWFtLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvZmFjZS11cmkuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CisKKyNpZmRlZiBfX0FQUExFX18KKyNpbmNsdWRlIDxhcnBhL25hbWVzZXJfY29tcGF0Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgdG9vbHMgeworCitzdGF0aWMgY29uc3QgTmFtZSBMT0NBTEhPUF9IVUJfRElTQ09WRVJZX1BSRUZJWCA9ICIvbG9jYWxob3AvbmRuLWF1dG9jb25mL2h1YiI7CisKK3ZvaWQKK3VzYWdlKGNvbnN0IGNoYXIqIHByb2dyYW1OYW1lKQoreworICBzdGQ6OmNvdXQgPDwgIlVzYWdlOlxuIiA8PCBwcm9ncmFtTmFtZSAgPDwgIiBbLWhdIFstVl1cbiIKKyAgICAgICAgICAgIDw8ICIgICAtaCAgLSBwcmludCB1c2FnZSBhbmQgZXhpdFxuIgorICAgICAgICAgICAgPDwgIiAgIC1WICAtIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iCisgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Cit9CisKK2NsYXNzIE5kbkF1dG9jb25maWcgOiBib29zdDo6bm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgdW5pb24gUXVlcnlBbnN3ZXIKKyAgeworICAgIEhFQURFUiBoZWFkZXI7CisgICAgdWludDhfdCBidWZbTlNfUEFDS0VUU1pdOworICB9OworCisgIGNsYXNzIEVycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0KQorICAgICAgOiBzdGQ6OnJ1bnRpbWVfZXJyb3Iod2hhdCkKKyAgICB7CisgICAgfQorICB9OworCisgIGV4cGxpY2l0CisgIE5kbkF1dG9jb25maWcoKQorICAgIDogbV9jb250cm9sbGVyKG1fZmFjZSwgbV9rZXlDaGFpbikKKyAgeworICB9CisKKyAgdm9pZAorICBydW4oKQorICB7CisgICAgbV9mYWNlLnByb2Nlc3NFdmVudHMoKTsKKyAgfQorCisgIHZvaWQKKyAgZmV0Y2hTZWdtZW50cyhjb25zdCBEYXRhJiBkYXRhLCBjb25zdCBzaGFyZWRfcHRyPE9CdWZmZXJTdHJlYW0+JiBidWZmZXIsCisgICAgICAgICAgICAgICAgdm9pZCAoTmRuQXV0b2NvbmZpZzo6Km9uRG9uZSkoY29uc3Qgc2hhcmVkX3B0cjxPQnVmZmVyU3RyZWFtPiYpKQorICB7CisgICAgYnVmZmVyLT53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhLmdldENvbnRlbnQoKS52YWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0Q29udGVudCgpLnZhbHVlX3NpemUoKSk7CisKKyAgICB1aW50NjRfdCBjdXJyZW50U2VnbWVudCA9IGRhdGEuZ2V0TmFtZSgpLmdldCgtMSkudG9TZWdtZW50KCk7CisKKyAgICBjb25zdCBuYW1lOjpDb21wb25lbnQmIGZpbmFsQmxvY2tJZCA9IGRhdGEuZ2V0TWV0YUluZm8oKS5nZXRGaW5hbEJsb2NrSWQoKTsKKyAgICBpZiAoZmluYWxCbG9ja0lkLmVtcHR5KCkgfHwKKyAgICAgICAgZmluYWxCbG9ja0lkLnRvU2VnbWVudCgpID4gY3VycmVudFNlZ21lbnQpCisgICAgICB7CisgICAgICAgIG1fZmFjZS5leHByZXNzSW50ZXJlc3QoZGF0YS5nZXROYW1lKCkuZ2V0UHJlZml4KC0xKS5hcHBlbmRTZWdtZW50KGN1cnJlbnRTZWdtZW50KzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6YmluZCgmTmRuQXV0b2NvbmZpZzo6ZmV0Y2hTZWdtZW50cywgdGhpcywgXzIsIGJ1ZmZlciwgb25Eb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OmJpbmQoJk5kbkF1dG9jb25maWc6OmRpc2NvdmVySHViU3RhZ2UyLCB0aGlzLCAiVGltZW91dCIpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiAodGhpcy0+Km9uRG9uZSkoYnVmZmVyKTsKKyAgICAgIH0KKyAgfQorCisgIHZvaWQKKyAgZGlzY292ZXJIdWJTdGFnZTEoKQorICB7CisgICAgc2hhcmVkX3B0cjxPQnVmZmVyU3RyZWFtPiBidWZmZXIgPSBtYWtlX3NoYXJlZDxPQnVmZmVyU3RyZWFtPigpOworCisgICAgSW50ZXJlc3QgaW50ZXJlc3QoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL2xpc3QiKTsKKyAgICBpbnRlcmVzdC5zZXRDaGlsZFNlbGVjdG9yKDEpOworICAgIGludGVyZXN0LnNldE11c3RCZUZyZXNoKHRydWUpOworCisgICAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6YmluZCgmTmRuQXV0b2NvbmZpZzo6ZmV0Y2hTZWdtZW50cywgdGhpcywgXzIsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmRuQXV0b2NvbmZpZzo6ZGlzY292ZXJIdWJTdGFnZTFfcmVnaXN0ZXJIdWJEaXNjb3ZlcnlQcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpiaW5kKCZOZG5BdXRvY29uZmlnOjpkaXNjb3Zlckh1YlN0YWdlMiwgdGhpcywgIlRpbWVvdXQiKSk7CisgIH0KKworICB2b2lkCisgIGRpc2NvdmVySHViU3RhZ2UxX3JlZ2lzdGVySHViRGlzY292ZXJ5UHJlZml4KGNvbnN0IHNoYXJlZF9wdHI8T0J1ZmZlclN0cmVhbT4mIGJ1ZmZlcikKKyAgeworICAgIENvbnN0QnVmZmVyUHRyIGJ1ZiA9IGJ1ZmZlci0+YnVmKCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IG11bHRpY2FzdEZhY2VzOworCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgICAgeworICAgICAgICBCbG9jayBibG9jazsKKyAgICAgICAgYm9vbCBvayA9IEJsb2NrOjpmcm9tQnVmZmVyKGJ1Ziwgb2Zmc2V0LCBibG9jayk7CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogY2Fubm90IGRlY29kZSBGYWNlU3RhdHVzIFRMViIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSBibG9jay5zaXplKCk7CisKKyAgICAgICAgbmZkOjpGYWNlU3RhdHVzIGZhY2VTdGF0dXMoYmxvY2spOworCisgICAgICAgIG5kbjo6dXRpbDo6RmFjZVVyaSB1cmkoZmFjZVN0YXR1cy5nZXRSZW1vdGVVcmkoKSk7CisgICAgICAgIGlmICh1cmkuZ2V0U2NoZW1lKCkgPT0gInVkcDQiKSB7CisgICAgICAgICAgbmFtZXNwYWNlIGlwID0gYm9vc3Q6OmFzaW86OmlwOworICAgICAgICAgIGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZWM7CisgICAgICAgICAgaXA6OmFkZHJlc3MgYWRkcmVzcyA9IGlwOjphZGRyZXNzOjpmcm9tX3N0cmluZyh1cmkuZ2V0SG9zdCgpLCBlYyk7CisKKyAgICAgICAgICBpZiAoIWVjICYmIGFkZHJlc3MuaXNfbXVsdGljYXN0KCkpIHsKKyAgICAgICAgICAgIG11bHRpY2FzdEZhY2VzLnB1c2hfYmFjayhmYWNlU3RhdHVzLmdldEZhY2VJZCgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIGlmIChtdWx0aWNhc3RGYWNlcy5lbXB0eSgpKSB7CisgICAgICBkaXNjb3Zlckh1YlN0YWdlMigiTm8gbXVsdGljYXN0IGZhY2VzIGF2YWlsYWJsZSwgc2tpcHBpbmcgc3RhZ2UgMSIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNoYXJlZF9wdHI8bmZkOjpDb250cm9sbGVyPiBjb250cm9sbGVyID0gbWFrZV9zaGFyZWQ8bmZkOjpDb250cm9sbGVyPihyZWYobV9mYWNlKSk7CisgICAgICBzaGFyZWRfcHRyPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gPiBuUmVnaXN0cmF0aW9ucyA9CisgICAgICAgIG1ha2Vfc2hhcmVkPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gPigwLCAwKTsKKworICAgICAgbmZkOjpDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgICAgcGFyYW1ldGVycworICAgICAgICAuc2V0TmFtZShMT0NBTEhPUF9IVUJfRElTQ09WRVJZX1BSRUZJWCkKKyAgICAgICAgLnNldENvc3QoMSkKKyAgICAgICAgLnNldEV4cGlyYXRpb25QZXJpb2QodGltZTo6c2Vjb25kcygzMCkpOworCisgICAgICBuUmVnaXN0cmF0aW9ucy0+Zmlyc3QgPSBtdWx0aWNhc3RGYWNlcy5zaXplKCk7CisKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8dWludDY0X3Q+OjppdGVyYXRvciBpID0gbXVsdGljYXN0RmFjZXMuYmVnaW4oKTsKKyAgICAgICAgICAgaSAhPSBtdWx0aWNhc3RGYWNlcy5lbmQoKTsgKytpKSB7CisgICAgICAgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKCppKTsKKworICAgICAgICBjb250cm9sbGVyLT5zdGFydDxuZmQ6OlJpYlJlZ2lzdGVyQ29tbWFuZD4ocGFyYW1ldGVycywKKyAgICAgICAgICBiaW5kKCZOZG5BdXRvY29uZmlnOjpkaXNjb3Zlckh1YlN0YWdlMV9vblJlZ2lzdGVyU3VjY2VzcywKKyAgICAgICAgICAgICAgIHRoaXMsIGNvbnRyb2xsZXIsIG5SZWdpc3RyYXRpb25zKSwKKyAgICAgICAgICBiaW5kKCZOZG5BdXRvY29uZmlnOjpkaXNjb3Zlckh1YlN0YWdlMV9vblJlZ2lzdGVyRmFpbHVyZSwKKyAgICAgICAgICAgICAgIHRoaXMsIF8xLCBfMiwgY29udHJvbGxlciwgblJlZ2lzdHJhdGlvbnMpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkCisgIGRpc2NvdmVySHViU3RhZ2UxX29uUmVnaXN0ZXJTdWNjZXNzKGNvbnN0IHNoYXJlZF9wdHI8bmZkOjpDb250cm9sbGVyPiYgY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+ID4mIG5SZWdpc3RyYXRpb25zKQorICB7CisgICAgblJlZ2lzdHJhdGlvbnMtPnNlY29uZCsrOworCisgICAgaWYgKG5SZWdpc3RyYXRpb25zLT5maXJzdCA9PSBuUmVnaXN0cmF0aW9ucy0+c2Vjb25kKSB7CisgICAgICBkaXNjb3Zlckh1YlN0YWdlMV9zZXRTdHJhdGVneShjb250cm9sbGVyKTsKKyAgICB9CisgIH0KKworICB2b2lkCisgIGRpc2NvdmVySHViU3RhZ2UxX29uUmVnaXN0ZXJGYWlsdXJlKHVpbnQzMl90IGNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxuZmQ6OkNvbnRyb2xsZXI+JiBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gPiYgblJlZ2lzdHJhdGlvbnMpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiAiIDw8IGVycm9yIDw8ICIgKGNvZGU6ICIgPDwgY29kZSA8PCAiKSIgPDwgc3RkOjplbmRsOworICAgIG5SZWdpc3RyYXRpb25zLT5maXJzdC0tOworCisgICAgaWYgKG5SZWdpc3RyYXRpb25zLT5maXJzdCA9PSBuUmVnaXN0cmF0aW9ucy0+c2Vjb25kKSB7CisgICAgICBpZiAoblJlZ2lzdHJhdGlvbnMtPmZpcnN0ID4gMCkgeworICAgICAgICBkaXNjb3Zlckh1YlN0YWdlMV9zZXRTdHJhdGVneShjb250cm9sbGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpc2NvdmVySHViU3RhZ2UyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgIiArIExPQ0FMSE9QX0hVQl9ESVNDT1ZFUllfUFJFRklYLnRvVXJpKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBhbGwgbXVsdGljYXN0IGZhY2VzIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZAorICBkaXNjb3Zlckh1YlN0YWdlMV9zZXRTdHJhdGVneShjb25zdCBzaGFyZWRfcHRyPG5mZDo6Q29udHJvbGxlcj4mIGNvbnRyb2xsZXIpCisgIHsKKyAgICBuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgICAgcGFyYW1ldGVycworICAgICAgLnNldE5hbWUoTE9DQUxIT1BfSFVCX0RJU0NPVkVSWV9QUkVGSVgpCisgICAgICAuc2V0U3RyYXRlZ3koIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5L2Jyb2FkY2FzdCIpOworCisgICAgY29udHJvbGxlci0+c3RhcnQ8bmZkOjpTdHJhdGVneUNob2ljZVNldENvbW1hbmQ+KHBhcmFtZXRlcnMsCisgICAgICBiaW5kKCZOZG5BdXRvY29uZmlnOjpkaXNjb3Zlckh1YlN0YWdlMV9vblNldFN0cmF0ZWd5U3VjY2VzcywKKyAgICAgICAgICAgdGhpcywgY29udHJvbGxlciksCisgICAgICBiaW5kKCZOZG5BdXRvY29uZmlnOjpkaXNjb3Zlckh1YlN0YWdlMV9vblNldFN0cmF0ZWd5RmFpbHVyZSwKKyAgICAgICAgICAgdGhpcywgXzIsIGNvbnRyb2xsZXIpKTsKKyAgfQorCisgIHZvaWQKKyAgZGlzY292ZXJIdWJTdGFnZTFfb25TZXRTdHJhdGVneVN1Y2Nlc3MoY29uc3Qgc2hhcmVkX3B0cjxuZmQ6OkNvbnRyb2xsZXI+JiBjb250cm9sbGVyKQorICB7CisgICAgZGlzY292ZXJIdWJTdGFnZTFfcmVxdWVzdEh1YkRhdGEoKTsKKyAgfQorCisgIHZvaWQKKyAgZGlzY292ZXJIdWJTdGFnZTFfb25TZXRTdHJhdGVneUZhaWx1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPG5mZDo6Q29udHJvbGxlcj4mIGNvbnRyb2xsZXIpCisgIHsKKyAgICBkaXNjb3Zlckh1YlN0YWdlMigiRmFpbGVkIHRvIHNldCBicm9hZGNhc3Qgc3RyYXRlZ3kgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgIExPQ0FMSE9QX0hVQl9ESVNDT1ZFUllfUFJFRklYLnRvVXJpKCkgKyAiIG5hbWVzcGFjZSAoIiArIGVycm9yICsgIikiKTsKKyAgfQorCisgIC8vIFN0YXJ0IHRvIGxvb2sgZm9yIGEgaHViIChORE4gaHViIGRpc2NvdmVyeSBmaXJzdCBzdGFnZSkKKyAgdm9pZAorICBkaXNjb3Zlckh1YlN0YWdlMV9yZXF1ZXN0SHViRGF0YSgpCisgIHsKKyAgICBJbnRlcmVzdCBpbnRlcmVzdChMT0NBTEhPUF9IVUJfRElTQ09WRVJZX1BSRUZJWCk7CisgICAgaW50ZXJlc3Quc2V0SW50ZXJlc3RMaWZldGltZSh0aW1lOjptaWxsaXNlY29uZHMoNDAwMCkpOyAvLyA0IHNlY29uZHMKKyAgICBpbnRlcmVzdC5zZXRNdXN0QmVGcmVzaCh0cnVlKTsKKworICAgIHN0ZDo6Y2VyciA8PCAiU3RhZ2UgMTogVHJ5aW5nIG11bHRpY2FzdCBkaXNjb3ZlcnkuLi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBtX2ZhY2UuZXhwcmVzc0ludGVyZXN0KGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmRuQXV0b2NvbmZpZzo6b25EaXNjb3Zlckh1YlN0YWdlMVN1Y2Nlc3MsIHRoaXMsIF8xLCBfMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZG5BdXRvY29uZmlnOjpkaXNjb3Zlckh1YlN0YWdlMiwgdGhpcywgIlRpbWVvdXQiKSk7CisgIH0KKworICAvLyBGaXJzdCBzdGFnZSBPbkRhdGEgQ2FsbGJhY2sKKyAgdm9pZAorICBvbkRpc2NvdmVySHViU3RhZ2UxU3VjY2Vzcyhjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QsIERhdGEmIGRhdGEpCisgIHsKKyAgICBjb25zdCBCbG9jayYgY29udGVudCA9IGRhdGEuZ2V0Q29udGVudCgpOworICAgIGNvbnRlbnQucGFyc2UoKTsKKworICAgIC8vIEdldCBVcmkKKyAgICBCbG9jazo6ZWxlbWVudF9jb25zdF9pdGVyYXRvciBibG9ja1ZhbHVlID0gY29udGVudC5maW5kKHRsdjo6bmZkOjpVcmkpOworICAgIGlmIChibG9ja1ZhbHVlID09IGNvbnRlbnQuZWxlbWVudHNfZW5kKCkpCisgICAgeworICAgICAgZGlzY292ZXJIdWJTdGFnZTIoIkluY29ycmVjdCByZXBseSB0byBzdGFnZTEiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZmFjZU1nbXRVcmkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYmxvY2tWYWx1ZS0+dmFsdWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tWYWx1ZS0+dmFsdWVfc2l6ZSgpKTsKKyAgICBjb25uZWN0VG9IdWIoZmFjZU1nbXRVcmkpOworICB9CisKKyAgLy8gRmlyc3Qgc3RhZ2UgT25UaW1lb3V0IGNhbGxiYWNrIC0gc3RhcnQgMm5kIHN0YWdlCisgIHZvaWQKKyAgZGlzY292ZXJIdWJTdGFnZTIoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICJTdGFnZSAyOiBUcnlpbmcgRE5TIHF1ZXJ5IHdpdGggZGVmYXVsdCBzdWZmaXguLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIF9yZXMucmV0cnkgPSAyOworICAgIF9yZXMubmRvdHMgPSAxMDsKKworICAgIFF1ZXJ5QW5zd2VyIHF1ZXJ5QW5zd2VyOworCisgICAgaW50IGFuc3dlclNpemUgPSByZXNfc2VhcmNoKCJfbmRuLl91ZHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc19jX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc190X3NydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlBbnN3ZXIuYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocXVlcnlBbnN3ZXIpKTsKKworICAgIC8vIDJuZCBzdGFnZSBmYWlsZWQgLSBtb3ZlIG9uIHRvIHRoZSB0aGlyZCBzdGFnZQorICAgIGlmIChhbnN3ZXJTaXplIDwgMCkKKyAgICB7CisgICAgICBkaXNjb3Zlckh1YlN0YWdlMygiRmFpbGVkIHRvIGZpbmQgTkROIHJvdXRlciB1c2luZyBkZWZhdWx0IHN1ZmZpeCBETlMgcXVlcnkiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGJvb2wgaXNQYXJzZWQgPSBwYXJzZUhvc3RBbmRDb25uZWN0VG9IdWIocXVlcnlBbnN3ZXIsIGFuc3dlclNpemUpOworICAgICAgaWYgKGlzUGFyc2VkID09IGZhbHNlKQorICAgICAgeworICAgICAgICAvLyBGYWlsZWQgdG8gcGFyc2UgRE5TIHJlc3BvbnNlLCB0cnkgc3RhZ2UgMworICAgICAgICBkaXNjb3Zlckh1YlN0YWdlMygiRmFpbGVkIHRvIHBhcnNlIEROUyByZXNwb25zZSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNlY29uZCBzdGFnZSBPblRpbWVvdXQgY2FsbGJhY2sKKyAgdm9pZAorICBkaXNjb3Zlckh1YlN0YWdlMyhjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgeworICAgIHN0ZDo6Y2VyciA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIlN0YWdlIDM6IFRyeWluZyB0byBmaW5kIGhvbWUgcm91dGVyLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBLZXlDaGFpbiBrZXlDaGFpbjsKKyAgICBOYW1lIGlkZW50aXR5ID0ga2V5Q2hhaW4uZ2V0RGVmYXVsdElkZW50aXR5KCk7CisgICAgc3RkOjpzdHJpbmcgc2VydmVyTmFtZSA9ICJfbmRuLl91ZHAuIjsKKworICAgIGZvciAoTmFtZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpID0gaWRlbnRpdHkucmJlZ2luKCk7IGkgIT0gaWRlbnRpdHkucmVuZCgpOyBpKyspCisgICAgeworICAgICAgc2VydmVyTmFtZS5hcHBlbmQoaS0+dG9VcmkoKSk7CisgICAgICBzZXJ2ZXJOYW1lLmFwcGVuZCgiLiIpOworICAgIH0KKyAgICBzZXJ2ZXJOYW1lICs9ICJfaG9tZWh1Yi5fYXV0b2NvbmYubmFtZWQtZGF0YS5uZXQiOworICAgIHN0ZDo6Y2VyciA8PCAiU3RhZ2UzOiBBYm91dCB0byBxdWVyeSBmb3IgYSBob21lIHJvdXRlcjogIiA8PCBzZXJ2ZXJOYW1lIDw8IHN0ZDo6ZW5kbDsKKworICAgIFF1ZXJ5QW5zd2VyIHF1ZXJ5QW5zd2VyOworCisgICAgaW50IGFuc3dlclNpemUgPSByZXNfcXVlcnkoc2VydmVyTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zX2NfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNfdF9zcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlBbnN3ZXIuYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihxdWVyeUFuc3dlcikpOworCisKKyAgICAvLyAzcmQgc3RhZ2UgZmFpbGVkIC0gYWJvcnQKKyAgICBpZiAoYW5zd2VyU2l6ZSA8IDApCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gZmluZCBhIGhvbWUgcm91dGVyIiA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNlcnIgPDwgImV4aXQiIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGJvb2wgaXNQYXJzZWQgPSBwYXJzZUhvc3RBbmRDb25uZWN0VG9IdWIocXVlcnlBbnN3ZXIsIGFuc3dlclNpemUpOworICAgICAgaWYgKGlzUGFyc2VkID09IGZhbHNlKQorICAgICAgeworICAgICAgICAvLyBGYWlsZWQgdG8gcGFyc2UgRE5TIHJlc3BvbnNlCisgICAgICAgIHRocm93IEVycm9yKCJGYWlsZWQgdG8gcGFyc2UgRE5TIHJlc3BvbnNlIik7CisgICAgICB9CisgICAgfQorCisgIH0KKworICB2b2lkCisgIGNvbm5lY3RUb0h1Yihjb25zdCBzdGQ6OnN0cmluZyYgdXJpKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJhYm91dCB0byBjb25uZWN0IHRvOiAiIDw8IHVyaSA8PCBzdGQ6OmVuZGw7CisKKyAgICBtX2NvbnRyb2xsZXIuc3RhcnQ8bmZkOjpGYWNlQ3JlYXRlQ29tbWFuZD4oCisgICAgICBuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzKCkKKyAgICAgICAgLnNldFVyaSh1cmkpLAorICAgICAgYmluZCgmTmRuQXV0b2NvbmZpZzo6b25IdWJDb25uZWN0U3VjY2VzcywgdGhpcywgXzEpLAorICAgICAgYmluZCgmTmRuQXV0b2NvbmZpZzo6b25IdWJDb25uZWN0RXJyb3IsIHRoaXMsIF8xLCBfMikKKyAgICApOworICB9CisKKyAgdm9pZAorICBvbkh1YkNvbm5lY3RTdWNjZXNzKGNvbnN0IG5mZDo6Q29udHJvbFBhcmFtZXRlcnMmIHJlc3ApCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlN1Y2Nlc3NmdWxseSBjcmVhdGVkIGZhY2U6ICIgPDwgcmVzcCA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBSZWdpc3RlciBhIHByZWZpeCBpbiBSSUIKKyAgICBzdGF0aWMgY29uc3QgTmFtZSBURVNUQkVEX1BSRUZJWCgiL25kbiIpOworICAgIG1fY29udHJvbGxlci5zdGFydDxuZmQ6OlJpYlJlZ2lzdGVyQ29tbWFuZD4oCisgICAgICBuZmQ6OkNvbnRyb2xQYXJhbWV0ZXJzKCkKKyAgICAgICAgLnNldE5hbWUoVEVTVEJFRF9QUkVGSVgpCisgICAgICAgIC5zZXRGYWNlSWQocmVzcC5nZXRGYWNlSWQoKSkKKyAgICAgICAgLnNldE9yaWdpbihuZmQ6OlJPVVRFX09SSUdJTl9BVVRPQ09ORikKKyAgICAgICAgLnNldENvc3QoMTAwKQorICAgICAgICAuc2V0RXhwaXJhdGlvblBlcmlvZCh0aW1lOjptaWxsaXNlY29uZHM6Om1heCgpKSwKKyAgICAgIGJpbmQoJk5kbkF1dG9jb25maWc6Om9uUHJlZml4UmVnaXN0cmF0aW9uU3VjY2VzcywgdGhpcywgXzEpLAorICAgICAgYmluZCgmTmRuQXV0b2NvbmZpZzo6b25QcmVmaXhSZWdpc3RyYXRpb25FcnJvciwgdGhpcywgXzEsIF8yKSk7CisgIH0KKworICB2b2lkCisgIG9uSHViQ29ubmVjdEVycm9yKHVpbnQzMl90IGNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcikKKyAgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBmYWNlOiAiIDw8IGVycm9yIDw8ICIgKGNvZGU6ICIgPDwgY29kZSA8PCAiKSI7CisgICAgdGhyb3cgRXJyb3Iob3Muc3RyKCkpOworICB9CisKKworICBib29sIHBhcnNlSG9zdEFuZENvbm5lY3RUb0h1YihRdWVyeUFuc3dlciYgcXVlcnlBbnN3ZXIsIGludCBhbnN3ZXJTaXplKQorICB7CisgICAgLy8gVGhlIHJlZmVyZW5jZXMgb2YgdGhlIG5leHQgY2xhc3NlcyBhcmU6CisgICAgLy8gaHR0cDovL3d3dy5kaWFibG90aW4uY29tL2xpYnJhaXJpZS9uZXR3b3JraW5nL2Ruc2JpbmQvY2gxNF8wMi5odG0KKyAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9tb2xvZ2llLzYwMjc1OTcKKworICAgIHN0cnVjdCByZWNoZHIKKyAgICB7CisgICAgICB1aW50MTZfdCB0eXBlOworICAgICAgdWludDE2X3QgaWNsYXNzOworICAgICAgdWludDMyX3QgdHRsOworICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgIH07CisKKyAgICBzdHJ1Y3Qgc3J2X3QKKyAgICB7CisgICAgICB1aW50MTZfdCBwcmlvcml0eTsKKyAgICAgIHVpbnQxNl90IHdlaWdodDsKKyAgICAgIHVpbnQxNl90IHBvcnQ7CisgICAgICB1aW50OF90KiB0YXJnZXQ7CisgICAgfTsKKworICAgIGlmIChudG9ocyhxdWVyeUFuc3dlci5oZWFkZXIuYW5jb3VudCkgPT0gMCkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgIk5vIHJlY29yZHMgZm91bmRcbiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QqIGJsb2IgPSBxdWVyeUFuc3dlci5idWYgKyBOU19IRklYRURTWjsKKworICAgIGJsb2IgKz0gZG5fc2tpcG5hbWUoYmxvYiwgcXVlcnlBbnN3ZXIuYnVmICsgYW5zd2VyU2l6ZSkgKyBOU19RRklYRURTWjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnRvaHMocXVlcnlBbnN3ZXIuaGVhZGVyLmFuY291bnQpOyBpKyspCisgICAgeworICAgICAgY2hhciBzcnZOYW1lW05TX01BWEROQU1FXTsKKyAgICAgIGludCBzZXJ2ZXJOYW1lU2l6ZSA9IGRuX2V4cGFuZChxdWVyeUFuc3dlci5idWYsICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlBbnN3ZXIuYnVmICsgYW5zd2VyU2l6ZSwgIC8vIGVuZCBvZiBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgc2VydmVyIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcnZOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwYW5kZWQgc2VydmVyIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19NQVhETkFNRSk7CisgICAgICBpZiAoc2VydmVyTmFtZVNpemUgPCAwKQorICAgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHNydl90KiBzZXJ2ZXIgPSByZWludGVycHJldF9jYXN0PHNydl90Kj4oJmJsb2Jbc2l6ZW9mKHJlY2hkcildKTsKKyAgICAgIHVpbnQxNl90IGNvbnZlcnRlZFBvcnQgPSBiZTE2dG9oKHNlcnZlci0+cG9ydCk7CisKKyAgICAgIGJsb2IgKz0gc2VydmVyTmFtZVNpemUgKyBOU19IRklYRURTWiArIE5TX1FGSVhFRFNaOworCisgICAgICBjaGFyIGhvc3ROYW1lW05TX01BWEROQU1FXTsKKyAgICAgIGludCBob3N0TmFtZVNpemUgPSBkbl9leHBhbmQocXVlcnlBbnN3ZXIuYnVmLCAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUFuc3dlci5idWYgKyBhbnN3ZXJTaXplLCAgLy8gZW5kIG9mIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgaG9zdCBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lLCAgICAgICAgICAgICAgICAgICAgICAvLyBleHBhbmRlZCBob3N0IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfTUFYRE5BTUUpOworICAgICAgaWYgKGhvc3ROYW1lU2l6ZSA8IDApCisgICAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc3RkOjpzdHJpbmcgdXJpID0gInVkcDovLyI7CisgICAgICB1cmkuYXBwZW5kKGhvc3ROYW1lKTsKKyAgICAgIHVyaS5hcHBlbmQoIjoiKTsKKyAgICAgIHVyaS5hcHBlbmQoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oY29udmVydGVkUG9ydCkpOworCisgICAgICBjb25uZWN0VG9IdWIodXJpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQKKyAgb25QcmVmaXhSZWdpc3RyYXRpb25TdWNjZXNzKGNvbnN0IG5mZDo6Q29udHJvbFBhcmFtZXRlcnMmIGNvbW1hbmRTdWNjZXNzUmVzdWx0KQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJTdWNjZXNzZnVsIGluIG5hbWUgcmVnaXN0cmF0aW9uOiAiIDw8IGNvbW1hbmRTdWNjZXNzUmVzdWx0IDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHZvaWQKKyAgb25QcmVmaXhSZWdpc3RyYXRpb25FcnJvcih1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpCisgIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIkZhaWxlZCBpbiBuYW1lIHJlZ2lzdHJhdGlvbiwgIiA8PCBlcnJvciA8PCAiIChjb2RlOiAiIDw8IGNvZGUgPDwgIikiOworICAgIHRocm93IEVycm9yKG9zLnN0cigpKTsKKyAgfQorCitwcml2YXRlOgorICBGYWNlIG1fZmFjZTsKKyAgS2V5Q2hhaW4gbV9rZXlDaGFpbjsKKyAgbmZkOjpDb250cm9sbGVyIG1fY29udHJvbGxlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIHRvb2xzCit9IC8vIG5hbWVzcGFjZSBuZG4KKworaW50CittYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgaW50IG9wdDsKKyAgY29uc3QgY2hhciogcHJvZ3JhbU5hbWUgPSBhcmd2WzBdOworCisgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoViIpKSAhPSAtMSkgeworICAgIHN3aXRjaCAob3B0KSB7CisgICAgY2FzZSAnaCc6CisgICAgICBuZG46OnRvb2xzOjp1c2FnZShwcm9ncmFtTmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlICdWJzoKKyAgICAgIHN0ZDo6Y291dCA8PCBORkRfVkVSU0lPTl9CVUlMRF9TVFJJTkcgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgdHJ5IHsKKyAgICBuZG46OnRvb2xzOjpOZG5BdXRvY29uZmlnIGF1dG9Db25maWdJbnN0YW5jZTsKKworICAgIGF1dG9Db25maWdJbnN0YW5jZS5kaXNjb3Zlckh1YlN0YWdlMSgpOworICAgIGF1dG9Db25maWdJbnN0YW5jZS5ydW4oKTsKKyAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGVycm9yKSB7CisgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogIiA8PCBlcnJvci53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvTkZEL3Rvb2xzL25kbi10bHYtcGVlay5jcHAgYi9ORkQvdG9vbHMvbmRuLXRsdi1wZWVrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYwMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rvb2xzL25kbi10bHYtcGVlay5jcHAKQEAgLTAsMCArMSwyNzkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEBhdXRob3IgSmVyYWxkIFBhdWwgQWJyYWhhbSA8amVyYWxkYWJyYWhhbUBlbWFpbC5hcml6b25hLmVkdT4KKyAqLworCisjaW5jbHVkZSAidmVyc2lvbi5ocHAiCisKKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisKKyNpbmNsdWRlIDxuZG4tY3h4L2ZhY2UuaHBwPgorCituYW1lc3BhY2UgbmRudGx2cGVlayB7CisKK2NsYXNzIE5kblRsdlBlZWsgOiBib29zdDo6bm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQKKyAgTmRuVGx2UGVlayhjaGFyKiBwcm9ncmFtTmFtZSkKKyAgICA6IG1fcHJvZ3JhbU5hbWUocHJvZ3JhbU5hbWUpCisgICAgLCBtX211c3RCZUZyZXNoKGZhbHNlKQorICAgICwgbV9pc0NoaWxkU2VsZWN0b3JSaWdodG1vc3QoZmFsc2UpCisgICAgLCBtX21pblN1ZmZpeENvbXBvbmVudHMoLTEpCisgICAgLCBtX21heFN1ZmZpeENvbXBvbmVudHMoLTEpCisgICAgLCBtX2ludGVyZXN0TGlmZXRpbWUoLTEpCisgICAgLCBtX2lzUGF5bG9hZE9ubHlTZXQoZmFsc2UpCisgICAgLCBtX3RpbWVvdXQoLTEpCisgICAgLCBtX3ByZWZpeE5hbWUoIiIpCisgICAgLCBtX2lzRGF0YVJlY2VpdmVkKGZhbHNlKQorICB7CisgIH0KKworICB2b2lkCisgIHVzYWdlKCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiXG4gVXNhZ2U6XG4gIiA8PCBtX3Byb2dyYW1OYW1lIDw8ICIgIgorICAgICAgIlstZl0gWy1yXSBbLW0gbWluXSBbLU0gbWF4XSBbLWwgbGlmZXRpbWVdIFstcF0gWy13IHRpbWVvdXRdIG5kbjovbmFtZVxuIgorICAgICAgIiAgIEdldCBvbmUgZGF0YSBpdGVtIG1hdGNoaW5nIHRoZSBuYW1lIHByZWZpeCBhbmQgd3JpdGUgaXQgdG8gc3Rkb3V0XG4iCisgICAgICAiICAgWy1mXSAgICAgICAgICAtIHNldCBNdXN0QmVGcmVzaFxuIgorICAgICAgIiAgIFstcl0gICAgICAgICAgLSBzZXQgQ2hpbGRTZWxlY3RvciB0byBzZWxlY3QgcmlnaHRtb3N0IGNoaWxkXG4iCisgICAgICAiICAgWy1tIG1pbl0gICAgICAtIHNldCBNaW5TdWZmaXhDb21wb25lbnRzXG4iCisgICAgICAiICAgWy1NIG1heF0gICAgICAtIHNldCBNYXhTdWZmaXhDb21wb25lbnRzXG4iCisgICAgICAiICAgWy1sIGxpZmV0aW1lXSAtIHNldCBJbnRlcmVzdExpZmV0aW1lIGluIHRpbWU6Om1pbGxpc2Vjb25kc1xuIgorICAgICAgIiAgIFstcF0gICAgICAgICAgLSBwcmludCBwYXlsb2FkIG9ubHksIG5vdCBmdWxsIHBhY2tldFxuIgorICAgICAgIiAgIFstdyB0aW1lb3V0XSAgLSBzZXQgVGltZW91dCBpbiB0aW1lOjptaWxsaXNlY29uZHNcbiIKKyAgICAgICIgICBbLWhdICAgICAgICAgIC0gcHJpbnQgaGVscCBhbmQgZXhpdFxuIgorICAgICAgIiAgIFstVl0gICAgICAgICAgLSBwcmludCB2ZXJzaW9uIGFuZCBleGl0XG4iCisgICAgICAiXG4iOworICAgIGV4aXQoMSk7CisgIH0KKworICB2b2lkCisgIHNldE11c3RCZUZyZXNoKCkKKyAgeworICAgIG1fbXVzdEJlRnJlc2ggPSB0cnVlOworICB9CisKKyAgdm9pZAorICBzZXRSaWdodG1vc3RDaGlsZFNlbGVjdG9yKCkKKyAgeworICAgIG1faXNDaGlsZFNlbGVjdG9yUmlnaHRtb3N0ID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQKKyAgc2V0TWluU3VmZml4Q29tcG9uZW50cyhpbnQgbWluU3VmZml4Q29tcG9uZW50cykKKyAgeworICAgIGlmIChtaW5TdWZmaXhDb21wb25lbnRzIDwgMCkKKyAgICAgIHVzYWdlKCk7CisgICAgbV9taW5TdWZmaXhDb21wb25lbnRzID0gbWluU3VmZml4Q29tcG9uZW50czsKKyAgfQorCisgIHZvaWQKKyAgc2V0TWF4U3VmZml4Q29tcG9uZW50cyhpbnQgbWF4U3VmZml4Q29tcG9uZW50cykKKyAgeworICAgIGlmIChtYXhTdWZmaXhDb21wb25lbnRzIDwgMCkKKyAgICAgIHVzYWdlKCk7CisgICAgbV9tYXhTdWZmaXhDb21wb25lbnRzID0gbWF4U3VmZml4Q29tcG9uZW50czsKKyAgfQorCisgIHZvaWQKKyAgc2V0SW50ZXJlc3RMaWZldGltZShpbnQgaW50ZXJlc3RMaWZldGltZSkKKyAgeworICAgIGlmIChpbnRlcmVzdExpZmV0aW1lIDwgMCkKKyAgICAgIHVzYWdlKCk7CisgICAgbV9pbnRlcmVzdExpZmV0aW1lID0gbmRuOjp0aW1lOjptaWxsaXNlY29uZHMoaW50ZXJlc3RMaWZldGltZSk7CisgIH0KKworICB2b2lkCisgIHNldFBheWxvYWRPbmx5KCkKKyAgeworICAgIG1faXNQYXlsb2FkT25seVNldCA9IHRydWU7CisgIH0KKworICB2b2lkCisgIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpCisgIHsKKyAgICBpZiAodGltZW91dCA8IDApCisgICAgICB1c2FnZSgpOworICAgIG1fdGltZW91dCA9IG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKHRpbWVvdXQpOworICB9CisKKyAgdm9pZAorICBzZXRQcmVmaXhOYW1lKGNoYXIqIHByZWZpeE5hbWUpCisgIHsKKyAgICBtX3ByZWZpeE5hbWUgPSBwcmVmaXhOYW1lOworICAgIGlmIChtX3ByZWZpeE5hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgIHVzYWdlKCk7CisgIH0KKworICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcworICBnZXREZWZhdWx0SW50ZXJlc3RMaWZldGltZSgpCisgIHsKKyAgICByZXR1cm4gbmRuOjp0aW1lOjpzZWNvbmRzKDQpOworICB9CisKKyAgbmRuOjpJbnRlcmVzdAorICBjcmVhdGVJbnRlcmVzdFBhY2tldCgpCisgIHsKKyAgICBuZG46Ok5hbWUgaW50ZXJlc3ROYW1lKG1fcHJlZml4TmFtZSk7CisgICAgbmRuOjpJbnRlcmVzdCBpbnRlcmVzdFBhY2tldChpbnRlcmVzdE5hbWUpOworICAgIGlmIChtX211c3RCZUZyZXNoKQorICAgICAgaW50ZXJlc3RQYWNrZXQuc2V0TXVzdEJlRnJlc2godHJ1ZSk7CisgICAgaWYgKG1faXNDaGlsZFNlbGVjdG9yUmlnaHRtb3N0KQorICAgICAgaW50ZXJlc3RQYWNrZXQuc2V0Q2hpbGRTZWxlY3RvcigxKTsKKyAgICBpZiAobV9taW5TdWZmaXhDb21wb25lbnRzID49IDApCisgICAgICBpbnRlcmVzdFBhY2tldC5zZXRNaW5TdWZmaXhDb21wb25lbnRzKG1fbWluU3VmZml4Q29tcG9uZW50cyk7CisgICAgaWYgKG1fbWF4U3VmZml4Q29tcG9uZW50cyA+PSAwKQorICAgICAgaW50ZXJlc3RQYWNrZXQuc2V0TWF4U3VmZml4Q29tcG9uZW50cyhtX21heFN1ZmZpeENvbXBvbmVudHMpOworICAgIGlmIChtX2ludGVyZXN0TGlmZXRpbWUgPCBuZG46OnRpbWU6Om1pbGxpc2Vjb25kczo6emVybygpKQorICAgICAgaW50ZXJlc3RQYWNrZXQuc2V0SW50ZXJlc3RMaWZldGltZShnZXREZWZhdWx0SW50ZXJlc3RMaWZldGltZSgpKTsKKyAgICBlbHNlCisgICAgICBpbnRlcmVzdFBhY2tldC5zZXRJbnRlcmVzdExpZmV0aW1lKG1faW50ZXJlc3RMaWZldGltZSk7CisgICAgcmV0dXJuIGludGVyZXN0UGFja2V0OworICB9CisKKyAgdm9pZAorICBvbkRhdGEoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QsIG5kbjo6RGF0YSYgZGF0YSkKKyAgeworICAgIG1faXNEYXRhUmVjZWl2ZWQgPSB0cnVlOworICAgIGlmIChtX2lzUGF5bG9hZE9ubHlTZXQpCisgICAgICB7CisgICAgICAgIGNvbnN0IG5kbjo6QmxvY2smIGJsb2NrID0gZGF0YS5nZXRDb250ZW50KCk7CisgICAgICAgIHN0ZDo6Y291dC53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihibG9jay52YWx1ZSgpKSwgYmxvY2sudmFsdWVfc2l6ZSgpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGNvbnN0IG5kbjo6QmxvY2smIGJsb2NrID0gZGF0YS53aXJlRW5jb2RlKCk7CisgICAgICAgIHN0ZDo6Y291dC53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihibG9jay53aXJlKCkpLCBibG9jay5zaXplKCkpOworICAgICAgfQorICB9CisKKyAgdm9pZAorICBvblRpbWVvdXQoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpCisgIHsKKyAgfQorCisgIHZvaWQKKyAgcnVuKCkKKyAgeworICAgIHRyeQorICAgICAgeworICAgICAgICBtX2ZhY2UuZXhwcmVzc0ludGVyZXN0KGNyZWF0ZUludGVyZXN0UGFja2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmRuVGx2UGVlazo6b25EYXRhLCB0aGlzLCBfMSwgXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5kblRsdlBlZWs6Om9uVGltZW91dCwgdGhpcywgXzEpKTsKKyAgICAgICAgaWYgKG1fdGltZW91dCA8IG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzOjp6ZXJvKCkpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKG1faW50ZXJlc3RMaWZldGltZSA8IG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzOjp6ZXJvKCkpCisgICAgICAgICAgICAgIG1fZmFjZS5wcm9jZXNzRXZlbnRzKGdldERlZmF1bHRJbnRlcmVzdExpZmV0aW1lKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtX2ZhY2UucHJvY2Vzc0V2ZW50cyhtX2ludGVyZXN0TGlmZXRpbWUpOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG1fZmFjZS5wcm9jZXNzRXZlbnRzKG1fdGltZW91dCk7CisgICAgICB9CisgICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiAiIDw8IGUud2hhdCgpIDw8ICJcbiIgPDwgc3RkOjplbmRsOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICB9CisKKyAgYm9vbAorICBpc0RhdGFSZWNlaXZlZCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9pc0RhdGFSZWNlaXZlZDsKKyAgfQorCitwcml2YXRlOgorCisgIHN0ZDo6c3RyaW5nIG1fcHJvZ3JhbU5hbWU7CisgIGJvb2wgbV9tdXN0QmVGcmVzaDsKKyAgYm9vbCBtX2lzQ2hpbGRTZWxlY3RvclJpZ2h0bW9zdDsKKyAgaW50IG1fbWluU3VmZml4Q29tcG9uZW50czsKKyAgaW50IG1fbWF4U3VmZml4Q29tcG9uZW50czsKKyAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgbV9pbnRlcmVzdExpZmV0aW1lOworICBib29sIG1faXNQYXlsb2FkT25seVNldDsKKyAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgbV90aW1lb3V0OworICBzdGQ6OnN0cmluZyBtX3ByZWZpeE5hbWU7CisgIGJvb2wgbV9pc0RhdGFSZWNlaXZlZDsKKyAgbmRuOjpGYWNlIG1fZmFjZTsKK307CisKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgIG5kbnRsdnBlZWs6Ok5kblRsdlBlZWsgbmRuVGx2UGVlayhhcmd2WzBdKTsKKyAgaW50IG9wdGlvbjsKKyAgd2hpbGUgKChvcHRpb24gPSBnZXRvcHQoYXJnYywgYXJndiwgImhmcm06TTpsOnB3OlYiKSkgIT0gLTEpIHsKKyAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgIGNhc2UgJ2gnOgorICAgICAgbmRuVGx2UGVlay51c2FnZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICBuZG5UbHZQZWVrLnNldE11c3RCZUZyZXNoKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgIG5kblRsdlBlZWsuc2V0UmlnaHRtb3N0Q2hpbGRTZWxlY3RvcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICBuZG5UbHZQZWVrLnNldE1pblN1ZmZpeENvbXBvbmVudHMoYXRvaShvcHRhcmcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ00nOgorICAgICAgbmRuVGx2UGVlay5zZXRNYXhTdWZmaXhDb21wb25lbnRzKGF0b2kob3B0YXJnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgIG5kblRsdlBlZWsuc2V0SW50ZXJlc3RMaWZldGltZShhdG9pKG9wdGFyZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CisgICAgICBuZG5UbHZQZWVrLnNldFBheWxvYWRPbmx5KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICAgIG5kblRsdlBlZWsuc2V0VGltZW91dChhdG9pKG9wdGFyZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnVic6CisgICAgICBzdGQ6OmNvdXQgPDwgTkZEX1ZFUlNJT05fQlVJTERfU1RSSU5HIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICBuZG5UbHZQZWVrLnVzYWdlKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBhcmdjIC09IG9wdGluZDsKKyAgYXJndiArPSBvcHRpbmQ7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gMCkKKyAgICBuZG5UbHZQZWVrLnVzYWdlKCk7CisKKyAgbmRuVGx2UGVlay5zZXRQcmVmaXhOYW1lKGFyZ3ZbMF0pOworICBuZG5UbHZQZWVrLnJ1bigpOworCisgIGlmIChuZG5UbHZQZWVrLmlzRGF0YVJlY2VpdmVkKCkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL05GRC90b29scy9uZG4tdGx2LXBva2UuY3BwIGIvTkZEL3Rvb2xzL25kbi10bHYtcG9rZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkYjcwMgotLS0gL2Rldi9udWxsCisrKyBiL05GRC90b29scy9uZG4tdGx2LXBva2UuY3BwCkBAIC0wLDAgKzEsMjc3IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBAYXV0aG9yIEplcmFsZCBQYXVsIEFicmFoYW0gPGplcmFsZGFicmFoYW1AZW1haWwuYXJpem9uYS5lZHU+CisgKi8KKworI2luY2x1ZGUgInZlcnNpb24uaHBwIgorCisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorCisjaW5jbHVkZSA8bmRuLWN4eC9mYWNlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisKK25hbWVzcGFjZSBuZG50bHZwb2tlIHsKKworY2xhc3MgTmRuVGx2UG9rZSA6IGJvb3N0Ojpub25jb3B5YWJsZQoreworcHVibGljOgorICBleHBsaWNpdAorICBOZG5UbHZQb2tlKGNoYXIqIHByb2dyYW1OYW1lKQorICAgIDogbV9wcm9ncmFtTmFtZShwcm9ncmFtTmFtZSkKKyAgICAsIG1faXNGb3JjZURhdGFTZXQoZmFsc2UpCisgICAgLCBtX2lzVXNlRGlnZXN0U2hhMjU2U2V0KGZhbHNlKQorICAgICwgbV9pc0xhc3RBc0ZpbmFsQmxvY2tJZFNldChmYWxzZSkKKyAgICAsIG1fZnJlc2huZXNzUGVyaW9kKC0xKQorICAgICwgbV90aW1lb3V0KC0xKQorICAgICwgbV9pc0RhdGFTZW50KGZhbHNlKQorICB7CisgIH0KKworICB2b2lkCisgIHVzYWdlKCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiXG4gVXNhZ2U6XG4gIiA8PCBtX3Byb2dyYW1OYW1lIDw8ICIgIgorICAgICAgIlstZl0gWy1EXSBbLWkgaWRlbnRpdHldIFstRl0gWy14IGZyZXNobmVzc10gWy13IHRpbWVvdXRdIG5kbjovbmFtZVxuIgorICAgICAgIiAgIFJlYWRzIHBheWxvYWQgZnJvbSBzdGRpbiBhbmQgc2VuZHMgaXQgdG8gbG9jYWwgTkROIGZvcndhcmRlciBhcyBhICIKKyAgICAgICJzaW5nbGUgRGF0YSBwYWNrZXRcbiIKKyAgICAgICIgICBbLWZdICAgICAgICAgIC0gZm9yY2UsIHNlbmQgRGF0YSB3aXRob3V0IHdhaXRpbmcgZm9yIEludGVyZXN0XG4iCisgICAgICAiICAgWy1EXSAgICAgICAgICAtIHVzZSBEaWdlc3RTaGEyNTYgc2lnbmluZyBtZXRob2QgaW5zdGVhZCBvZiAiCisgICAgICAiU2lnbmF0dXJlU2hhMjU2V2l0aFJzYVxuIgorICAgICAgIiAgIFstaSBpZGVudGl0eV0gLSBzZXQgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3Igc2lnbmluZ1xuIgorICAgICAgIiAgIFstRl0gICAgICAgICAgLSBzZXQgRmluYWxCbG9ja0lkIHRvIHRoZSBsYXN0IGNvbXBvbmVudCBvZiBOYW1lXG4iCisgICAgICAiICAgWy14XSAgICAgICAgICAtIHNldCBGcmVzaG5lc3NQZXJpb2QgaW4gdGltZTo6bWlsbGlzZWNvbmRzXG4iCisgICAgICAiICAgWy13IHRpbWVvdXRdICAtIHNldCBUaW1lb3V0IGluIHRpbWU6Om1pbGxpc2Vjb25kc1xuIgorICAgICAgIiAgIFstaF0gICAgICAgICAgLSBwcmludCBoZWxwIGFuZCBleGl0XG4iCisgICAgICAiICAgWy1WXSAgICAgICAgICAtIHByaW50IHZlcnNpb24gYW5kIGV4aXRcbiIKKyAgICAgICJcbiI7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHZvaWQKKyAgc2V0Rm9yY2VEYXRhKCkKKyAgeworICAgIG1faXNGb3JjZURhdGFTZXQgPSB0cnVlOworICB9CisKKyAgdm9pZAorICBzZXRVc2VEaWdlc3RTaGEyNTYoKQorICB7CisgICAgbV9pc1VzZURpZ2VzdFNoYTI1NlNldCA9IHRydWU7CisgIH0KKworICB2b2lkCisgIHNldElkZW50aXR5TmFtZShjaGFyKiBpZGVudGl0eU5hbWUpCisgIHsKKyAgICBtX2lkZW50aXR5TmFtZSA9IG5kbjo6bWFrZV9zaGFyZWQ8bmRuOjpOYW1lPihpZGVudGl0eU5hbWUpOworICB9CisKKyAgdm9pZAorICBzZXRMYXN0QXNGaW5hbEJsb2NrSWQoKQorICB7CisgICAgbV9pc0xhc3RBc0ZpbmFsQmxvY2tJZFNldCA9IHRydWU7CisgIH0KKworICB2b2lkCisgIHNldEZyZXNobmVzc1BlcmlvZChpbnQgZnJlc2huZXNzUGVyaW9kKQorICB7CisgICAgaWYgKGZyZXNobmVzc1BlcmlvZCA8IDApCisgICAgICB1c2FnZSgpOworICAgIG1fZnJlc2huZXNzUGVyaW9kID0gbmRuOjp0aW1lOjptaWxsaXNlY29uZHMoZnJlc2huZXNzUGVyaW9kKTsKKyAgfQorCisgIHZvaWQKKyAgc2V0VGltZW91dChpbnQgdGltZW91dCkKKyAgeworICAgIGlmICh0aW1lb3V0IDwgMCkKKyAgICAgIHVzYWdlKCk7CisgICAgbV90aW1lb3V0ID0gbmRuOjp0aW1lOjptaWxsaXNlY29uZHModGltZW91dCk7CisgIH0KKworICB2b2lkCisgIHNldFByZWZpeE5hbWUoY2hhciogcHJlZml4TmFtZSkKKyAgeworICAgIG1fcHJlZml4TmFtZSA9IG5kbjo6TmFtZShwcmVmaXhOYW1lKTsKKyAgfQorCisgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzCisgIGdldERlZmF1bHRUaW1lb3V0KCkKKyAgeworICAgIHJldHVybiBuZG46OnRpbWU6OnNlY29uZHMoMTApOworICB9CisKKyAgbmRuOjpEYXRhCisgIGNyZWF0ZURhdGFQYWNrZXQoKQorICB7CisgICAgbmRuOjpEYXRhIGRhdGFQYWNrZXQobV9wcmVmaXhOYW1lKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBwYXlsb2FkU3RyZWFtOworICAgIHBheWxvYWRTdHJlYW0gPDwgc3RkOjpjaW4ucmRidWYoKTsKKyAgICBzdGQ6OnN0cmluZyBwYXlsb2FkID0gcGF5bG9hZFN0cmVhbS5zdHIoKTsKKyAgICBkYXRhUGFja2V0LnNldENvbnRlbnQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocGF5bG9hZC5jX3N0cigpKSwgcGF5bG9hZC5sZW5ndGgoKSk7CisgICAgaWYgKG1fZnJlc2huZXNzUGVyaW9kID49IG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzOjp6ZXJvKCkpCisgICAgICBkYXRhUGFja2V0LnNldEZyZXNobmVzc1BlcmlvZChtX2ZyZXNobmVzc1BlcmlvZCk7CisgICAgaWYgKG1faXNMYXN0QXNGaW5hbEJsb2NrSWRTZXQpCisgICAgICB7CisgICAgICAgIGlmICghbV9wcmVmaXhOYW1lLmVtcHR5KCkpCisgICAgICAgICAgZGF0YVBhY2tldC5zZXRGaW5hbEJsb2NrSWQobV9wcmVmaXhOYW1lLmdldCgtMSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJOYW1lIFByb3ZpZGVkIEhhcyAwIENvbXBvbmVudHMiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgfQorICAgICAgfQorICAgIGlmIChtX2lzVXNlRGlnZXN0U2hhMjU2U2V0KQorICAgICAgbV9rZXlDaGFpbi5zaWduV2l0aFNoYTI1NihkYXRhUGFja2V0KTsKKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4obV9pZGVudGl0eU5hbWUpKQorICAgICAgICAgIG1fa2V5Q2hhaW4uc2lnbihkYXRhUGFja2V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1fa2V5Q2hhaW4uc2lnbkJ5SWRlbnRpdHkoZGF0YVBhY2tldCwgKm1faWRlbnRpdHlOYW1lKTsKKyAgICAgIH0KKyAgICByZXR1cm4gZGF0YVBhY2tldDsKKyAgfQorCisgIHZvaWQKKyAgb25JbnRlcmVzdChjb25zdCBuZG46Ok5hbWUmIG5hbWUsCisgICAgICAgICAgICAgY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QsCisgICAgICAgICAgICAgY29uc3QgbmRuOjpEYXRhJiBkYXRhUGFja2V0KQorICB7CisgICAgbV9mYWNlLnB1dChkYXRhUGFja2V0KTsKKyAgICBtX2lzRGF0YVNlbnQgPSB0cnVlOworICAgIG1fZmFjZS5zaHV0ZG93bigpOworICB9CisKKyAgdm9pZAorICBvblJlZ2lzdGVyRmFpbGVkKGNvbnN0IG5kbjo6TmFtZSYgcHJlZml4LCBjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJQcmVmaXggUmVnaXN0cmF0aW9uIEZhaWx1cmUuIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICJSZWFzb24gPSAiIDw8IHJlYXNvbiA8PCBzdGQ6OmVuZGw7CisgIH0KKworICB2b2lkCisgIHJ1bigpCisgIHsKKyAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgbmRuOjpEYXRhIGRhdGFQYWNrZXQgPSBjcmVhdGVEYXRhUGFja2V0KCk7CisgICAgICAgIGlmIChtX2lzRm9yY2VEYXRhU2V0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1fZmFjZS5wdXQoZGF0YVBhY2tldCk7CisgICAgICAgICAgICBtX2lzRGF0YVNlbnQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1fZmFjZS5zZXRJbnRlcmVzdEZpbHRlcihtX3ByZWZpeE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmRuVGx2UG9rZTo6b25JbnRlcmVzdCwgdGhpcywgXzEsIF8yLCBkYXRhUGFja2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OlJlZ2lzdGVyUHJlZml4U3VjY2Vzc0NhbGxiYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmRuVGx2UG9rZTo6b25SZWdpc3RlckZhaWxlZCwgdGhpcywgXzEsIF8yKSk7CisgICAgICAgICAgfQorICAgICAgICBpZiAobV90aW1lb3V0IDwgbmRuOjp0aW1lOjptaWxsaXNlY29uZHM6Onplcm8oKSkKKyAgICAgICAgICBtX2ZhY2UucHJvY2Vzc0V2ZW50cyhnZXREZWZhdWx0VGltZW91dCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1fZmFjZS5wcm9jZXNzRXZlbnRzKG1fdGltZW91dCk7CisgICAgICB9CisgICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiAiIDw8IGUud2hhdCgpIDw8ICJcbiIgPDwgc3RkOjplbmRsOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICB9CisKKyAgYm9vbAorICBpc0RhdGFTZW50KCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2lzRGF0YVNlbnQ7CisgIH0KKworcHJpdmF0ZToKKworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisgIHN0ZDo6c3RyaW5nIG1fcHJvZ3JhbU5hbWU7CisgIGJvb2wgbV9pc0ZvcmNlRGF0YVNldDsKKyAgYm9vbCBtX2lzVXNlRGlnZXN0U2hhMjU2U2V0OworICBuZG46OnNoYXJlZF9wdHI8bmRuOjpOYW1lPiBtX2lkZW50aXR5TmFtZTsKKyAgYm9vbCBtX2lzTGFzdEFzRmluYWxCbG9ja0lkU2V0OworICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBtX2ZyZXNobmVzc1BlcmlvZDsKKyAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgbV90aW1lb3V0OworICBuZG46Ok5hbWUgbV9wcmVmaXhOYW1lOworICBib29sIG1faXNEYXRhU2VudDsKKyAgbmRuOjpGYWNlIG1fZmFjZTsKKworfTsKKworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgaW50IG9wdGlvbjsKKyAgbmRudGx2cG9rZTo6TmRuVGx2UG9rZSBuZG5UbHZQb2tlKGFyZ3ZbMF0pOworICB3aGlsZSAoKG9wdGlvbiA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGZEaTpGeDp3OlYiKSkgIT0gLTEpIHsKKyAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgIGNhc2UgJ2gnOgorICAgICAgbmRuVGx2UG9rZS51c2FnZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICBuZG5UbHZQb2tlLnNldEZvcmNlRGF0YSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6CisgICAgICBuZG5UbHZQb2tlLnNldFVzZURpZ2VzdFNoYTI1NigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgICBuZG5UbHZQb2tlLnNldElkZW50aXR5TmFtZShvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRic6CisgICAgICBuZG5UbHZQb2tlLnNldExhc3RBc0ZpbmFsQmxvY2tJZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgICBuZG5UbHZQb2tlLnNldEZyZXNobmVzc1BlcmlvZChhdG9pKG9wdGFyZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6CisgICAgICBuZG5UbHZQb2tlLnNldFRpbWVvdXQoYXRvaShvcHRhcmcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1YnOgorICAgICAgc3RkOjpjb3V0IDw8IE5GRF9WRVJTSU9OX0JVSUxEX1NUUklORyA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgbmRuVGx2UG9rZS51c2FnZSgpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgYXJnYyAtPSBvcHRpbmQ7CisgIGFyZ3YgKz0gb3B0aW5kOworCisgIGlmIChhcmd2WzBdID09IDApCisgICAgbmRuVGx2UG9rZS51c2FnZSgpOworCisgIG5kblRsdlBva2Uuc2V0UHJlZml4TmFtZShhcmd2WzBdKTsKKyAgbmRuVGx2UG9rZS5ydW4oKTsKKworICBpZiAobmRuVGx2UG9rZS5pc0RhdGFTZW50KCkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL05GRC90b29scy9uZmQtYXV0b3JlZy5jcHAgYi9ORkQvdG9vbHMvbmZkLWF1dG9yZWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDY4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmZkLWF1dG9yZWcuY3BwCkBAIC0wLDAgKzEsNDAwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgKiAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE5GRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bmRuLWN4eC9mYWNlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L25hbWUuaHBwPgorCisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9rZXktY2hhaW4uaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9mYWNlLXVyaS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1jb250cm9sbGVyLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZhY2UtbW9uaXRvci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1mYWNlLXN0YXR1cy5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9lbmNvZGluZy9idWZmZXItc3RyZWFtLmhwcD4KKworI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy9vcHRpb25zX2Rlc2NyaXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMvdmFyaWFibGVzX21hcC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zL3BhcnNlcnMuaHBwPgorCisjaW5jbHVkZSAidmVyc2lvbi5ocHAiCisjaW5jbHVkZSAiY29yZS9uZXR3b3JrLmhwcCIKKwordXNpbmcgbmFtZXNwYWNlIG5kbjo6bmZkOwordXNpbmcgbmRuOjpGYWNlOwordXNpbmcgbmRuOjpLZXlDaGFpbjsKK3VzaW5nIG5kbjo6bmZkOjpGYWNlRXZlbnROb3RpZmljYXRpb247Cit1c2luZyBuZG46OnV0aWw6OkZhY2VVcmk7Cit1c2luZyA6Om5mZDo6TmV0d29yazsKKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgbmZkX2F1dG9yZWcgeworCituYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworCitjbGFzcyBBdXRvcmVnU2VydmVyIDogYm9vc3Q6Om5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIEF1dG9yZWdTZXJ2ZXIoKQorICAgIDogbV9jb250cm9sbGVyKG1fZmFjZSwgbV9rZXlDaGFpbikKKyAgICAsIG1fZmFjZU1vbml0b3IobV9mYWNlKQorICAgICwgbV9jb3N0KDI1NSkKKyAgeworICB9CisKKyAgdm9pZAorICBvblJlZ2lzdGVyQ29tbWFuZFN1Y2Nlc3ModWludDY0X3QgZmFjZUlkLCBjb25zdCBOYW1lJiBwcmVmaXgpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlNVQ0NFRUQ6IHJlZ2lzdGVyICIgPDwgcHJlZml4IDw8ICIgb24gZmFjZSAiIDw8IGZhY2VJZCA8PCBzdGQ6OmVuZGw7CisgIH0KKworICB2b2lkCisgIG9uUmVnaXN0ZXJDb21tYW5kRmFpbHVyZSh1aW50NjRfdCBmYWNlSWQsIGNvbnN0IE5hbWUmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkZBSUxFRDogcmVnaXN0ZXIgIiA8PCBwcmVmaXggPDwgIiBvbiBmYWNlICIgPDwgZmFjZUlkCisgICAgICAgICAgICAgIDw8ICIgKGNvZGU6ICIgPDwgY29kZSA8PCAiLCByZWFzb246ICIgPDwgcmVhc29uIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgIH0KKworICAvKioKKyAgICogXHJldHVybiB0cnVlIGlmIHVyaSBoYXMgc2NoZW1hIGFsbG93ZWQgdG8gZG8gYXV0by1yZWdpc3RyYXRpb25zCisgICAqLworICBib29sCisgIGhhc0FsbG93ZWRTY2hlbWEoY29uc3QgRmFjZVVyaSYgdXJpKQorICB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKKyAgICByZXR1cm4gKHNjaGVtZSA9PSAidWRwNCIgfHwgc2NoZW1lID09ICJ0Y3A0IiB8fAorICAgICAgICAgICAgc2NoZW1lID09ICJ1ZHA2IiB8fCBzY2hlbWUgPT0gInRjcDYiKTsKKyAgfQorCisgIC8qKgorICAgKiBccmV0dXJuIHRydWUgaWYgYWRkcmVzcyBpcyBibGFja2xpc3RlZAorICAgKi8KKyAgYm9vbAorICBpc0JsYWNrbGlzdGVkKGNvbnN0IGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzcyYgYWRkcmVzcykKKyAgeworICAgIGZvciAoc3RkOjp2ZWN0b3I8TmV0d29yaz46OmNvbnN0X2l0ZXJhdG9yIG5ldHdvcmsgPSBtX2JsYWNrTGlzdC5iZWdpbigpOworICAgICAgICAgbmV0d29yayAhPSBtX2JsYWNrTGlzdC5lbmQoKTsKKyAgICAgICAgICsrbmV0d29yaykKKyAgICAgIHsKKyAgICAgICAgaWYgKG5ldHdvcmstPmRvZXNDb250YWluKGFkZHJlc3MpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFxyZXR1cm4gdHJ1ZSBpZiBhZGRyZXNzIGlzIHdoaXRlbGlzdGVkCisgICAqLworICBib29sCisgIGlzV2hpdGVsaXN0ZWQoY29uc3QgYm9vc3Q6OmFzaW86OmlwOjphZGRyZXNzJiBhZGRyZXNzKQorICB7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxOZXR3b3JrPjo6Y29uc3RfaXRlcmF0b3IgbmV0d29yayA9IG1fd2hpdGVMaXN0LmJlZ2luKCk7CisgICAgICAgICBuZXR3b3JrICE9IG1fd2hpdGVMaXN0LmVuZCgpOworICAgICAgICAgKytuZXR3b3JrKQorICAgICAgeworICAgICAgICBpZiAobmV0d29yay0+ZG9lc0NvbnRhaW4oYWRkcmVzcykpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkCisgIHJlZ2lzdGVyUHJlZml4ZXNGb3JGYWNlKHVpbnQ2NF90IGZhY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmRuOjpOYW1lPiYgcHJlZml4ZXMpCisgIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPG5kbjo6TmFtZT46OmNvbnN0X2l0ZXJhdG9yIHByZWZpeCA9IHByZWZpeGVzLmJlZ2luKCk7CisgICAgICAgICBwcmVmaXggIT0gcHJlZml4ZXMuZW5kKCk7CisgICAgICAgICArK3ByZWZpeCkKKyAgICAgIHsKKyAgICAgICAgbV9jb250cm9sbGVyLnN0YXJ0PFJpYlJlZ2lzdGVyQ29tbWFuZD4oCisgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgLnNldE5hbWUoKnByZWZpeCkKKyAgICAgICAgICAgIC5zZXRGYWNlSWQoZmFjZUlkKQorICAgICAgICAgICAgLnNldE9yaWdpbihST1VURV9PUklHSU5fQVVUT1JFRykKKyAgICAgICAgICAgIC5zZXRDb3N0KG1fY29zdCkKKyAgICAgICAgICAgIC5zZXRFeHBpcmF0aW9uUGVyaW9kKHRpbWU6Om1pbGxpc2Vjb25kczo6bWF4KCkpLAorICAgICAgICAgIGJpbmQoJkF1dG9yZWdTZXJ2ZXI6Om9uUmVnaXN0ZXJDb21tYW5kU3VjY2VzcywgdGhpcywgZmFjZUlkLCAqcHJlZml4KSwKKyAgICAgICAgICBiaW5kKCZBdXRvcmVnU2VydmVyOjpvblJlZ2lzdGVyQ29tbWFuZEZhaWx1cmUsIHRoaXMsIGZhY2VJZCwgKnByZWZpeCwgXzEsIF8yKSk7CisgICAgICB9CisgIH0KKworICB2b2lkCisgIHJlZ2lzdGVyUHJlZml4ZXNJZk5lZWRlZCh1aW50NjRfdCBmYWNlSWQsIGNvbnN0IEZhY2VVcmkmIHVyaSwgRmFjZVBlcnNpc3RlbmN5IGZhY2VQZXJzaXN0ZW5jeSkKKyAgeworICAgIGlmIChoYXNBbGxvd2VkU2NoZW1hKHVyaSkpIHsKKyAgICAgIGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZWM7CisgICAgICBib29zdDo6YXNpbzo6aXA6OmFkZHJlc3MgYWRkcmVzcyA9IGJvb3N0Ojphc2lvOjppcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcodXJpLmdldEhvc3QoKSwgZWMpOworCisgICAgICBpZiAoIWFkZHJlc3MuaXNfbXVsdGljYXN0KCkpIHsKKyAgICAgICAgLy8gcmVnaXN0ZXIgYWxsLWZhY2UgcHJlZml4ZXMKKyAgICAgICAgcmVnaXN0ZXJQcmVmaXhlc0ZvckZhY2UoZmFjZUlkLCBtX2FsbEZhY2VzUHJlZml4ZXMpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIGF1dG9yZWcgcHJlZml4ZXMgaWYgbmV3IGZhY2UgaXMgb24tZGVtYW5kIGFuZCBub3QgYmxhY2tsaXN0ZWQgYW5kIHdoaXRlbGlzdGVkCisgICAgICAgIGlmIChmYWNlUGVyc2lzdGVuY3kgPT0gRkFDRV9QRVJTSVNURU5DWV9PTl9ERU1BTkQgJiYKKyAgICAgICAgICAgICFpc0JsYWNrbGlzdGVkKGFkZHJlc3MpICYmIGlzV2hpdGVsaXN0ZWQoYWRkcmVzcykpIHsKKyAgICAgICAgICByZWdpc3RlclByZWZpeGVzRm9yRmFjZShmYWNlSWQsIG1fYXV0b3JlZ1ByZWZpeGVzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQKKyAgb25Ob3RpZmljYXRpb24oY29uc3QgRmFjZUV2ZW50Tm90aWZpY2F0aW9uJiBub3RpZmljYXRpb24pCisgIHsKKyAgICBpZiAobm90aWZpY2F0aW9uLmdldEtpbmQoKSA9PSBGQUNFX0VWRU5UX0NSRUFURUQgJiYKKyAgICAgICAgbm90aWZpY2F0aW9uLmdldEZhY2VTY29wZSgpICE9IEZBQ0VfU0NPUEVfTE9DQUwpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiUFJPQ0VTU0lORzogIiA8PCBub3RpZmljYXRpb24gPDwgc3RkOjplbmRsOworCisgICAgICAgIHJlZ2lzdGVyUHJlZml4ZXNJZk5lZWRlZChub3RpZmljYXRpb24uZ2V0RmFjZUlkKCksIEZhY2VVcmkobm90aWZpY2F0aW9uLmdldFJlbW90ZVVyaSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5nZXRGYWNlUGVyc2lzdGVuY3koKSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIklHTk9SRUQ6ICIgPDwgbm90aWZpY2F0aW9uIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIH0KKyAgfQorCisKKyAgdm9pZAorICBzaWduYWxIYW5kbGVyKCkKKyAgeworICAgIG1fZmFjZS5zaHV0ZG93bigpOworICB9CisKKworICB2b2lkCisgIHVzYWdlKHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgIGNvbnN0IHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uJiBvcHRpb25EZXNjaXB0aW9uLAorICAgICAgICBjb25zdCBjaGFyKiBwcm9ncmFtTmFtZSkKKyAgeworICAgIG9zIDw8ICJVc2FnZTpcbiIKKyAgICAgICA8PCAiICAiIDw8IHByb2dyYW1OYW1lIDw8ICIgLS1wcmVmaXg9PC9hdXRvcmVnL3ByZWZpeD4gWy0tcHJlZml4PS9hbm90aGVyL3ByZWZpeF0gLi4uXG4iCisgICAgICAgPDwgIlxuIjsKKyAgICBvcyA8PCBvcHRpb25EZXNjaXB0aW9uOworICB9CisKKyAgdm9pZAorICBzdGFydFByb2Nlc3NpbmcoKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJBVVRPUkVHIHByZWZpeGVzOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPG5kbjo6TmFtZT46OmNvbnN0X2l0ZXJhdG9yIHByZWZpeCA9IG1fYXV0b3JlZ1ByZWZpeGVzLmJlZ2luKCk7CisgICAgICAgICBwcmVmaXggIT0gbV9hdXRvcmVnUHJlZml4ZXMuZW5kKCk7CisgICAgICAgICArK3ByZWZpeCkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgICIgPDwgKnByZWZpeCA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisgICAgc3RkOjpjZXJyIDw8ICJBTEwtRkFDRVMtQVVUT1JFRyBwcmVmaXhlczogIiA8PCBzdGQ6OmVuZGw7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxuZG46Ok5hbWU+Ojpjb25zdF9pdGVyYXRvciBwcmVmaXggPSBtX2FsbEZhY2VzUHJlZml4ZXMuYmVnaW4oKTsKKyAgICAgICAgIHByZWZpeCAhPSBtX2FsbEZhY2VzUHJlZml4ZXMuZW5kKCk7CisgICAgICAgICArK3ByZWZpeCkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgICIgPDwgKnByZWZpeCA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisKKyAgICBpZiAoIW1fYmxhY2tMaXN0LmVtcHR5KCkpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiQmxhY2tsaXN0ZWQgbmV0d29ya3M6ICIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPE5ldHdvcms+Ojpjb25zdF9pdGVyYXRvciBuZXR3b3JrID0gbV9ibGFja0xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICBuZXR3b3JrICE9IG1fYmxhY2tMaXN0LmVuZCgpOworICAgICAgICAgICAgICsrbmV0d29yaykKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIiA8PCAqbmV0d29yayA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgc3RkOjpjZXJyIDw8ICJXaGl0ZWxpc3RlZCBuZXR3b3JrczogIiA8PCBzdGQ6OmVuZGw7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxOZXR3b3JrPjo6Y29uc3RfaXRlcmF0b3IgbmV0d29yayA9IG1fd2hpdGVMaXN0LmJlZ2luKCk7CisgICAgICAgICBuZXR3b3JrICE9IG1fd2hpdGVMaXN0LmVuZCgpOworICAgICAgICAgKytuZXR3b3JrKQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIiA8PCAqbmV0d29yayA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisKKyAgICBtX2ZhY2VNb25pdG9yLm9uTm90aWZpY2F0aW9uICs9IGJpbmQoJkF1dG9yZWdTZXJ2ZXI6Om9uTm90aWZpY2F0aW9uLCB0aGlzLCBfMSk7CisgICAgbV9mYWNlTW9uaXRvci5zdGFydCgpOworCisgICAgYm9vc3Q6OmFzaW86OnNpZ25hbF9zZXQgc2lnbmFsU2V0KG1fZmFjZS5nZXRJb1NlcnZpY2UoKSwgU0lHSU5ULCBTSUdURVJNKTsKKyAgICBzaWduYWxTZXQuYXN5bmNfd2FpdChiaW5kKCZBdXRvcmVnU2VydmVyOjpzaWduYWxIYW5kbGVyLCB0aGlzKSk7CisKKyAgICBtX2ZhY2UucHJvY2Vzc0V2ZW50cygpOworICB9CisKKworICB2b2lkCisgIGZldGNoRmFjZVN0YXR1c1NlZ21lbnRzKGNvbnN0IERhdGEmIGRhdGEsIGNvbnN0IHNoYXJlZF9wdHI8bmRuOjpPQnVmZmVyU3RyZWFtPiYgYnVmZmVyKQorICB7CisgICAgYnVmZmVyLT53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhLmdldENvbnRlbnQoKS52YWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0Q29udGVudCgpLnZhbHVlX3NpemUoKSk7CisKKyAgICB1aW50NjRfdCBjdXJyZW50U2VnbWVudCA9IGRhdGEuZ2V0TmFtZSgpLmdldCgtMSkudG9TZWdtZW50KCk7CisKKyAgICBjb25zdCBuYW1lOjpDb21wb25lbnQmIGZpbmFsQmxvY2tJZCA9IGRhdGEuZ2V0TWV0YUluZm8oKS5nZXRGaW5hbEJsb2NrSWQoKTsKKyAgICBpZiAoZmluYWxCbG9ja0lkLmVtcHR5KCkgfHwgZmluYWxCbG9ja0lkLnRvU2VnbWVudCgpID4gY3VycmVudFNlZ21lbnQpIHsKKyAgICAgIG1fZmFjZS5leHByZXNzSW50ZXJlc3QoZGF0YS5nZXROYW1lKCkuZ2V0UHJlZml4KC0xKS5hcHBlbmRTZWdtZW50KGN1cnJlbnRTZWdtZW50ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkF1dG9yZWdTZXJ2ZXI6OmZldGNoRmFjZVN0YXR1c1NlZ21lbnRzLCB0aGlzLCBfMiwgYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpPblRpbWVvdXQoKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIHByb2Nlc3NGYWNlU3RhdHVzRGF0YXNldChidWZmZXIpOworICAgIH0KKyAgfQorCisgIHZvaWQKKyAgc3RhcnRGZXRjaGluZ0ZhY2VTdGF0dXNEYXRhc2V0KCkKKyAgeworICAgIHNoYXJlZF9wdHI8bmRuOjpPQnVmZmVyU3RyZWFtPiBidWZmZXIgPSBtYWtlX3NoYXJlZDxuZG46Ok9CdWZmZXJTdHJlYW0+KCk7CisKKyAgICBJbnRlcmVzdCBpbnRlcmVzdCgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvbGlzdCIpOworICAgIGludGVyZXN0LnNldENoaWxkU2VsZWN0b3IoMSk7CisgICAgaW50ZXJlc3Quc2V0TXVzdEJlRnJlc2godHJ1ZSk7CisKKyAgICBtX2ZhY2UuZXhwcmVzc0ludGVyZXN0KGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmQXV0b3JlZ1NlcnZlcjo6ZmV0Y2hGYWNlU3RhdHVzU2VnbWVudHMsIHRoaXMsIF8yLCBidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjpPblRpbWVvdXQoKSk7CisgIH0KKworICB2b2lkCisgIHByb2Nlc3NGYWNlU3RhdHVzRGF0YXNldChjb25zdCBzaGFyZWRfcHRyPG5kbjo6T0J1ZmZlclN0cmVhbT4mIGJ1ZmZlcikKKyAgeworICAgIG5kbjo6Q29uc3RCdWZmZXJQdHIgYnVmID0gYnVmZmVyLT5idWYoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gbXVsdGljYXN0RmFjZXM7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgYnVmLT5zaXplKCkpCisgICAgICB7CisgICAgICAgIEJsb2NrIGJsb2NrOworICAgICAgICBib29sIG9rID0gQmxvY2s6OmZyb21CdWZmZXIoYnVmLCBvZmZzZXQsIGJsb2NrKTsKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiBjYW5ub3QgZGVjb2RlIEZhY2VTdGF0dXMgVExWIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IGJsb2NrLnNpemUoKTsKKworICAgICAgICBuZmQ6OkZhY2VTdGF0dXMgZmFjZVN0YXR1cyhibG9jayk7CisgICAgICAgIHJlZ2lzdGVyUHJlZml4ZXNJZk5lZWRlZChmYWNlU3RhdHVzLmdldEZhY2VJZCgpLCBGYWNlVXJpKGZhY2VTdGF0dXMuZ2V0UmVtb3RlVXJpKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZVN0YXR1cy5nZXRGYWNlUGVyc2lzdGVuY3koKSk7CisgICAgICB9CisgIH0KKworICBpbnQKKyAgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQorICB7CisgICAgcG86Om9wdGlvbnNfZGVzY3JpcHRpb24gb3B0aW9uRGVzY2lwdGlvbjsKKyAgICBvcHRpb25EZXNjaXB0aW9uLmFkZF9vcHRpb25zKCkKKyAgICAgICgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikKKyAgICAgICgicHJlZml4LGkiLCBwbzo6dmFsdWU8c3RkOjp2ZWN0b3I8bmRuOjpOYW1lPiA+KCZtX2F1dG9yZWdQcmVmaXhlcyktPmNvbXBvc2luZygpLAorICAgICAgICJwcmVmaXggdGhhdCBzaG91bGQgYmUgYXV0b21hdGljYWxseSByZWdpc3RlcmVkIHdoZW4gbmV3IGEgcmVtb3RlIG5vbi1sb2NhbCBmYWNlIGlzICIKKyAgICAgICAiZXN0YWJsaXNoZWQiKQorICAgICAgKCJhbGwtZmFjZXMtcHJlZml4LGEiLCBwbzo6dmFsdWU8c3RkOjp2ZWN0b3I8bmRuOjpOYW1lPiA+KCZtX2FsbEZhY2VzUHJlZml4ZXMpLT5jb21wb3NpbmcoKSwKKyAgICAgICAicHJlZml4IHRoYXQgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJlZCBmb3IgYWxsIFRDUCBhbmQgVURQIG5vbi1sb2NhbCBmYWNlcyAiCisgICAgICAgIihibGFja2xpc3RzIGFuZCB3aGl0ZWxpc3RzIGRvIG5vdCBhcHBseSB0byB0aGlzIHByZWZpeCkiKQorICAgICAgKCJjb3N0LGMiLCBwbzo6dmFsdWU8dWludDY0X3Q+KCZtX2Nvc3QpLT5kZWZhdWx0X3ZhbHVlKDI1NSksCisgICAgICAgIkZJQiBjb3N0IHdoaWNoIHNob3VsZCBiZSBhc3NpZ25lZCB0byBhdXRvcmVnIG5leHRob3BzIikKKyAgICAgICgid2hpdGVsaXN0LHciLCBwbzo6dmFsdWU8c3RkOjp2ZWN0b3I8TmV0d29yaz4gPigmbV93aGl0ZUxpc3QpLT5jb21wb3NpbmcoKSwKKyAgICAgICAiV2hpdGVsaXN0ZWQgbmV0d29yaywgZS5nLiwgMTkyLjE2OC4yLjAvMjQgb3IgOjoxLzEyOCIpCisgICAgICAoImJsYWNrbGlzdCxiIiwgcG86OnZhbHVlPHN0ZDo6dmVjdG9yPE5ldHdvcms+ID4oJm1fYmxhY2tMaXN0KS0+Y29tcG9zaW5nKCksCisgICAgICAgIkJsYWNrbGlzdGVkIG5ldHdvcmssIGUuZy4sIDE5Mi4xNjguMi4zMi8zMCBvciA6OjEvMTI4IikKKyAgICAgICgidmVyc2lvbixWIiwgInNob3cgdmVyc2lvbiBhbmQgZXhpdCIpCisgICAgICA7CisKKyAgICBwbzo6dmFyaWFibGVzX21hcCBvcHRpb25zOworICAgIHRyeQorICAgICAgeworICAgICAgICBwbzo6c3RvcmUocG86OmNvbW1hbmRfbGluZV9wYXJzZXIoYXJnYywgYXJndikub3B0aW9ucyhvcHRpb25EZXNjaXB0aW9uKS5ydW4oKSwgb3B0aW9ucyk7CisgICAgICAgIHBvOjpub3RpZnkob3B0aW9ucyk7CisgICAgICB9CisgICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHVzYWdlKHN0ZDo6Y2Vyciwgb3B0aW9uRGVzY2lwdGlvbiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgaWYgKG9wdGlvbnMuY291bnQoImhlbHAiKSkKKyAgICAgIHsKKyAgICAgICAgdXNhZ2Uoc3RkOjpjb3V0LCBvcHRpb25EZXNjaXB0aW9uLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICBpZiAob3B0aW9ucy5jb3VudCgidmVyc2lvbiIpKQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgTkZEX1ZFUlNJT05fQlVJTERfU1RSSU5HIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICBpZiAobV9hdXRvcmVnUHJlZml4ZXMuZW1wdHkoKSAmJiBtX2FsbEZhY2VzUHJlZml4ZXMuZW1wdHkoKSkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogYXQgbGVhc3Qgb25lIC0tcHJlZml4IG9yIC0tYWxsLWZhY2VzLXByZWZpeCBtdXN0IGJlIHNwZWNpZmllZCIKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHVzYWdlKHN0ZDo6Y2Vyciwgb3B0aW9uRGVzY2lwdGlvbiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgICAgfQorCisgICAgaWYgKG1fd2hpdGVMaXN0LmVtcHR5KCkpCisgICAgICB7CisgICAgICAgIC8vIEFsbG93IGV2ZXJ5dGhpbmcKKyAgICAgICAgbV93aGl0ZUxpc3QucHVzaF9iYWNrKE5ldHdvcms6OmdldE1heFJhbmdlVjQoKSk7CisgICAgICAgIG1fd2hpdGVMaXN0LnB1c2hfYmFjayhOZXR3b3JrOjpnZXRNYXhSYW5nZVY2KCkpOworICAgICAgfQorCisgICAgdHJ5CisgICAgICB7CisgICAgICAgIHN0YXJ0RmV0Y2hpbmdGYWNlU3RhdHVzRGF0YXNldCgpOworICAgICAgICBzdGFydFByb2Nlc3NpbmcoKTsKKyAgICAgIH0KKyAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KKworICAgIHJldHVybiAwOworICB9CisKK3ByaXZhdGU6CisgIEZhY2UgbV9mYWNlOworICBLZXlDaGFpbiBtX2tleUNoYWluOworICBDb250cm9sbGVyIG1fY29udHJvbGxlcjsKKyAgRmFjZU1vbml0b3IgbV9mYWNlTW9uaXRvcjsKKyAgc3RkOjp2ZWN0b3I8bmRuOjpOYW1lPiBtX2F1dG9yZWdQcmVmaXhlczsKKyAgc3RkOjp2ZWN0b3I8bmRuOjpOYW1lPiBtX2FsbEZhY2VzUHJlZml4ZXM7CisgIHVpbnQ2NF90IG1fY29zdDsKKyAgc3RkOjp2ZWN0b3I8TmV0d29yaz4gbV93aGl0ZUxpc3Q7CisgIHN0ZDo6dmVjdG9yPE5ldHdvcms+IG1fYmxhY2tMaXN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgbmZkX2F1dG9yZWcKK30gLy8gbmFtZXNwYWNlIG5kbgorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgbmRuOjpuZmRfYXV0b3JlZzo6QXV0b3JlZ1NlcnZlciBzZXJ2ZXI7CisgIHJldHVybiBzZXJ2ZXIubWFpbihhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL05GRC90b29scy9uZmQtc3RhcnQuc2ggYi9ORkQvdG9vbHMvbmZkLXN0YXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkZjEyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmZkLXN0YXJ0LnNoCkBAIC0wLDAgKzEsNTUgQEAKKyMhQEJBU0hACisKK1ZFUlNJT049IkBWRVJTSU9OQCIKKworY2FzZSAiJDEiIGluCisgIC1oKQorICAgIGVjaG8gVXNhZ2UKKyAgICBlY2hvICQwCisgICAgZWNobyAiICBTdGFydCBORkQgYW5kIFJJQiBNYW5hZ2VtZW50IGRhZW1vbiIKKyAgICBleGl0IDAKKyAgICA7OworICAtVikKKyAgICBlY2hvICRWRVJTSU9OCisgICAgZXhpdCAwCisgICAgOzsKKyAgIiIpIDs7ICMgZG8gbm90aGluZworICAqKQorICAgIGVjaG8gIlVucmVjb2duaXplZCBvcHRpb24gJDEiCisgICAgZXhpdCAxCisgICAgOzsKK2VzYWMKKworaGFzUHJvY2VzcygpIHsKKyAgbG9jYWwgcHJvY2Vzc05hbWU9JDEKKworICBpZiBwZ3JlcCAteCAkcHJvY2Vzc05hbWUgPi9kZXYvbnVsbAorICB0aGVuCisgICAgZWNobyAkcHJvY2Vzc05hbWUKKyAgZmkKK30KKworaGFzTkZEPSQoaGFzUHJvY2VzcyBuZmQpCitoYXNOUkQ9JChoYXNQcm9jZXNzIG5yZCkKKworaWYgW1sgLW4gJGhhc05GRCRoYXNOUkQgXV0KK3RoZW4KKyAgZWNobyAnTkZEIG9yIE5SRCBpcyBhbHJlYWR5IHJ1bm5pbmcuLi4nCisgIGV4aXQgMQorZmkKKworaWYgISBuZG5zZWMtZ2V0LWRlZmF1bHQgJj4vZGV2L251bGwKK3RoZW4KKyAgbmRuc2VjLWtleWdlbiAvbG9jYWxob3N0L29wZXJhdG9yIHwgbmRuc2VjLWluc3RhbGwtY2VydCAtCitmaQorCitpZiAhIHN1ZG8gdHJ1ZQordGhlbgorICBlY2hvICdVbmFibGUgdG8gb2J0YWluIHN1cGVydXNlciBwcml2aWxlZ2UnCisgIGV4aXQgMgorZmkKKworc3VkbyBuZmQgJgorc2xlZXAgMgorbnJkICYKK3NsZWVwIDIKZGlmZiAtLWdpdCBhL05GRC90b29scy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLWZpbGVzL25mZC1zdGF0dXMueHNsIGIvTkZEL3Rvb2xzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXItZmlsZXMvbmZkLXN0YXR1cy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNzAwNAotLS0gL2Rldi9udWxsCisrKyBiL05GRC90b29scy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLWZpbGVzL25mZC1zdGF0dXMueHNsCkBAIC0wLDAgKzEsMzQ2IEBACis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgoreG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCit4bWxuczpuZmQ9Im5kbjovbG9jYWxob3N0L25mZC9zdGF0dXMvMSI+Cis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGVuY29kaW5nPSJ1dGYtOCIgaW5kZW50PSJ5ZXMiIC8+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICA8eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9J3llcyc+Jmx0OyFET0NUWVBFIGh0bWw+PC94c2w6dGV4dD4KKyAgPGh0bWw+CisgIDxoZWFkPgorICA8dGl0bGU+TkZEIFN0YXR1czwvdGl0bGU+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlLmNzcyIgLz4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgPGhlYWRlcj4KKyAgICA8aDE+TkZEIFN0YXR1czwvaDE+CisgIDwvaGVhZGVyPgorICA8YXJ0aWNsZT4KKyAgICA8ZGl2IGlkPSJjb250ZW50Ij4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICA8L2Rpdj4KKyAgPC9hcnRpY2xlPgorICA8Zm9vdGVyPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmVyc2lvbiI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5mZDpuZmRTdGF0dXMvbmZkOmdlbmVyYWxTdGF0dXMvbmZkOnZlcnNpb24iLz4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8c3BhbiBjbGFzcz0iZ3JleSI+UG93ZXJlZCBieSA8L3NwYW4+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9uYW1lZC1kYXRhLm5ldC9kb2MvTkZEL3skdmVyc2lvbn0vIj48c3BhbiBjbGFzcz0iZ3JlZW4iPk5GRCB2ZXJzaW9uIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmVyc2lvbiIvPjwvc3Bhbj48L2E+PHNwYW4gY2xhc3M9ImdyZXkiPi48L3NwYW4+CisgIDwvZm9vdGVyPgorICA8L2JvZHk+CisgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iZm9ybWF0RGF0ZSI+CisgIDx4c2w6cGFyYW0gbmFtZT0iZGF0ZSIgLz4KKyAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZygkZGF0ZSwgMCwgMTEpIi8+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZygkZGF0ZSwgMTIsIDgpIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmb3JtYXREdXJhdGlvbiI+CisgIDx4c2w6cGFyYW0gbmFtZT0iZHVyYXRpb24iIC8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2Vjb25kcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZygkZHVyYXRpb24sIDMsIHN0cmluZy1sZW5ndGgoJGR1cmF0aW9uKS0zKSIgLz48L3hzbDp2YXJpYWJsZT4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkYXlzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZmxvb3IoJHNlY29uZHMgZGl2IDg2NDAwKSIgLz48L3hzbDp2YXJpYWJsZT4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJob3VycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZsb29yKCRzZWNvbmRzIGRpdiAzNjAwKSIgLz48L3hzbDp2YXJpYWJsZT4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtaW51dGVzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZmxvb3IoJHNlY29uZHMgZGl2IDYwKSIgLz48L3hzbDp2YXJpYWJsZT4KKyAgPHhzbDpjaG9vc2U+CisgICAgPHhzbDp3aGVuIHRlc3Q9IiRkYXlzID0gMSI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRheXMiLz4gZGF5CisgICAgPC94c2w6d2hlbj4KKyAgICA8eHNsOndoZW4gdGVzdD0iJGRheXMgPiAxIj4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGF5cyIvPiBkYXlzCisgICAgPC94c2w6d2hlbj4KKyAgICA8eHNsOndoZW4gdGVzdD0iJGhvdXJzID0gMSI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhvdXJzIi8+IGhvdXIKKyAgICA8L3hzbDp3aGVuPgorICAgIDx4c2w6d2hlbiB0ZXN0PSIkaG91cnMgPiAxIj4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaG91cnMiLz4gaG91cnMKKyAgICA8L3hzbDp3aGVuPgorICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWludXRlcyA9IDEiPgorICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaW51dGVzIi8+IG1pbnV0ZQorICAgIDwveHNsOndoZW4+CisgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW51dGVzID4gMSI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pbnV0ZXMiLz4gbWludXRlcworICAgIDwveHNsOndoZW4+CisgICAgPHhzbDp3aGVuIHRlc3Q9IiRzZWNvbmRzID0gMSI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlY29uZHMiLz4gc2Vjb25kCisgICAgPC94c2w6d2hlbj4KKyAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2Vjb25kcyIvPiBzZWNvbmRzCisgICAgPC94c2w6b3RoZXJ3aXNlPgorICA8L3hzbDpjaG9vc2U+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmZkOmdlbmVyYWxTdGF0dXMiPgorICA8aDI+R2VuZXJhbCBORkQgc3RhdHVzPC9oMj4KKyAgPHRhYmxlIGNsYXNzPSJpdGVtLWxpc3QiPgorICAgIDx0aGVhZD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPk5GRCBJRDwvdGg+CisgICAgICAgIDx0aD5WZXJzaW9uPC90aD4KKyAgICAgICAgPHRoPlN0YXJ0IHRpbWU8L3RoPgorICAgICAgICA8dGg+Q3VycmVudCB0aW1lPC90aD4KKyAgICAgICAgPHRoPlVwdGltZTwvdGg+CisgICAgICAgIDx0aD5OYW1lVHJlZSBFbnRyaWVzPC90aD4KKyAgICAgICAgPHRoPkZJQiBlbnRyaWVzPC90aD4KKyAgICAgICAgPHRoPlBJVCBlbnRyaWVzPC90aD4KKyAgICAgICAgPHRoPk1lYXN1cmVtZW50cyBlbnRyaWVzPC90aD4KKyAgICAgICAgPHRoPkNTIGVudHJpZXM8L3RoPgorICAgICAgICA8dGg+SW4gSW50ZXJlc3RzPC90aD4KKyAgICAgICAgPHRoPk91dCBJbnRlcmVzdHM8L3RoPgorICAgICAgICA8dGg+SW4gRGF0YTwvdGg+CisgICAgICAgIDx0aD5PdXQgRGF0YTwvdGg+CisgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAgICAgPHRyIGNsYXNzPSJjZW50ZXIiPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJuZmQ6bmZkSWQiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDp2ZXJzaW9uIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmb3JtYXREYXRlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0iZGF0ZSIgc2VsZWN0PSJuZmQ6c3RhcnRUaW1lIiAvPjwveHNsOmNhbGwtdGVtcGxhdGU+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmb3JtYXREYXRlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0iZGF0ZSIgc2VsZWN0PSJuZmQ6Y3VycmVudFRpbWUiIC8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48L3RkPgorICAgICAgICA8dGQ+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImZvcm1hdER1cmF0aW9uIj48eHNsOndpdGgtcGFyYW0gbmFtZT0iZHVyYXRpb24iIHNlbGVjdD0ibmZkOnVwdGltZSIgLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOm5OYW1lVHJlZUVudHJpZXMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpuRmliRW50cmllcyIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOm5QaXRFbnRyaWVzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuZmQ6bk1lYXN1cmVtZW50c0VudHJpZXMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpuQ3NFbnRyaWVzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuZmQ6cGFja2V0Q291bnRlcnMvbmZkOmluY29taW5nUGFja2V0cy9uZmQ6bkludGVyZXN0cyIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOnBhY2tldENvdW50ZXJzL25mZDpvdXRnb2luZ1BhY2tldHMvbmZkOm5JbnRlcmVzdHMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpwYWNrZXRDb3VudGVycy9uZmQ6aW5jb21pbmdQYWNrZXRzL25mZDpuRGF0YXMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpwYWNrZXRDb3VudGVycy9uZmQ6b3V0Z29pbmdQYWNrZXRzL25mZDpuRGF0YXMiLz48L3RkPgorICAgICAgPC90cj4KKyAgICA8L3Rib2R5PgorICA8L3RhYmxlPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5mZDpjaGFubmVscyI+CisgIDxoMj5DaGFubmVsczwvaDI+CisgIDx0YWJsZSBjbGFzcz0iaXRlbS1saXN0Ij4KKyAgICA8dGhlYWQ+CisgICAgICA8dHI+CisgICAgICAgIDx0aD5DaGFubmVsIFVSSTwvdGg+CisgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpjaGFubmVsIj4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdHlsZSI+CisgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDEiPgorICAgICAgICAgICAgICA8eHNsOnRleHQ+b2RkPC94c2w6dGV4dD4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5ldmVuPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgIDx0ciBjbGFzcz0ieyRzdHlsZX0iPgorICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOmxvY2FsVXJpIi8+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvdGJvZHk+CisgIDwvdGFibGU+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmZkOmZhY2VzIj4KKyAgPGgyPkZhY2VzPC9oMj4KKyAgPHRhYmxlIGNsYXNzPSJpdGVtLWxpc3QiPgorICAgIDx0aGVhZD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPkZhY2UgSUQ8L3RoPgorICAgICAgICA8dGg+UmVtb3RlIFVSSTwvdGg+CisgICAgICAgIDx0aD5Mb2NhbCBVUkk8L3RoPgorICAgICAgICA8dGg+U2NvcGU8L3RoPgorICAgICAgICA8dGg+UGVyc2lzdGVuY3k8L3RoPgorICAgICAgICA8dGg+TGlua1R5cGU8L3RoPgorICAgICAgICA8dGg+RXhwaXJlcyBpbjwvdGg+CisgICAgICAgIDx0aD5JbiBJbnRlcmVzdHM8L3RoPgorICAgICAgICA8dGg+SW4gRGF0YTwvdGg+CisgICAgICAgIDx0aD5JbiBCeXRlczwvdGg+CisgICAgICAgIDx0aD5PdXQgSW50ZXJlc3RzPC90aD4KKyAgICAgICAgPHRoPk91dCBEYXRhPC90aD4KKyAgICAgICAgPHRoPk91dCBCeXRlczwvdGg+CisgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpmYWNlIj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3R5bGUiPgorICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDEiPgorICAgICAgICAgICAgPHhzbDp0ZXh0Pm9kZDwveHNsOnRleHQ+CisgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICA8eHNsOm90aGVyd2lzZT5ldmVuPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgIDx0ciBjbGFzcz0ieyRzdHlsZX0iPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpmYWNlSWQiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpyZW1vdGVVcmkiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpsb2NhbFVyaSIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOmZhY2VTY29wZSIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOmZhY2VQZXJzaXN0ZW5jeSIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOmxpbmtUeXBlIi8+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5mZDpleHBpcmF0aW9uUGVyaW9kIj4KKyAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImZvcm1hdER1cmF0aW9uIj48eHNsOndpdGgtcGFyYW0gbmFtZT0iZHVyYXRpb24iIHNlbGVjdD0ibmZkOmV4cGlyYXRpb25QZXJpb2QiIC8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgTmV2ZXIKKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOnBhY2tldENvdW50ZXJzL25mZDppbmNvbWluZ1BhY2tldHMvbmZkOm5JbnRlcmVzdHMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpwYWNrZXRDb3VudGVycy9uZmQ6aW5jb21pbmdQYWNrZXRzL25mZDpuRGF0YXMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpieXRlQ291bnRlcnMvbmZkOmluY29taW5nQnl0ZXMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpwYWNrZXRDb3VudGVycy9uZmQ6b3V0Z29pbmdQYWNrZXRzL25mZDpuSW50ZXJlc3RzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuZmQ6cGFja2V0Q291bnRlcnMvbmZkOm91dGdvaW5nUGFja2V0cy9uZmQ6bkRhdGFzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuZmQ6Ynl0ZUNvdW50ZXJzL25mZDpvdXRnb2luZ0J5dGVzIi8+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3Rib2R5PgorICA8L3RhYmxlPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5mZDpmaWIiPgorICA8aDI+RklCPC9oMj4KKyAgPHRhYmxlIGNsYXNzPSJpdGVtLWxpc3QiPgorICAgIDx0aGVhZD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHdpZHRoPSIyMCUiPlByZWZpeDwvdGg+CisgICAgICAgIDx0aD5OZXh0SG9wczwvdGg+CisgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpmaWJFbnRyeSI+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3R5bGUiPgorICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAxIj4KKyAgICAgICAgICAgICAgPHhzbDp0ZXh0Pm9kZDwveHNsOnRleHQ+CisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+ZXZlbjwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICA8dHIgY2xhc3M9Inskc3R5bGV9Ij4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7dmVydGljYWwtYWxpZ246dG9wO3BhZGRpbmc6MCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpwcmVmaXgiLz48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpdGVtLXN1Ymxpc3QiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+RmFjZUlkPC90aD4KKyAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpuZXh0SG9wcy9uZmQ6bmV4dEhvcCI+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuZmQ6ZmFjZUlkIi8+PC90ZD4KKyAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+Q29zdDwvdGg+CisgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJuZmQ6bmV4dEhvcHMvbmZkOm5leHRIb3AiPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmZkOmNvc3QiLz48L3RkPgorICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3Rib2R5PgorICA8L3RhYmxlPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5mZDpyaWIiPgorICA8aDI+UklCPC9oMj4KKyAgPHRhYmxlIGNsYXNzPSJpdGVtLWxpc3QiPgorICAgIDx0aGVhZD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHdpZHRoPSIyMCUiPlByZWZpeDwvdGg+CisgICAgICAgIDx0aD5Sb3V0ZXM8L3RoPgorICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorICAgIDx0Ym9keT4KKyAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJuZmQ6cmliRW50cnkiPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIj4KKyAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+CisgICAgICAgICAgICAgIDx4c2w6dGV4dD5vZGQ8L3hzbDp0ZXh0PgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPmV2ZW48L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgPHRyIGNsYXNzPSJ7JHN0eWxlfSI+CisgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0O3ZlcnRpY2FsLWFsaWduOnRvcDtwYWRkaW5nOjAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuZmQ6cHJlZml4Ii8+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaXRlbS1zdWJsaXN0Ij4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPkZhY2VJZDwvdGg+CisgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJuZmQ6cm91dGVzL25mZDpyb3V0ZSI+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuZmQ6ZmFjZUlkIi8+PC90ZD4KKyAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+T3JpZ2luPC90aD4KKyAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpyb3V0ZXMvbmZkOnJvdXRlIj4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpvcmlnaW4iLz48L3RkPgorICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5Db3N0PC90aD4KKyAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpyb3V0ZXMvbmZkOnJvdXRlIj4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpjb3N0Ii8+PC90ZD4KKyAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+Q2hpbGRJbmhlcml0PC90aD4KKyAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpyb3V0ZXMvbmZkOnJvdXRlIj4KKyAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5mZDpmbGFncy9uZmQ6Y2hpbGRJbmhlcml0Ij4KKyAgICAgICAgICAgICAgICAgICAgWQorICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+UmliQ2FwdHVyZTwvdGg+CisgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJuZmQ6cm91dGVzL25mZDpyb3V0ZSI+CisgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJuZmQ6ZmxhZ3MvbmZkOnJpYkNhcHR1cmUiPgorICAgICAgICAgICAgICAgICAgICBZCisgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5FeHBpcmVzIGluPC90aD4KKyAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5mZDpyb3V0ZXMvbmZkOnJvdXRlIj4KKyAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5mZDpleHBpcmF0aW9uUGVyaW9kIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZm9ybWF0RHVyYXRpb24iPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkdXJhdGlvbiIgc2VsZWN0PSJuZmQ6ZXhwaXJhdGlvblBlcmlvZCIgLz48L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgICBOZXZlcgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC90Ym9keT4KKyAgPC90YWJsZT4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJuZmQ6c3RyYXRlZ3lDaG9pY2VzIj4KKyAgPGgyPlN0cmF0ZWd5IENob2ljZXM8L2gyPgorICA8dGFibGUgY2xhc3M9Iml0ZW0tbGlzdCI+CisgICAgPHRoZWFkPgorICAgICAgPHRyPgorICAgICAgICA8dGggd2lkdGg9IjIwJSI+TmFtZXNwYWNlPC90aD4KKyAgICAgICAgPHRoPlN0cmF0ZWd5IE5hbWU8L3RoPgorICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorICAgIDx0Ym9keT4KKyAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJuZmQ6c3RyYXRlZ3lDaG9pY2UiPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpuYW1lc3BhY2UiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5mZDpzdHJhdGVneS9uZmQ6bmFtZSIvPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC90Ym9keT4KKyAgPC90YWJsZT4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvTkZEL3Rvb2xzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXItZmlsZXMvcmVzZXQuY3NzIGIvTkZEL3Rvb2xzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXItZmlsZXMvcmVzZXQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjdjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmZkLXN0YXR1cy1odHRwLXNlcnZlci1maWxlcy9yZXNldC5jc3MKQEAgLTAsMCArMSwyMDcgQEAKKy8qIGBYSFRNTCwgSFRNTDQsIEhUTUw1IFJlc2V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworYSwKK2FiYnIsCithY3JvbnltLAorYWRkcmVzcywKK2FwcGxldCwKK2FydGljbGUsCithc2lkZSwKK2F1ZGlvLAorYiwKK2JpZywKK2Jsb2NrcXVvdGUsCitib2R5LAorY2FudmFzLAorY2FwdGlvbiwKK2NlbnRlciwKK2NpdGUsCitjb2RlLAorZGQsCitkZWwsCitkZXRhaWxzLAorZGZuLAorZGlhbG9nLAorZGl2LAorZGwsCitkdCwKK2VtLAorZW1iZWQsCitmaWVsZHNldCwKK2ZpZ2NhcHRpb24sCitmaWd1cmUsCitmb250LAorZm9vdGVyLAorZm9ybSwKK2gxLAoraDIsCitoMywKK2g0LAoraDUsCitoNiwKK2hlYWRlciwKK2hncm91cCwKK2hyLAoraHRtbCwKK2ksCitpZnJhbWUsCitpbWcsCitpbnMsCitrYmQsCitsYWJlbCwKK2xlZ2VuZCwKK2xpLAorbWFyaywKK21lbnUsCittZXRlciwKK25hdiwKK29iamVjdCwKK29sLAorb3V0cHV0LAorcCwKK3ByZSwKK3Byb2dyZXNzLAorcSwKK3JwLAorcnQsCitydWJ5LAorcywKK3NhbXAsCitzZWN0aW9uLAorc21hbGwsCitzcGFuLAorc3RyaWtlLAorc3Ryb25nLAorc3ViLAorc3VtbWFyeSwKK3N1cCwKK3RhYmxlLAordGJvZHksCit0ZCwKK3Rmb290LAordGgsCit0aGVhZCwKK3RpbWUsCit0ciwKK3R0LAordSwKK3VsLAordmFyLAordmlkZW8sCit4bXAgeworICBib3JkZXI6IDA7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMDsKKyAgZm9udC1zaXplOiAxMDAlOworfQorCitodG1sLAorYm9keSB7CisgIGhlaWdodDogMTAwJTsKK30KKworYXJ0aWNsZSwKK2FzaWRlLAorZGV0YWlscywKK2ZpZ2NhcHRpb24sCitmaWd1cmUsCitmb290ZXIsCitoZWFkZXIsCitoZ3JvdXAsCittZW51LAorbmF2LAorc2VjdGlvbiB7CisvKgorICBPdmVycmlkZSB0aGUgZGVmYXVsdCAoZGlzcGxheTogaW5saW5lKSBmb3IKKyAgYnJvd3NlcnMgdGhhdCBkbyBub3QgcmVjb2duaXplIEhUTUw1IHRhZ3MuCisKKyAgSUU4IChhbmQgbG93ZXIpIHJlcXVpcmVzIGEgc2hpdjoKKyAgaHR0cDovL2Vqb2huLm9yZy9ibG9nL2h0bWw1LXNoaXYKKyovCisgIGRpc3BsYXk6IGJsb2NrOworfQorCitiLAorc3Ryb25nIHsKKy8qCisgIE1ha2VzIGJyb3dzZXJzIGFncmVlLgorICBJRSArIE9wZXJhID0gZm9udC13ZWlnaHQ6IGJvbGQuCisgIEdlY2tvICsgV2ViS2l0ID0gZm9udC13ZWlnaHQ6IGJvbGRlci4KKyovCisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitpbWcgeworICBjb2xvcjogdHJhbnNwYXJlbnQ7CisgIGZvbnQtc2l6ZTogMDsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKy8qCisgIEZvciBJRS4KKyAgaHR0cDovL2Nzcy10cmlja3MuY29tL2llLWZpeC1iaWN1YmljLXNjYWxpbmctZm9yLWltYWdlcworKi8KKyAgLW1zLWludGVycG9sYXRpb24tbW9kZTogYmljdWJpYzsKK30KKworbGkgeworLyoKKyAgRm9yIElFNiArIElFNzoKKworICAiZGlzcGxheTogbGlzdC1pdGVtIiBrZWVwcyBidWxsZXRzIGZyb20KKyAgZGlzYXBwZWFyaW5nIGlmIGhhc0xheW91dCBpcyB0cmlnZ2VyZWQuCisqLworICBkaXNwbGF5OiBsaXN0LWl0ZW07CisgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKK3RhYmxlIHsKKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgYm9yZGVyLXNwYWNpbmc6IDA7Cit9CisKK3RoLAordGQsCitjYXB0aW9uIHsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworcSB7CisgIHF1b3Rlczogbm9uZTsKK30KKworcTpiZWZvcmUsCitxOmFmdGVyIHsKKyAgY29udGVudDogJyc7CisgIGNvbnRlbnQ6IG5vbmU7Cit9CisKK3N1YiwKK3N1cCwKK3NtYWxsIHsKKyAgZm9udC1zaXplOiA3NSU7Cit9CisKK3N1YiwKK3N1cCB7CisgIGxpbmUtaGVpZ2h0OiAwOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKK30KKworc3ViIHsKKyAgYm90dG9tOiAtMC4yNWVtOworfQorCitzdXAgeworICB0b3A6IC0wLjVlbTsKK30KKworc3ZnIHsKKy8qCisgIEZvciBJRTkuIFdpdGhvdXQsIG9jY2FzaW9uYWxseSBkcmF3cyBzaGFwZXMKKyAgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZiA8c3ZnPiByZWN0YW5nbGUuCisqLworICBvdmVyZmxvdzogaGlkZGVuOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL05GRC90b29scy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLWZpbGVzL3JvYm90cy50eHQgYi9ORkQvdG9vbHMvbmZkLXN0YXR1cy1odHRwLXNlcnZlci1maWxlcy9yb2JvdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTM3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmZkLXN0YXR1cy1odHRwLXNlcnZlci1maWxlcy9yb2JvdHMudHh0CkBAIC0wLDAgKzEsMiBAQAorVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC8KZGlmZiAtLWdpdCBhL05GRC90b29scy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLWZpbGVzL3N0eWxlLmNzcyBiL05GRC90b29scy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLWZpbGVzL3N0eWxlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZkYTgzCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rvb2xzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXItZmlsZXMvc3R5bGUuY3NzCkBAIC0wLDAgKzEsMTgzIEBACitAaW1wb3J0ICdyZXNldC5jc3MnOworQGltcG9ydCAndGV4dC5jc3MnOworCitAY2hhcnNldCAidXRmLTgiOworCitib2R5IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworfQorCitsaSB7CisgICAgbWFyZ2luOiAwOworfQorCitoZWFkZXIsIG5hdiwgYXJ0aWNsZSwgZm9vdGVyLCBhZGRyZXNzIHsKKyAgICBkaXNwbGF5OiBibG9jazsKK30KKworaGVhZGVyIHsKKyAgICBtYXJnaW46IDIwcHg7CisgICAgd2lkdGg6IDkwJTsKK30KKworaGVhZGVyIGgxIHsKKyAgICBoZWlnaHQ6IDUwcHg7CisgICAgcGFkZGluZy1sZWZ0OiA1NXB4OworICAgIHBhZGRpbmctdG9wOiA2cHg7Cit9CisKK2FydGljbGUgeworICAgIG1hcmdpbjogMjBweCBhdXRvIDIwcHg7CisgICAgd2lkdGg6IDkwJTsKKyAgICBwYWRkaW5nLWJvdHRvbTogMjBweDsKK30KKworZm9vdGVyIHsKKyAgICBtYXJnaW46IDIwcHggYXV0byAwOworICAgIHdpZHRoOiA5MCU7CisKKyAgICBwYWRkaW5nLWJvdHRvbTogMnB4OworICAgIHRleHQtYWxpZ246IHJpZ2h0OworCisgICAgcG9zaXRpb246IGZpeGVkOworICAgIGZvbnQtaGVpZ2h0OiAxMHB4OworICAgIGJvdHRvbTogMDsKKyAgICBsZWZ0OiA1JTsKK30KKworaDEgeworICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworfQorCitoMyB7CisgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Cit9CisKK2g1IHsKKyAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgICBjb2xvcjogIzcyNzI3MjsKK30KKworLyogTUlTQyAqLworLmdyZXkgeworICAgIGNvbG9yOiAjNzI3MjcyOworICAgIGZvbnQtd2VpZ2h0OiAyMDA7Cit9CisKKy5ncmVlbiB7CisgICAgY29sb3I6ICMyRDlBNjU7CisgICAgZm9udC13ZWlnaHQ6IDIwMDsKK30KKworLnJlZCB7CisgICAgY29sb3I6IHJlZDsKKyAgICBmb250LXdlaWdodDogMjAwOworICAgIGZvbnQtc2l6ZTogMi40ZW07Cit9CisKKy5oaWRkZW4geworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKy8qICovCisuaXRlbS1saXN0Cit7CisgICAgYm9yZGVyLXJhZGl1czogNnB4OworCisgICAgbWFyZ2luLXRvcDogMTBweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICAgIHdpZHRoOiAxMDAlOworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKy5pdGVtLWxpc3QgdGgKK3sKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIHBhZGRpbmc6IDhweDsKKyAgICBiYWNrZ3JvdW5kOiAjRUFGNEVGOworICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjOTlDQ0IyOworICAgIGNvbG9yOiAjNzI3MjcyOworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKy5pdGVtLWxpc3QgdGguYm9yZGVyLWxlZnQgeworfQorCisuaXRlbS1saXN0IHRkCit7CisgICAgcGFkZGluZzogMnB4OworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmOworICAgIGNvbG9yOiAjMDAwOworICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKK30KKworLml0ZW0tc3VibGlzdAoreworICAgIGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKKyAgICBib3JkZXI6MXB4IHNvbGlkIGdyYXk7CisKKyAgICBwYWRkaW5nOiA0cHg7CisgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5pdGVtLXN1Ymxpc3QgdGgKK3sKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nOiA0cHg7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworCisgICAgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOworICAgIGJvcmRlcjoxcHggc29saWQgZ3JheTsKK30KKworLml0ZW0tc3VibGlzdCB0aC5ib3JkZXItbGVmdCB7Cit9CisKKy5pdGVtLXN1Ymxpc3QgdGQKK3sKKyAgICBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7CisgICAgYm9yZGVyOjFweCBzb2xpZCBncmF5OworCisgICAgcGFkZGluZzogMnB4OworICAgIGNvbG9yOiAjMDAwOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBtaW4td2lkdGg6IDIwcHg7Cit9CisKKwordHIuY2VudGVyIHRkCit7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisuYm9yZGVyLWxlZnQgeworICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzk5Q0NCMjsKK30KKworLmJvcmRlci1yaWdodCB7CisgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzk5Q0NCMjsKK30KKwordGZvb3QgeworICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjOTlDQ0IyOworICAgIGJhY2tncm91bmQ6ICNFQUY0RUY7Cit9CisKKy5pdGVtLWxpc3QgdGZvb3QgdGQgeworICAgIHBhZGRpbmc6IDA7Cit9CisKKy5vZGQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7Cit9CisKKy5oaWdobGlnaHRlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKKyAgICBjdXJzb3I6IHBvaW50ZXI7Cit9CmRpZmYgLS1naXQgYS9ORkQvdG9vbHMvbmZkLXN0YXR1cy1odHRwLXNlcnZlci1maWxlcy90ZXh0LmNzcyBiL05GRC90b29scy9uZmQtc3RhdHVzLWh0dHAtc2VydmVyLWZpbGVzL3RleHQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmZkLXN0YXR1cy1odHRwLXNlcnZlci1maWxlcy90ZXh0LmNzcwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAgOTYwIEdyaWQgU3lzdGVtIH4gVGV4dCBDU1MuCisgIExlYXJuIG1vcmUgfiBodHRwOi8vOTYwLmdzLworCisgIExpY2Vuc2VkIHVuZGVyIEdQTCBhbmQgTUlULgorKi8KKworLyogYEJhc2ljIEhUTUwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitib2R5IHsKKyAgICBmb250OiAxM3B4IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CisKK2hyIHsKKyAgYm9yZGVyOiAwICNjY2Mgc29saWQ7CisgIGJvcmRlci10b3Atd2lkdGg6IDFweDsKKyAgY2xlYXI6IGJvdGg7CisgIGhlaWdodDogMDsKK30KKworLyogYEhlYWRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDEgeworCWZvbnQtc2l6ZTogMi40ZW07Cit9CisKK2gyIHsKKwlmb250LXNpemU6IDEuOGVtOworfQorCitoMyB7CisJZm9udC1zaXplOiAxLjRlbTsKK30KKworLyogaDEgeyAqLworLyogICBmb250LXNpemU6IDI1cHg7ICovCisvKiB9ICovCisKKy8qIGgyIHsgKi8KKy8qICAgZm9udC1zaXplOiAyM3B4OyAqLworLyogfSAqLworCisvKiBoMyB7ICovCisvKiAgIGZvbnQtc2l6ZTogMjFweDsgKi8KKy8qIH0gKi8KKworaDQgeworICBmb250LXNpemU6IDE5cHg7Cit9CisKK2g1IHsKKyAgZm9udC1zaXplOiAxN3B4OworfQorCitoNiB7CisgIGZvbnQtc2l6ZTogMTVweDsKK30KKworLyogYFNwYWNpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBvbCB7ICovCisvKiAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7ICovCisvKiB9ICovCisKKy8qIHVsIHsgKi8KKy8qICAgbGlzdC1zdHlsZTogZGlzYzsgKi8KKy8qIH0gKi8KKworLyogbGkgeyAqLworLyogICBtYXJnaW4tbGVmdDogMzBweDsgKi8KKy8qIH0gKi8KKworcCwKK2RsLAoraHIsCitoMSwKK2gyLAoraDMsCitoNCwKK2g1LAoraDYsCitvbCwKK3VsLAorcHJlLAordGFibGUsCithZGRyZXNzLAorZmllbGRzZXQsCitmaWd1cmUgeworICBtYXJnaW4tYm90dG9tOiAxMHB4OworfQorCitwcmUgeworICAgIC8qIHBhZGRpbmc6IDBweCAyNHB4OyAqLworICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjlGOUY5OworICAgIGJvcmRlcjogMXB4IGRhc2hlZCAjMkY2RkFCOworICAgIGNvbG9yOiBibGFjazsKKyAgICBwYWRkaW5nOiAxZW07CisgICAgZm9udC1zaXplOiAxM3B4OworfQorY29kZSB7CisgICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIEFuZGFsZSBNb25vLCBtb25vc3BhY2U7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTkZEL3Rvb2xzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXIucHkgYi9ORkQvdG9vbHMvbmZkLXN0YXR1cy1odHRwLXNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDM0ZDczCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3Rvb2xzL25mZC1zdGF0dXMtaHR0cC1zZXJ2ZXIucHkKQEAgLTAsMCArMSwxOTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjIuNworIyAtKi0gTW9kZTogcHl0aG9uOyBweS1pbmRlbnQtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGNvZGluZzogdXRmLTg7IC0qLQorCisiIiIKK0NvcHlyaWdodCAoYykgMjAxNCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICAgICAgICAgICAgICAgICAgICBBcml6b25hIEJvYXJkIG9mIFJlZ2VudHMsCisgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgICAgICAgICAgICAgICAgICAgIFdhc2hpbmd0b24gVW5pdmVyc2l0eSBpbiBTdC4gTG91aXMsCisgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKworTkZEIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCitvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOword2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK05GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIiIiCisKK2Zyb20gQmFzZUhUVFBTZXJ2ZXIgaW1wb3J0IEhUVFBTZXJ2ZXIKK2Zyb20gU2ltcGxlSFRUUFNlcnZlciBpbXBvcnQgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCitmcm9tIFNvY2tldFNlcnZlciBpbXBvcnQgVGhyZWFkaW5nTWl4SW4KK2ltcG9ydCBzeXMKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCB1cmxwYXJzZQoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBjZ2kKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IG9zCisKKworY2xhc3MgU3RhdHVzSGFuZGxlcihTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICIiIiBUaGUgaGFuZGxlciBjbGFzcyB0byBoYW5kbGUgcmVxdWVzdHMuIiIiCisgICAgZGVmIGRvX0dFVChzZWxmKToKKyAgICAgICAgIyBnZXQgdGhlIHVybCBpbmZvIHRvIGRlY2lkZSBob3cgdG8gcmVzcG9uZAorICAgICAgICBwYXJzZWRQYXRoID0gdXJscGFyc2UudXJscGFyc2Uoc2VsZi5wYXRoKQorICAgICAgICBpZiBwYXJzZWRQYXRoLnBhdGggPT0gIi8iOgorICAgICAgICAgICAgIyBnZXQgY3VycmVudCBuZmQgc3RhdHVzLCBhbmQgdXNlIGl0IGFzIHJlc3VsdCBtZXNzYWdlCisgICAgICAgICAgICAocmVzLCByZXN1bHRNZXNzYWdlKSA9IHNlbGYuZ2V0TmZkU3RhdHVzKCkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICBpZiByZXMgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9odG1sOyBjaGFyc2V0PVVURi04IikKKworICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKHJlc3VsdE1lc3NhZ2UpCisgICAgICAgIGVsaWYgcGFyc2VkUGF0aC5wYXRoID09ICIvcm9ib3RzLnR4dCIgYW5kIHNlbGYuc2VydmVyLnJvYm90cyA9PSBUcnVlOgorICAgICAgICAgICAgcmVzdWx0TWVzc2FnZSA9ICIiCisgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC10eXBlIiwgInRleHQvcGxhaW4iKQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKHJlc3VsdE1lc3NhZ2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIuZG9fR0VUKHNlbGYpCisKKyAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgZm9ybWF0LCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuc2VydmVyLnZlcmJvc2U6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIiVzIC0gJXNcbiIgJSAoc2VsZi5hZGRyZXNzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICUgYXJncykpCisKKyAgICBkZWYgZ2V0TmZkU3RhdHVzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0byBjYWxsIG5mZC1zdGF0dXMgY29tbWFuZAorICAgICAgICB0byBnZXQgeG1sIGZvcm1hdCBvdXRwdXQKKyAgICAgICAgIiIiCisgICAgICAgIHNwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ25mZC1zdGF0dXMnLCAnLXgnXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgY2xvc2VfZmRzPVRydWUpCisgICAgICAgIG91dHB1dCA9IHNwLmNvbW11bmljYXRlKClbMF0KKyAgICAgICAgaWYgc3AucmV0dXJuY29kZSA9PSAwOgorICAgICAgICAgICAgIyBhZGQgdGhlIHhtbC1zdHlsZXNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIDFzdCAnPicgc3ltYm9sCisgICAgICAgICAgICBuZXdMaW5lSW5kZXggPSBvdXRwdXQuaW5kZXgoJz4nKSArIDEKKyAgICAgICAgICAgIHJlc3VsdFN0ciA9IG91dHB1dFs6bmV3TGluZUluZGV4XVwKKyAgICAgICAgICAgICAgICAgICAgICArICI8P3htbC1zdHlsZXNoZWV0IHR5cGU9XCJ0ZXh0L3hzbFwiIGhyZWY9XCJuZmQtc3RhdHVzLnhzbFwiPz4iXAorICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0W25ld0xpbmVJbmRleDpdCisgICAgICAgICAgICByZXR1cm4gKHNwLnJldHVybmNvZGUsIHJlc3VsdFN0cikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGh0bWxTdHIgPSAnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsJ1wKKyAgICAgICAgICAgICAgICAgICAgKyAnLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+XG4nXAorICAgICAgICAgICAgICAgICAgICArICc8aHRtbD48aGVhZD48dGl0bGU+TkZEIHN0YXR1czwvdGl0bGU+J1wKKyAgICAgICAgICAgICAgICAgICAgKyAnPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7J1wKKyAgICAgICAgICAgICAgICAgICAgKyAnY2hhcnNldD1VVEYtOCI+PC9oZWFkPlxuPGJvZHk+JworICAgICAgICAgICAgIyByZXR1cm4gY29ubmVjdGlvbiBlcnJvciBjb2RlCisgICAgICAgICAgICBodG1sU3RyID0gaHRtbFN0ciArICI8cD5DYW5ub3QgY29ubmVjdCB0byBORkQsIlwKKyAgICAgICAgICAgICAgICAgICAgKyAiIENvZGUgPSAiICsgc3RyKHNwLnJldHVybmNvZGUpICsgIjwvcD5cbiIKKyAgICAgICAgICAgIGh0bWxTdHIgPSBodG1sU3RyICsgIjwvYm9keT48L2h0bWw+IgorICAgICAgICAgICAgcmV0dXJuIChzcC5yZXR1cm5jb2RlLCBodG1sU3RyKQorCitjbGFzcyBUaHJlYWRIdHRwU2VydmVyKFRocmVhZGluZ01peEluLCBIVFRQU2VydmVyKToKKyAgICAiIiIgSGFuZGxlIHJlcXVlc3RzIHVzaW5nIHRocmVhZHMgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgaGFuZGxlciwgdmVyYm9zZT1GYWxzZSwgcm9ib3RzPUZhbHNlKToKKyAgICAgICAgc2VydmVyQWRkciA9IHNlcnZlclswXQorICAgICAgICAjIHNvY2tldC5BRl9VTlNQRUMgaXMgbm90IHN1cHBvcnRlZCwgY2hlY2sgd2hldGhlciBpdCBpcyB2NiBvciB2NAorICAgICAgICBpcFR5cGUgPSBzZWxmLmdldElwVHlwZShzZXJ2ZXJBZGRyKQorICAgICAgICBpZiBpcFR5cGUgPT0gc29ja2V0LkFGX0lORVQ2OgorICAgICAgICAgICAgc2VsZi5hZGRyZXNzX2ZhbWlseSA9IHNvY2tldC5BRl9JTkVUNgorICAgICAgICBlbGlmIGlwVHlwZSA9PSBzb2NrZXQuQUZfSU5FVDoKKyAgICAgICAgICAgIHNlbGYuYWRkcmVzc19mYW1pbHkgPT0gc29ja2V0LkFGX0lORVQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIlRoZSBpbnB1dCBJUCBhZGRyZXNzIGlzIG5laXRoZXIgSVB2NiBub3IgSVB2NCIpCisgICAgICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEhUVFBTZXJ2ZXIuX19pbml0X18oc2VsZiwgc2VydmVyLCBoYW5kbGVyKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBsb2dnaW5nLmVycm9yKHN0cihlKSkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5yb2JvdHMgPSByb2JvdHMKKworICAgIGRlZiBnZXRJcFR5cGUoc2VsZiwgaXBBZGRyKToKKyAgICAgICAgIiIiIEdldCBpcEFkZHIncyBhZGRyZXNzIHR5cGUgIiIiCisgICAgICAgICMgaWYgaXBBZGRyIGlzIGFuIElQdjYgYWRkciwgcmV0dXJuIEFGX0lORVQ2CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2tldC5pbmV0X3B0b24oc29ja2V0LkFGX0lORVQ2LCBpcEFkZHIpCisgICAgICAgICAgICByZXR1cm4gc29ja2V0LkFGX0lORVQ2CisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgaWYgaXBBZGRyIGlzIGFuIElQdjQgYWRkciByZXR1cm4gQUZfSU5FVCwgaWYgbm90LCByZXR1cm4gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb2NrZXQuaW5ldF9wdG9uKHNvY2tldC5BRl9JTkVULCBpcEFkZHIpCisgICAgICAgICAgICByZXR1cm4gc29ja2V0LkFGX0lORVQKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKworIyBtYWluIGZ1bmN0aW9uIHRvIHN0YXJ0CitkZWYgaHR0cFNlcnZlcigpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItcCIsIHR5cGU9aW50LCBtZXRhdmFyPSJwb3J0IG51bWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTcGVjaWZ5IHRoZSBIVFRQIHNlcnZlciBwb3J0IG51bWJlciwgZGVmYXVsdCBpcyA4MDgwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJwb3J0IiwgZGVmYXVsdD04MDgwKQorICAgICMgaWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgMTI3LjAuMC4xCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLWEiLCBkZWZhdWx0PSIxMjcuMC4wLjEiLCBtZXRhdmFyPSJJUCBhZGRyZXNzIiwgZGVzdD0iYWRkciIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTcGVjaWZ5IHRoZSBIVFRQIHNlcnZlciBJUCBhZGRyZXNzLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLXIiLCBkZWZhdWx0PUZhbHNlLCBkZXN0PSJyb2JvdHMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRW5hYmxlIEhUVFAgcm9ib3RzIHRvIGNyYXdsOyBkaXNhYmxlZCBieSBkZWZhdWx0LiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLWYiLCBkZWZhdWx0PSJAREFUQVJPT1RESVJAL25kbiIsIG1ldGF2YXI9IlNlcnZlciBEaXJlY3RvcnkiLCBkZXN0PSJzZXJ2ZXJEaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU3BlY2lmeSB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgbmZkLXN0YXR1cy1odHRwLXNlcnZlciwgZGVmYXVsdCBpcyBAREFUQVJPT1RESVJAL25kbi4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi12IiwgZGVmYXVsdD1GYWxzZSwgZGVzdD0idmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJWZXJib3NlIG1vZGUuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXZlcnNpb24iLCBkZWZhdWx0PUZhbHNlLCBkZXN0PSJ2ZXJzaW9uIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNob3cgdmVyc2lvbiBhbmQgZXhpdCIpCisKKyAgICBhcmdzID0gdmFycyhwYXJzZXIucGFyc2VfYXJncygpKQorCisgICAgaWYgYXJnc1sndmVyc2lvbiddOgorICAgICAgICBwcmludCAiQFZFUlNJT05AIgorICAgICAgICByZXR1cm4KKworICAgIGxvY2FsUG9ydCA9IGFyZ3NbInBvcnQiXQorICAgIGxvY2FsQWRkciA9IGFyZ3NbImFkZHIiXQorICAgIHZlcmJvc2UgPSBhcmdzWyJ2ZXJib3NlIl0KKyAgICByb2JvdHMgPSBhcmdzWyJyb2JvdHMiXQorICAgIHNlcnZlckRpcmVjdG9yeSA9IGFyZ3NbInNlcnZlckRpciJdCisKKyAgICBvcy5jaGRpcihzZXJ2ZXJEaXJlY3RvcnkpCisKKyAgICAjIHNldHRpbmcgbG9nIG1lc3NhZ2UgZm9ybWF0CisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhmb3JtYXQ9JyUoYXNjdGltZSlzIFslKGxldmVsbmFtZSlzXSAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD1sb2dnaW5nLklORk8pCisKKyAgICAjIGlmIHBvcnQgaXMgaW52YWxpZCwgZXhpdAorICAgIGlmIGxvY2FsUG9ydCA8PSAwIG9yIGxvY2FsUG9ydCA+IDY1NTM1OgorICAgICAgICBsb2dnaW5nLmVycm9yKCJTcGVjaWZpZWQgcG9ydCBudW1iZXIgaXMgaW52YWxpZCIpCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBodHRwZCA9IFRocmVhZEh0dHBTZXJ2ZXIoKGxvY2FsQWRkciwgbG9jYWxQb3J0KSwgU3RhdHVzSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSwgcm9ib3RzKQorICAgIGh0dHBTZXJ2ZXJBZGRyID0gIiIKKyAgICBpZiBodHRwZC5hZGRyZXNzX2ZhbWlseSA9PSBzb2NrZXQuQUZfSU5FVDY6CisgICAgICAgIGh0dHBTZXJ2ZXJBZGRyID0gImh0dHA6Ly9bJXNdOiVzIiAlIChodHRwZC5zZXJ2ZXJfYWRkcmVzc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBkLnNlcnZlcl9hZGRyZXNzWzFdKQorICAgIGVsc2U6CisgICAgICAgIGh0dHBTZXJ2ZXJBZGRyID0gImh0dHA6Ly8lczolcyIgJSAoaHR0cGQuc2VydmVyX2FkZHJlc3NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cGQuc2VydmVyX2FkZHJlc3NbMV0pCisKKyAgICBsb2dnaW5nLmluZm8oIlNlcnZlciBzdGFydGVkIC0gYXQgJXMiICUgaHR0cFNlcnZlckFkZHIpCisKKyAgICB0cnk6CisgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcGFzcworCisgICAgaHR0cGQuc2VydmVyX2Nsb3NlKCkKKworICAgIGxvZ2dpbmcuaW5mbygiU2VydmVyIHN0b3BwZWQiKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaHR0cFNlcnZlcigpCmRpZmYgLS1naXQgYS9ORkQvdG9vbHMvbmZkLXN0YXR1cy5jcHAgYi9ORkQvdG9vbHMvbmZkLXN0YXR1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhMzViZQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90b29scy9uZmQtc3RhdHVzLmNwcApAQCAtMCwwICsxLDkyNSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQGF1dGhvciBKZXJhbGQgUGF1bCBBYnJhaGFtIDxqZXJhbGRhYnJhaGFtQGVtYWlsLmFyaXpvbmEuZWR1PgorICovCisKKyNpbmNsdWRlICJ2ZXJzaW9uLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvZmFjZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9uYW1lLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L2ludGVyZXN0LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L2VuY29kaW5nL2J1ZmZlci1zdHJlYW0uaHBwPgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1mb3J3YXJkZXItc3RhdHVzLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWNoYW5uZWwtc3RhdHVzLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZhY2Utc3RhdHVzLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L21hbmFnZW1lbnQvbmZkLWZpYi1lbnRyeS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1yaWItZW50cnkuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtc3RyYXRlZ3ktY2hvaWNlLmhwcD4KKworI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcvcmVwbGFjZS5ocHA+CisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIG5kbiB7CisKK2NsYXNzIE5mZFN0YXR1cworeworcHVibGljOgorICBleHBsaWNpdAorICBOZmRTdGF0dXMoY2hhciogdG9vbE5hbWUpCisgICAgOiBtX3Rvb2xOYW1lKHRvb2xOYW1lKQorICAgICwgbV9uZWVkVmVyc2lvblJldHJpZXZhbChmYWxzZSkKKyAgICAsIG1fbmVlZENoYW5uZWxTdGF0dXNSZXRyaWV2YWwoZmFsc2UpCisgICAgLCBtX25lZWRGYWNlU3RhdHVzUmV0cmlldmFsKGZhbHNlKQorICAgICwgbV9uZWVkRmliRW51bWVyYXRpb25SZXRyaWV2YWwoZmFsc2UpCisgICAgLCBtX25lZWRSaWJTdGF0dXNSZXRyaWV2YWwoZmFsc2UpCisgICAgLCBtX25lZWRTdHJhdGVneUNob2ljZVJldHJpZXZhbChmYWxzZSkKKyAgICAsIG1faXNPdXRwdXRYbWwoZmFsc2UpCisgIHsKKyAgfQorCisgIHZvaWQKKyAgdXNhZ2UoKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJVc2FnZTogXG4gICIgPDwgbV90b29sTmFtZSA8PCAiIFtvcHRpb25zXVxuXG4iCisgICAgICAiU2hvdyBORkQgdmVyc2lvbiBhbmQgc3RhdHVzIGluZm9ybWF0aW9uXG5cbiIKKyAgICAgICJPcHRpb25zOlxuIgorICAgICAgIiAgWy1oXSAtIHByaW50IHRoaXMgaGVscCBtZXNzYWdlXG4iCisgICAgICAiICBbLXZdIC0gcmV0cmlldmUgdmVyc2lvbiBpbmZvcm1hdGlvblxuIgorICAgICAgIiAgWy1jXSAtIHJldHJpZXZlIGNoYW5uZWwgc3RhdHVzIGluZm9ybWF0aW9uXG4iCisgICAgICAiICBbLWZdIC0gcmV0cmlldmUgZmFjZSBzdGF0dXMgaW5mb3JtYXRpb25cbiIKKyAgICAgICIgIFstYl0gLSByZXRyaWV2ZSBGSUIgaW5mb3JtYXRpb25cbiIKKyAgICAgICIgIFstcl0gLSByZXRyaWV2ZSBSSUIgaW5mb3JtYXRpb25cbiIKKyAgICAgICIgIFstc10gLSByZXRyaWV2ZSBjb25maWd1cmVkIHN0cmF0ZWd5IGNob2ljZSBmb3IgTkROIG5hbWVzcGFjZXNcbiIKKyAgICAgICIgIFsteF0gLSBvdXRwdXQgTkZEIHN0YXR1cyBpbmZvcm1hdGlvbiBpbiBYTUwgZm9ybWF0XG4iCisgICAgICAiXG4iCisgICAgICAiICBbLVZdIC0gc2hvdyB2ZXJzaW9uIGluZm9ybWF0aW9uIG9mIG5mZC1zdGF0dXMgYW5kIGV4aXRcbiIKKyAgICAgICJcbiIKKyAgICAgICJJZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgYWxsIGluZm9ybWF0aW9uIGlzIHJldHJpZXZlZC5cbiIKKyAgICAgICJJZiAteCBpcyBwcm92aWRlZCwgb3RoZXIgb3B0aW9ucygtdiwgLWMsIGV0Yy4pIGFyZSBpZ25vcmVkLCBhbmQgYWxsIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgaW4gWE1MIGZvcm1hdC5cbiIKKyAgICAgIDsKKyAgfQorCisgIHZvaWQKKyAgZW5hYmxlVmVyc2lvblJldHJpZXZhbCgpCisgIHsKKyAgICBtX25lZWRWZXJzaW9uUmV0cmlldmFsID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQKKyAgZW5hYmxlQ2hhbm5lbFN0YXR1c1JldHJpZXZhbCgpCisgIHsKKyAgICBtX25lZWRDaGFubmVsU3RhdHVzUmV0cmlldmFsID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQKKyAgZW5hYmxlRmFjZVN0YXR1c1JldHJpZXZhbCgpCisgIHsKKyAgICBtX25lZWRGYWNlU3RhdHVzUmV0cmlldmFsID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQKKyAgZW5hYmxlRmliRW51bWVyYXRpb25SZXRyaWV2YWwoKQorICB7CisgICAgbV9uZWVkRmliRW51bWVyYXRpb25SZXRyaWV2YWwgPSB0cnVlOworICB9CisKKyAgdm9pZAorICBlbmFibGVTdHJhdGVneUNob2ljZVJldHJpZXZhbCgpCisgIHsKKyAgICBtX25lZWRTdHJhdGVneUNob2ljZVJldHJpZXZhbCA9IHRydWU7CisgIH0KKworICB2b2lkCisgIGVuYWJsZVJpYlN0YXR1c1JldHJpZXZhbCgpCisgIHsKKyAgICBtX25lZWRSaWJTdGF0dXNSZXRyaWV2YWwgPSB0cnVlOworICB9CisKKyAgdm9pZAorICBlbmFibGVYbWxPdXRwdXQoKQorICB7CisgICAgbV9pc091dHB1dFhtbCA9IHRydWU7CisgIH0KKworICB2b2lkCisgIG9uVGltZW91dCgpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlJlcXVlc3QgdGltZWQgb3V0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBydW5OZXh0U3RlcCgpOworICB9CisKKyAgdm9pZAorICBmZXRjaFNlZ21lbnRzKGNvbnN0IERhdGEmIGRhdGEsIHZvaWQgKE5mZFN0YXR1czo6Km9uRG9uZSkoKSkKKyAgeworICAgIG1fYnVmZmVyLT53cml0ZSgoY29uc3QgY2hhciopZGF0YS5nZXRDb250ZW50KCkudmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRDb250ZW50KCkudmFsdWVfc2l6ZSgpKTsKKworICAgIHVpbnQ2NF90IGN1cnJlbnRTZWdtZW50ID0gZGF0YS5nZXROYW1lKCkuZ2V0KC0xKS50b1NlZ21lbnQoKTsKKworICAgIGNvbnN0IG5hbWU6OkNvbXBvbmVudCYgZmluYWxCbG9ja0lkID0gZGF0YS5nZXRNZXRhSW5mbygpLmdldEZpbmFsQmxvY2tJZCgpOworICAgIGlmIChmaW5hbEJsb2NrSWQuZW1wdHkoKSB8fAorICAgICAgICBmaW5hbEJsb2NrSWQudG9TZWdtZW50KCkgPiBjdXJyZW50U2VnbWVudCkKKyAgICAgIHsKKyAgICAgICAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChkYXRhLmdldE5hbWUoKS5nZXRQcmVmaXgoLTEpLmFwcGVuZFNlZ21lbnQoY3VycmVudFNlZ21lbnQrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkU3RhdHVzOjpmZXRjaFNlZ21lbnRzLCB0aGlzLCBfMiwgb25Eb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRTdGF0dXM6Om9uVGltZW91dCwgdGhpcykpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLT4qb25Eb25lKSgpOworICAgICAgfQorICB9CisKKyAgdm9pZAorICBlc2NhcGVTcGVjaWFsQ2hhcmFjdGVycyhzdGQ6OnN0cmluZyAqZGF0YSkKKyAgeworICAgIHVzaW5nIGJvb3N0OjphbGdvcml0aG06OnJlcGxhY2VfYWxsOworICAgIHJlcGxhY2VfYWxsKCpkYXRhLCAiJiIsICAiJmFtcDsiKTsKKyAgICByZXBsYWNlX2FsbCgqZGF0YSwgIlwiIiwgIiZxdW90OyIpOworICAgIHJlcGxhY2VfYWxsKCpkYXRhLCAiXCciLCAiJmFwb3M7Iik7CisgICAgcmVwbGFjZV9hbGwoKmRhdGEsICI8IiwgICImbHQ7Iik7CisgICAgcmVwbGFjZV9hbGwoKmRhdGEsICI+IiwgICImZ3Q7Iik7CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICB2b2lkCisgIGZldGNoVmVyc2lvbkluZm9ybWF0aW9uKCkKKyAgeworICAgIEludGVyZXN0IGludGVyZXN0KCIvbG9jYWxob3N0L25mZC9zdGF0dXMiKTsKKyAgICBpbnRlcmVzdC5zZXRDaGlsZFNlbGVjdG9yKDEpOworICAgIGludGVyZXN0LnNldE11c3RCZUZyZXNoKHRydWUpOworICAgIG1fZmFjZS5leHByZXNzSW50ZXJlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZFN0YXR1czo6YWZ0ZXJGZXRjaGVkVmVyc2lvbkluZm9ybWF0aW9uLCB0aGlzLCBfMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRTdGF0dXM6Om9uVGltZW91dCwgdGhpcykpOworICB9CisKKyAgdm9pZAorICBhZnRlckZldGNoZWRWZXJzaW9uSW5mb3JtYXRpb24oY29uc3QgRGF0YSYgZGF0YSkKKyAgeworICAgIG5mZDo6Rm9yd2FyZGVyU3RhdHVzIHN0YXR1cyhkYXRhLmdldENvbnRlbnQoKSk7CisgICAgc3RkOjpzdHJpbmcgbmZkSWQ7CisgICAgaWYgKGRhdGEuZ2V0U2lnbmF0dXJlKCkuaGFzS2V5TG9jYXRvcigpKQorICAgICAgeworICAgICAgICBjb25zdCBuZG46OktleUxvY2F0b3ImIGxvY2F0b3IgPSBkYXRhLmdldFNpZ25hdHVyZSgpLmdldEtleUxvY2F0b3IoKTsKKyAgICAgICAgaWYgKGxvY2F0b3IuZ2V0VHlwZSgpID09IEtleUxvY2F0b3I6OktleUxvY2F0b3JfTmFtZSkKKyAgICAgICAgICBuZmRJZCA9IGxvY2F0b3IuZ2V0TmFtZSgpLnRvVXJpKCk7CisgICAgICAgIC8vdG9kbzogS2V5RGlnZXN0IHN1cHBvcnRpbmcKKyAgICAgIH0KKworICAgIGlmIChtX2lzT3V0cHV0WG1sKQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIjxnZW5lcmFsU3RhdHVzPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPG5mZElkPiIKKyAgICAgICAgICAgICAgICAgIDw8IG5mZElkIDw8ICI8L25mZElkPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPHZlcnNpb24+IgorICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzLmdldE5mZFZlcnNpb24oKSA8PCAiPC92ZXJzaW9uPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPHN0YXJ0VGltZT4iCisgICAgICAgICAgICAgICAgICA8PCB0aW1lOjp0b1N0cmluZyhzdGF0dXMuZ2V0U3RhcnRUaW1lc3RhbXAoKSwgIiVZLSVtLSVkVCVIOiVNOiVTJUYiKQorICAgICAgICAgICAgICAgICAgPDwgIjwvc3RhcnRUaW1lPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPGN1cnJlbnRUaW1lPiIKKyAgICAgICAgICAgICAgICAgIDw8IHRpbWU6OnRvU3RyaW5nKHN0YXR1cy5nZXRDdXJyZW50VGltZXN0YW1wKCksICIlWS0lbS0lZFQlSDolTTolUyVGIikKKyAgICAgICAgICAgICAgICAgIDw8ICI8L2N1cnJlbnRUaW1lPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPHVwdGltZT5QVCIKKyAgICAgICAgICAgICAgICAgIDw8IHRpbWU6OmR1cmF0aW9uX2Nhc3Q8dGltZTo6c2Vjb25kcz4oc3RhdHVzLmdldEN1cnJlbnRUaW1lc3RhbXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0YXR1cy5nZXRTdGFydFRpbWVzdGFtcCgpKS5jb3VudCgpCisgICAgICAgICAgICAgICAgICA8PCAiUzwvdXB0aW1lPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPG5OYW1lVHJlZUVudHJpZXM+IiAgICAgPDwgc3RhdHVzLmdldE5OYW1lVHJlZUVudHJpZXMoKQorICAgICAgICAgICAgICAgICAgPDwgIjwvbk5hbWVUcmVlRW50cmllcz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuRmliRW50cmllcz4iICAgICAgICAgIDw8IHN0YXR1cy5nZXRORmliRW50cmllcygpCisgICAgICAgICAgICAgICAgICA8PCAiPC9uRmliRW50cmllcz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuUGl0RW50cmllcz4iICAgICAgICAgIDw8IHN0YXR1cy5nZXROUGl0RW50cmllcygpCisgICAgICAgICAgICAgICAgICA8PCAiPC9uUGl0RW50cmllcz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuTWVhc3VyZW1lbnRzRW50cmllcz4iIDw8IHN0YXR1cy5nZXROTWVhc3VyZW1lbnRzRW50cmllcygpCisgICAgICAgICAgICAgICAgICA8PCAiPC9uTWVhc3VyZW1lbnRzRW50cmllcz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuQ3NFbnRyaWVzPiIgICAgICAgICAgIDw8IHN0YXR1cy5nZXROQ3NFbnRyaWVzKCkKKyAgICAgICAgICAgICAgICAgIDw8ICI8L25Dc0VudHJpZXM+IjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICI8cGFja2V0Q291bnRlcnM+IjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICI8aW5jb21pbmdQYWNrZXRzPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPG5JbnRlcmVzdHM+IiAgICAgICAgICAgPDwgc3RhdHVzLmdldE5JbkludGVyZXN0cygpCisgICAgICAgICAgICAgICAgICA8PCAiPC9uSW50ZXJlc3RzPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPG5EYXRhcz4iICAgICAgICAgICAgICAgPDwgc3RhdHVzLmdldE5JbkRhdGFzKCkKKyAgICAgICAgICAgICAgICAgIDw8ICI8L25EYXRhcz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvaW5jb21pbmdQYWNrZXRzPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPG91dGdvaW5nUGFja2V0cz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuSW50ZXJlc3RzPiIgICAgICAgICAgIDw8IHN0YXR1cy5nZXROT3V0SW50ZXJlc3RzKCkKKyAgICAgICAgICAgICAgICAgIDw8ICI8L25JbnRlcmVzdHM+IjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICI8bkRhdGFzPiIgICAgICAgICAgICAgICA8PCBzdGF0dXMuZ2V0Tk91dERhdGFzKCkKKyAgICAgICAgICAgICAgICAgIDw8ICI8L25EYXRhcz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvb3V0Z29pbmdQYWNrZXRzPiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPC9wYWNrZXRDb3VudGVycz4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvZ2VuZXJhbFN0YXR1cz4iOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJHZW5lcmFsIE5GRCBzdGF0dXM6IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgICBuZmRJZD0iCisgICAgICAgICAgICAgICAgICA8PCBuZmRJZCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgdmVyc2lvbj0iCisgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMuZ2V0TmZkVmVyc2lvbigpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgICAgICAgICAgc3RhcnRUaW1lPSIKKyAgICAgICAgICAgICAgICAgIDw8IHRpbWU6OnRvSXNvU3RyaW5nKHN0YXR1cy5nZXRTdGFydFRpbWVzdGFtcCgpKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICBjdXJyZW50VGltZT0iCisgICAgICAgICAgICAgICAgICA8PCB0aW1lOjp0b0lzb1N0cmluZyhzdGF0dXMuZ2V0Q3VycmVudFRpbWVzdGFtcCgpKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgICAgICAgIHVwdGltZT0iCisgICAgICAgICAgICAgICAgICA8PCB0aW1lOjpkdXJhdGlvbl9jYXN0PHRpbWU6OnNlY29uZHM+KHN0YXR1cy5nZXRDdXJyZW50VGltZXN0YW1wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdGF0dXMuZ2V0U3RhcnRUaW1lc3RhbXAoKSkgPDwgc3RkOjplbmRsOworCisgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgICAgbk5hbWVUcmVlRW50cmllcz0iIDw8IHN0YXR1cy5nZXROTmFtZVRyZWVFbnRyaWVzKCkgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgICAgICAgIG5GaWJFbnRyaWVzPSIgPDwgc3RhdHVzLmdldE5GaWJFbnRyaWVzKCkgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICAgICAgICAgblBpdEVudHJpZXM9IiA8PCBzdGF0dXMuZ2V0TlBpdEVudHJpZXMoKSAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiICBuTWVhc3VyZW1lbnRzRW50cmllcz0iIDw8IHN0YXR1cy5nZXROTWVhc3VyZW1lbnRzRW50cmllcygpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgICAgICAgICBuQ3NFbnRyaWVzPSIgPDwgc3RhdHVzLmdldE5Dc0VudHJpZXMoKSAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICAgICAgICBuSW5JbnRlcmVzdHM9IiA8PCBzdGF0dXMuZ2V0TkluSW50ZXJlc3RzKCkgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgbk91dEludGVyZXN0cz0iIDw8IHN0YXR1cy5nZXROT3V0SW50ZXJlc3RzKCkgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgICAgICAgICAgIG5JbkRhdGFzPSIgPDwgc3RhdHVzLmdldE5JbkRhdGFzKCkgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICAgICAgICAgICBuT3V0RGF0YXM9IiA8PCBzdGF0dXMuZ2V0Tk91dERhdGFzKCkgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisKKyAgICBydW5OZXh0U3RlcCgpOworICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgdm9pZAorICBmZXRjaENoYW5uZWxTdGF0dXNJbmZvcm1hdGlvbigpCisgIHsKKyAgICBtX2J1ZmZlciA9IG1ha2Vfc2hhcmVkPE9CdWZmZXJTdHJlYW0+KCk7CisKKyAgICBJbnRlcmVzdCBpbnRlcmVzdCgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvY2hhbm5lbHMiKTsKKyAgICBpbnRlcmVzdC5zZXRDaGlsZFNlbGVjdG9yKDEpOworICAgIGludGVyZXN0LnNldE11c3RCZUZyZXNoKHRydWUpOworCisgICAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZFN0YXR1czo6ZmV0Y2hTZWdtZW50cywgdGhpcywgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZmRTdGF0dXM6OmFmdGVyRmV0Y2hlZENoYW5uZWxTdGF0dXNJbmZvcm1hdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRTdGF0dXM6Om9uVGltZW91dCwgdGhpcykpOworICB9CisKKyAgdm9pZAorICBhZnRlckZldGNoZWRDaGFubmVsU3RhdHVzSW5mb3JtYXRpb24oKQorICB7CisgICAgQ29uc3RCdWZmZXJQdHIgYnVmID0gbV9idWZmZXItPmJ1ZigpOworICAgIGlmIChtX2lzT3V0cHV0WG1sKQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIjxjaGFubmVscz4iOworCisgICAgICAgIEJsb2NrIGJsb2NrOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgb2sgPSBCbG9jazo6ZnJvbUJ1ZmZlcihidWYsIG9mZnNldCwgYmxvY2spOworICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IGNhbm5vdCBkZWNvZGUgQ2hhbm5lbFN0YXR1cyBUTFYiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2suc2l6ZSgpOworCisgICAgICAgICAgICBuZmQ6OkNoYW5uZWxTdGF0dXMgY2hhbm5lbFN0YXR1cyhibG9jayk7CisKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGNoYW5uZWw+IjsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbG9jYWxVcmkoY2hhbm5lbFN0YXR1cy5nZXRMb2NhbFVyaSgpKTsKKyAgICAgICAgICAgIGVzY2FwZVNwZWNpYWxDaGFyYWN0ZXJzKCZsb2NhbFVyaSk7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxsb2NhbFVyaT4iIDw8IGxvY2FsVXJpIDw8ICI8L2xvY2FsVXJpPiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvY2hhbm5lbD4iOworICAgICAgICAgIH0KKyAgICAgICAgc3RkOjpjb3V0IDw8ICI8L2NoYW5uZWxzPiI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkNoYW5uZWxzOiIgPDwgc3RkOjplbmRsOworCisgICAgICAgIEJsb2NrIGJsb2NrOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgb2sgPSBCbG9jazo6ZnJvbUJ1ZmZlcihidWYsIG9mZnNldCwgYmxvY2spOworICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IGNhbm5vdCBkZWNvZGUgQ2hhbm5lbFN0YXR1cyBUTFYiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2suc2l6ZSgpOworCisgICAgICAgICAgICBuZmQ6OkNoYW5uZWxTdGF0dXMgY2hhbm5lbFN0YXR1cyhibG9jayk7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIiA8PCBjaGFubmVsU3RhdHVzLmdldExvY2FsVXJpKCkgPDwgc3RkOjplbmRsOworICAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICBydW5OZXh0U3RlcCgpOworICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgdm9pZAorICBmZXRjaEZhY2VTdGF0dXNJbmZvcm1hdGlvbigpCisgIHsKKyAgICBtX2J1ZmZlciA9IG1ha2Vfc2hhcmVkPE9CdWZmZXJTdHJlYW0+KCk7CisKKyAgICBJbnRlcmVzdCBpbnRlcmVzdCgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvbGlzdCIpOworICAgIGludGVyZXN0LnNldENoaWxkU2VsZWN0b3IoMSk7CisgICAgaW50ZXJlc3Quc2V0TXVzdEJlRnJlc2godHJ1ZSk7CisKKyAgICBtX2ZhY2UuZXhwcmVzc0ludGVyZXN0KGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkU3RhdHVzOjpmZXRjaFNlZ21lbnRzLCB0aGlzLCBfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5mZFN0YXR1czo6YWZ0ZXJGZXRjaGVkRmFjZVN0YXR1c0luZm9ybWF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZFN0YXR1czo6b25UaW1lb3V0LCB0aGlzKSk7CisgIH0KKworICB2b2lkCisgIGFmdGVyRmV0Y2hlZEZhY2VTdGF0dXNJbmZvcm1hdGlvbigpCisgIHsKKyAgICBDb25zdEJ1ZmZlclB0ciBidWYgPSBtX2J1ZmZlci0+YnVmKCk7CisgICAgaWYgKG1faXNPdXRwdXRYbWwpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPGZhY2VzPiI7CisKKyAgICAgICAgQmxvY2sgYmxvY2s7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgYnVmLT5zaXplKCkpCisgICAgICAgICAgeworICAgICAgICAgICAgYm9vbCBvayA9IEJsb2NrOjpmcm9tQnVmZmVyKGJ1Ziwgb2Zmc2V0LCBibG9jayk7CisgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogY2Fubm90IGRlY29kZSBGYWNlU3RhdHVzIFRMViIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSBibG9jay5zaXplKCk7CisKKyAgICAgICAgICAgIG5mZDo6RmFjZVN0YXR1cyBmYWNlU3RhdHVzKGJsb2NrKTsKKworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8ZmFjZT4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8ZmFjZUlkPiIgPDwgZmFjZVN0YXR1cy5nZXRGYWNlSWQoKSA8PCAiPC9mYWNlSWQ+IjsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVtb3RlVXJpKGZhY2VTdGF0dXMuZ2V0UmVtb3RlVXJpKCkpOworICAgICAgICAgICAgZXNjYXBlU3BlY2lhbENoYXJhY3RlcnMoJnJlbW90ZVVyaSk7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxyZW1vdGVVcmk+IiA8PCByZW1vdGVVcmkgPDwgIjwvcmVtb3RlVXJpPiI7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxvY2FsVXJpKGZhY2VTdGF0dXMuZ2V0TG9jYWxVcmkoKSk7CisgICAgICAgICAgICBlc2NhcGVTcGVjaWFsQ2hhcmFjdGVycygmbG9jYWxVcmkpOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8bG9jYWxVcmk+IiA8PCBsb2NhbFVyaSA8PCAiPC9sb2NhbFVyaT4iOworCisgICAgICAgICAgICBpZiAoZmFjZVN0YXR1cy5oYXNFeHBpcmF0aW9uUGVyaW9kKCkpIHsKKyAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8ZXhwaXJhdGlvblBlcmlvZD5QVCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRpbWU6OmR1cmF0aW9uX2Nhc3Q8dGltZTo6c2Vjb25kcz4oZmFjZVN0YXR1cy5nZXRFeHBpcmF0aW9uUGVyaW9kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb3VudCgpIDw8ICJTIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjwvZXhwaXJhdGlvblBlcmlvZD4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxmYWNlU2NvcGU+IiA8PCBmYWNlU3RhdHVzLmdldEZhY2VTY29wZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIjwvZmFjZVNjb3BlPiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxmYWNlUGVyc2lzdGVuY3k+IiA8PCBmYWNlU3RhdHVzLmdldEZhY2VQZXJzaXN0ZW5jeSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIjwvZmFjZVBlcnNpc3RlbmN5PiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxsaW5rVHlwZT4iIDw8IGZhY2VTdGF0dXMuZ2V0TGlua1R5cGUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICI8L2xpbmtUeXBlPiI7CisKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHBhY2tldENvdW50ZXJzPiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxpbmNvbWluZ1BhY2tldHM+IjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPG5JbnRlcmVzdHM+IiAgICAgICA8PCBmYWNlU3RhdHVzLmdldE5JbkludGVyZXN0cygpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIjwvbkludGVyZXN0cz4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8bkRhdGFzPiIgICAgICAgICAgIDw8IGZhY2VTdGF0dXMuZ2V0TkluRGF0YXMoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICI8L25EYXRhcz4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8L2luY29taW5nUGFja2V0cz4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8b3V0Z29pbmdQYWNrZXRzPiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuSW50ZXJlc3RzPiIgICAgICAgPDwgZmFjZVN0YXR1cy5nZXROT3V0SW50ZXJlc3RzKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiPC9uSW50ZXJlc3RzPiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuRGF0YXM+IiAgICAgICAgICAgPDwgZmFjZVN0YXR1cy5nZXROT3V0RGF0YXMoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICI8L25EYXRhcz4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8L291dGdvaW5nUGFja2V0cz4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8L3BhY2tldENvdW50ZXJzPiI7CisKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGJ5dGVDb3VudGVycz4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8aW5jb21pbmdCeXRlcz4iICAgIDw8IGZhY2VTdGF0dXMuZ2V0TkluQnl0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICI8L2luY29taW5nQnl0ZXM+IjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPG91dGdvaW5nQnl0ZXM+IiAgICA8PCBmYWNlU3RhdHVzLmdldE5PdXRCeXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIjwvb3V0Z29pbmdCeXRlcz4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8L2J5dGVDb3VudGVycz4iOworCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvZmFjZT4iOworICAgICAgICAgIH0KKyAgICAgICAgc3RkOjpjb3V0IDw8ICI8L2ZhY2VzPiI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhY2VzOiIgPDwgc3RkOjplbmRsOworCisgICAgICAgIEJsb2NrIGJsb2NrOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgb2sgPSBCbG9jazo6ZnJvbUJ1ZmZlcihidWYsIG9mZnNldCwgYmxvY2spOworICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IGNhbm5vdCBkZWNvZGUgRmFjZVN0YXR1cyBUTFYiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2suc2l6ZSgpOworCisgICAgICAgICAgICBuZmQ6OkZhY2VTdGF0dXMgZmFjZVN0YXR1cyhibG9jayk7CisKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBmYWNlaWQ9IiA8PCBmYWNlU3RhdHVzLmdldEZhY2VJZCgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZW1vdGU9IiA8PCBmYWNlU3RhdHVzLmdldFJlbW90ZVVyaSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBsb2NhbD0iIDw8IGZhY2VTdGF0dXMuZ2V0TG9jYWxVcmkoKTsKKyAgICAgICAgICAgIGlmIChmYWNlU3RhdHVzLmhhc0V4cGlyYXRpb25QZXJpb2QoKSkgeworICAgICAgICAgICAgICBzdGQ6OmNvdXQgIDw8ICIgZXhwaXJlcz0iCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGltZTo6ZHVyYXRpb25fY2FzdDx0aW1lOjpzZWNvbmRzPihmYWNlU3RhdHVzLmdldEV4cGlyYXRpb25QZXJpb2QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb3VudCgpIDw8ICJzIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiIGNvdW50ZXJzPXsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgImluPXsiIDw8IGZhY2VTdGF0dXMuZ2V0TkluSW50ZXJlc3RzKCkgPDwgImkgIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGZhY2VTdGF0dXMuZ2V0TkluRGF0YXMoKSA8PCAiZCAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZmFjZVN0YXR1cy5nZXROSW5CeXRlcygpIDw8ICJCfSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIG91dD17IiA8PCBmYWNlU3RhdHVzLmdldE5PdXRJbnRlcmVzdHMoKSA8PCAiaSAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZmFjZVN0YXR1cy5nZXROT3V0RGF0YXMoKSA8PCAiZCAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZmFjZVN0YXR1cy5nZXROT3V0Qnl0ZXMoKSA8PCAiQn0iCisgICAgICAgICAgICAgICAgICAgICAgPDwgIn0iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCBmYWNlU3RhdHVzLmdldEZhY2VTY29wZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGZhY2VTdGF0dXMuZ2V0RmFjZVBlcnNpc3RlbmN5KCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgZmFjZVN0YXR1cy5nZXRMaW5rVHlwZSgpOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgfQorCisgICAgcnVuTmV4dFN0ZXAoKTsKKyAgfQorCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIHZvaWQKKyAgZmV0Y2hGaWJFbnVtZXJhdGlvbkluZm9ybWF0aW9uKCkKKyAgeworICAgIG1fYnVmZmVyID0gbWFrZV9zaGFyZWQ8T0J1ZmZlclN0cmVhbT4oKTsKKworICAgIEludGVyZXN0IGludGVyZXN0KCIvbG9jYWxob3N0L25mZC9maWIvbGlzdCIpOworICAgIGludGVyZXN0LnNldENoaWxkU2VsZWN0b3IoMSk7CisgICAgaW50ZXJlc3Quc2V0TXVzdEJlRnJlc2godHJ1ZSk7CisgICAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZFN0YXR1czo6ZmV0Y2hTZWdtZW50cywgdGhpcywgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZmRTdGF0dXM6OmFmdGVyRmV0Y2hlZEZpYkVudW1lcmF0aW9uSW5mb3JtYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkU3RhdHVzOjpvblRpbWVvdXQsIHRoaXMpKTsKKyAgfQorCisgIHZvaWQKKyAgYWZ0ZXJGZXRjaGVkRmliRW51bWVyYXRpb25JbmZvcm1hdGlvbigpCisgIHsKKyAgICBDb25zdEJ1ZmZlclB0ciBidWYgPSBtX2J1ZmZlci0+YnVmKCk7CisgICAgaWYgKG1faXNPdXRwdXRYbWwpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPGZpYj4iOworCisgICAgICAgIEJsb2NrIGJsb2NrOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgb2sgPSBCbG9jazo6ZnJvbUJ1ZmZlcihidWYsIG9mZnNldCwgYmxvY2spOworICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IGNhbm5vdCBkZWNvZGUgRmliRW50cnkgVExWIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ICs9IGJsb2NrLnNpemUoKTsKKworICAgICAgICAgICAgbmZkOjpGaWJFbnRyeSBmaWJFbnRyeShibG9jayk7CisKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGZpYkVudHJ5PiI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgoZmliRW50cnkuZ2V0UHJlZml4KCkudG9VcmkoKSk7CisgICAgICAgICAgICBlc2NhcGVTcGVjaWFsQ2hhcmFjdGVycygmcHJlZml4KTsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHByZWZpeD4iIDw8IHByZWZpeCA8PCAiPC9wcmVmaXg+IjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPG5leHRIb3BzPiI7CisgICAgICAgICAgICBmb3IgKHN0ZDo6bGlzdDxuZmQ6Ok5leHRIb3BSZWNvcmQ+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgIG5leHRIb3AgPSBmaWJFbnRyeS5nZXROZXh0SG9wUmVjb3JkcygpLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIG5leHRIb3AgIT0gZmliRW50cnkuZ2V0TmV4dEhvcFJlY29yZHMoKS5lbmQoKTsKKyAgICAgICAgICAgICAgICAgKytuZXh0SG9wKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8bmV4dEhvcD4iIDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxmYWNlSWQ+IiAgPDwgbmV4dEhvcC0+Z2V0RmFjZUlkKCkgPDwgIjwvZmFjZUlkPiI7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8Y29zdD4iICAgIDw8IG5leHRIb3AtPmdldENvc3QoKSAgIDw8ICI8L2Nvc3Q+IjsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvbmV4dEhvcD4iOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvbmV4dEhvcHM+IjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPC9maWJFbnRyeT4iOworICAgICAgICAgIH0KKworICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvZmliPiI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkZJQjoiIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICBCbG9jayBibG9jazsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBidWYtPnNpemUoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBib29sIG9rID0gQmxvY2s6OmZyb21CdWZmZXIoYnVmLCBvZmZzZXQsIGJsb2NrKTsKKyAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiBjYW5ub3QgZGVjb2RlIEZpYkVudHJ5IFRMViIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2suc2l6ZSgpOworCisgICAgICAgICAgICBuZmQ6OkZpYkVudHJ5IGZpYkVudHJ5KGJsb2NrKTsKKworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICIgPDwgZmliRW50cnkuZ2V0UHJlZml4KCkgPDwgIiBuZXh0aG9wcz17IjsKKyAgICAgICAgICAgIGZvciAoc3RkOjpsaXN0PG5mZDo6TmV4dEhvcFJlY29yZD46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgbmV4dEhvcCA9IGZpYkVudHJ5LmdldE5leHRIb3BSZWNvcmRzKCkuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgbmV4dEhvcCAhPSBmaWJFbnRyeS5nZXROZXh0SG9wUmVjb3JkcygpLmVuZCgpOworICAgICAgICAgICAgICAgICArK25leHRIb3ApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmV4dEhvcCAhPSBmaWJFbnRyeS5nZXROZXh0SG9wUmVjb3JkcygpLmJlZ2luKCkpCisgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImZhY2VpZD0iIDw8IG5leHRIb3AtPmdldEZhY2VJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKGNvc3Q9IiA8PCBuZXh0SG9wLT5nZXRDb3N0KCkgPDwgIikiOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBydW5OZXh0U3RlcCgpOworICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgdm9pZAorICBmZXRjaFN0cmF0ZWd5Q2hvaWNlSW5mb3JtYXRpb24oKQorICB7CisgICAgbV9idWZmZXIgPSBtYWtlX3NoYXJlZDxPQnVmZmVyU3RyZWFtPigpOworCisgICAgSW50ZXJlc3QgaW50ZXJlc3QoIi9sb2NhbGhvc3QvbmZkL3N0cmF0ZWd5LWNob2ljZS9saXN0Iik7CisgICAgaW50ZXJlc3Quc2V0Q2hpbGRTZWxlY3RvcigxKTsKKyAgICBpbnRlcmVzdC5zZXRNdXN0QmVGcmVzaCh0cnVlKTsKKyAgICBtX2ZhY2UuZXhwcmVzc0ludGVyZXN0KGludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkU3RhdHVzOjpmZXRjaFNlZ21lbnRzLCB0aGlzLCBfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5mZFN0YXR1czo6YWZ0ZXJGZXRjaGVkU3RyYXRlZ3lDaG9pY2VJbmZvcm1hdGlvbkluZm9ybWF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZFN0YXR1czo6b25UaW1lb3V0LCB0aGlzKSk7CisgIH0KKworICB2b2lkCisgIGFmdGVyRmV0Y2hlZFN0cmF0ZWd5Q2hvaWNlSW5mb3JtYXRpb25JbmZvcm1hdGlvbigpCisgIHsKKyAgICBDb25zdEJ1ZmZlclB0ciBidWYgPSBtX2J1ZmZlci0+YnVmKCk7CisgICAgaWYgKG1faXNPdXRwdXRYbWwpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiPHN0cmF0ZWd5Q2hvaWNlcz4iOworCisgICAgICAgIEJsb2NrIGJsb2NrOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgb2sgPSBCbG9jazo6ZnJvbUJ1ZmZlcihidWYsIG9mZnNldCwgYmxvY2spOworICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IGNhbm5vdCBkZWNvZGUgU3RyYXRlZ3lDaG9pY2UgVExWIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ICs9IGJsb2NrLnNpemUoKTsKKworICAgICAgICAgICAgbmZkOjpTdHJhdGVneUNob2ljZSBzdHJhdGVneUNob2ljZShibG9jayk7CisKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHN0cmF0ZWd5Q2hvaWNlPiI7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUoc3RyYXRlZ3lDaG9pY2UuZ2V0TmFtZSgpLnRvVXJpKCkpOworICAgICAgICAgICAgZXNjYXBlU3BlY2lhbENoYXJhY3RlcnMoJm5hbWUpOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8bmFtZXNwYWNlPiIgPDwgbmFtZSA8PCAiPC9uYW1lc3BhY2U+IjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHN0cmF0ZWd5PiI7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmF0ZWd5KHN0cmF0ZWd5Q2hvaWNlLmdldFN0cmF0ZWd5KCkudG9VcmkoKSk7CisgICAgICAgICAgICBlc2NhcGVTcGVjaWFsQ2hhcmFjdGVycygmc3RyYXRlZ3kpOworCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjxuYW1lPiIgPDwgc3RyYXRlZ3kgPDwgIjwvbmFtZT4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8L3N0cmF0ZWd5PiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvc3RyYXRlZ3lDaG9pY2U+IjsKKyAgICAgICAgICB9CisKKyAgICAgICAgc3RkOjpjb3V0IDw8ICI8L3N0cmF0ZWd5Q2hvaWNlcz4iOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJTdHJhdGVneSBjaG9pY2VzOiIgPDwgc3RkOjplbmRsOworCisgICAgICAgIEJsb2NrIGJsb2NrOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1Zi0+c2l6ZSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgb2sgPSBCbG9jazo6ZnJvbUJ1ZmZlcihidWYsIG9mZnNldCwgYmxvY2spOworICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6IGNhbm5vdCBkZWNvZGUgU3RyYXRlZ3lDaG9pY2UgVExWIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBibG9jay5zaXplKCk7CisKKyAgICAgICAgICAgIG5mZDo6U3RyYXRlZ3lDaG9pY2Ugc3RyYXRlZ3lDaG9pY2UoYmxvY2spOworCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIiA8PCBzdHJhdGVneUNob2ljZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIHN0cmF0ZWd5PSIgPDwgc3RyYXRlZ3lDaG9pY2UuZ2V0U3RyYXRlZ3koKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgcnVuTmV4dFN0ZXAoKTsKKyAgfQorCisgIHZvaWQKKyAgZmV0Y2hSaWJTdGF0dXNJbmZvcm1hdGlvbigpCisgIHsKKyAgICBtX2J1ZmZlciA9IG1ha2Vfc2hhcmVkPE9CdWZmZXJTdHJlYW0+KCk7CisKKyAgICBJbnRlcmVzdCBpbnRlcmVzdCgiL2xvY2FsaG9zdC9uZmQvcmliL2xpc3QiKTsKKyAgICBpbnRlcmVzdC5zZXRDaGlsZFNlbGVjdG9yKDEpOworICAgIGludGVyZXN0LnNldE11c3RCZUZyZXNoKHRydWUpOworCisgICAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChpbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZFN0YXR1czo6ZmV0Y2hTZWdtZW50cywgdGhpcywgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZmRTdGF0dXM6OmFmdGVyRmV0Y2hlZFJpYlN0YXR1c0luZm9ybWF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZFN0YXR1czo6b25UaW1lb3V0LCB0aGlzKSk7CisgIH0KKworICB2b2lkCisgIGFmdGVyRmV0Y2hlZFJpYlN0YXR1c0luZm9ybWF0aW9uKCkKKyAgeworICAgIENvbnN0QnVmZmVyUHRyIGJ1ZiA9IG1fYnVmZmVyLT5idWYoKTsKKyAgICBpZiAobV9pc091dHB1dFhtbCkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICI8cmliPiI7CisKKyAgICAgICAgQmxvY2sgYmxvY2s7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgYnVmLT5zaXplKCkpCisgICAgICAgICAgeworICAgICAgICAgICAgYm9vbCBvayA9IEJsb2NrOjpmcm9tQnVmZmVyKGJ1Ziwgb2Zmc2V0LCBibG9jayk7CisgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogY2Fubm90IGRlY29kZSBSaWJFbnRyeSBUTFYiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2suc2l6ZSgpOworCisgICAgICAgICAgICBuZmQ6OlJpYkVudHJ5IHJpYkVudHJ5KGJsb2NrKTsKKworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8cmliRW50cnk+IjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeChyaWJFbnRyeS5nZXROYW1lKCkudG9VcmkoKSk7CisgICAgICAgICAgICBlc2NhcGVTcGVjaWFsQ2hhcmFjdGVycygmcHJlZml4KTsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHByZWZpeD4iIDw8IHByZWZpeCA8PCAiPC9wcmVmaXg+IjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHJvdXRlcz4iOworICAgICAgICAgICAgZm9yIChzdGQ6Omxpc3Q8bmZkOjpSb3V0ZT46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgbmV4dFJvdXRlID0gcmliRW50cnkuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgbmV4dFJvdXRlICE9IHJpYkVudHJ5LmVuZCgpOworICAgICAgICAgICAgICAgICArK25leHRSb3V0ZSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHJvdXRlPiIgOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGZhY2VJZD4iICA8PCBuZXh0Um91dGUtPmdldEZhY2VJZCgpIDw8ICI8L2ZhY2VJZD4iOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPG9yaWdpbj4iICA8PCBuZXh0Um91dGUtPmdldE9yaWdpbigpIDw8ICI8L29yaWdpbj4iOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGNvc3Q+IiAgICA8PCBuZXh0Um91dGUtPmdldENvc3QoKSAgIDw8ICI8L2Nvc3Q+IjsKKworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGZsYWdzPiI7CisgICAgICAgICAgICAgICAgaWYgKG5leHRSb3V0ZS0+aXNDaGlsZEluaGVyaXQoKSkKKyAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGNoaWxkSW5oZXJpdC8+IjsKKyAgICAgICAgICAgICAgICBpZiAobmV4dFJvdXRlLT5pc1JpYkNhcHR1cmUoKSkKKyAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPHJpYkNhcHR1cmUvPiI7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8L2ZsYWdzPiI7CisKKyAgICAgICAgICAgICAgICBpZiAoIW5leHRSb3V0ZS0+aGFzSW5maW5pdGVFeHBpcmF0aW9uUGVyaW9kKCkpIHsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPGV4cGlyYXRpb25QZXJpb2Q+UFQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGltZTo6ZHVyYXRpb25fY2FzdDx0aW1lOjpzZWNvbmRzPihuZXh0Um91dGUtPmdldEV4cGlyYXRpb25QZXJpb2QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb3VudCgpIDw8ICJTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI8L2V4cGlyYXRpb25QZXJpb2Q+IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8L3JvdXRlPiI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPC9yb3V0ZXM+IjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiPC9yaWJFbnRyeT4iOworICAgICAgICAgIH0KKworICAgICAgICBzdGQ6OmNvdXQgPDwgIjwvcmliPiI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlJJQjoiIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICBCbG9jayBibG9jazsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBidWYtPnNpemUoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBib29sIG9rID0gQmxvY2s6OmZyb21CdWZmZXIoYnVmLCBvZmZzZXQsIGJsb2NrKTsKKyAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiBjYW5ub3QgZGVjb2RlIFJpYkVudHJ5IFRMViIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSBibG9jay5zaXplKCk7CisKKyAgICAgICAgICAgIG5mZDo6UmliRW50cnkgcmliRW50cnkoYmxvY2spOworCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIiA8PCByaWJFbnRyeS5nZXROYW1lKCkudG9VcmkoKSA8PCAiIHJvdXRlPXsiOworICAgICAgICAgICAgZm9yIChzdGQ6Omxpc3Q8bmZkOjpSb3V0ZT46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgbmV4dFJvdXRlID0gcmliRW50cnkuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgbmV4dFJvdXRlICE9IHJpYkVudHJ5LmVuZCgpOworICAgICAgICAgICAgICAgICArK25leHRSb3V0ZSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuZXh0Um91dGUgIT0gcmliRW50cnkuYmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiLCAiOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiZmFjZWlkPSIgICA8PCBuZXh0Um91dGUtPmdldEZhY2VJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKG9yaWdpbj0iICA8PCBuZXh0Um91dGUtPmdldE9yaWdpbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY29zdD0iICAgIDw8IG5leHRSb3V0ZS0+Z2V0Q29zdCgpOworICAgICAgICAgICAgICAgIGlmICghbmV4dFJvdXRlLT5oYXNJbmZpbml0ZUV4cGlyYXRpb25QZXJpb2QoKSkgeworICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgZXhwaXJlcz0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGltZTo6ZHVyYXRpb25fY2FzdDx0aW1lOjpzZWNvbmRzPihuZXh0Um91dGUtPmdldEV4cGlyYXRpb25QZXJpb2QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKSA8PCAicyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5leHRSb3V0ZS0+aXNDaGlsZEluaGVyaXQoKSkKKyAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiIENoaWxkSW5oZXJpdCI7CisgICAgICAgICAgICAgICAgaWYgKG5leHRSb3V0ZS0+aXNSaWJDYXB0dXJlKCkpCisgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiBSaWJDYXB0dXJlIjsKKworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiKSI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAifSIgPDwgc3RkOjplbmRsOworICAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICBydW5OZXh0U3RlcCgpOworICB9CisKKworICB2b2lkCisgIGZldGNoSW5mb3JtYXRpb24oKQorICB7CisgICAgaWYgKG1faXNPdXRwdXRYbWwgfHwKKyAgICAgICAgKCFtX25lZWRWZXJzaW9uUmV0cmlldmFsICYmCisgICAgICAgICAhbV9uZWVkQ2hhbm5lbFN0YXR1c1JldHJpZXZhbCAmJgorICAgICAgICAgIW1fbmVlZEZhY2VTdGF0dXNSZXRyaWV2YWwgJiYKKyAgICAgICAgICFtX25lZWRGaWJFbnVtZXJhdGlvblJldHJpZXZhbCAmJgorICAgICAgICAgIW1fbmVlZFJpYlN0YXR1c1JldHJpZXZhbCAmJgorICAgICAgICAgIW1fbmVlZFN0cmF0ZWd5Q2hvaWNlUmV0cmlldmFsKSkKKyAgICAgIHsKKyAgICAgICAgZW5hYmxlVmVyc2lvblJldHJpZXZhbCgpOworICAgICAgICBlbmFibGVDaGFubmVsU3RhdHVzUmV0cmlldmFsKCk7CisgICAgICAgIGVuYWJsZUZhY2VTdGF0dXNSZXRyaWV2YWwoKTsKKyAgICAgICAgZW5hYmxlRmliRW51bWVyYXRpb25SZXRyaWV2YWwoKTsKKyAgICAgICAgZW5hYmxlUmliU3RhdHVzUmV0cmlldmFsKCk7CisgICAgICAgIGVuYWJsZVN0cmF0ZWd5Q2hvaWNlUmV0cmlldmFsKCk7CisgICAgICB9CisKKyAgICBpZiAobV9pc091dHB1dFhtbCkKKyAgICAgIG1fZmV0Y2hTdGVwcy5wdXNoX2JhY2soYmluZCgmTmZkU3RhdHVzOjpwcmludFhtbEhlYWRlciwgdGhpcykpOworCisgICAgaWYgKG1fbmVlZFZlcnNpb25SZXRyaWV2YWwpCisgICAgICBtX2ZldGNoU3RlcHMucHVzaF9iYWNrKGJpbmQoJk5mZFN0YXR1czo6ZmV0Y2hWZXJzaW9uSW5mb3JtYXRpb24sIHRoaXMpKTsKKworICAgIGlmIChtX25lZWRDaGFubmVsU3RhdHVzUmV0cmlldmFsKQorICAgICAgbV9mZXRjaFN0ZXBzLnB1c2hfYmFjayhiaW5kKCZOZmRTdGF0dXM6OmZldGNoQ2hhbm5lbFN0YXR1c0luZm9ybWF0aW9uLCB0aGlzKSk7CisKKyAgICBpZiAobV9uZWVkRmFjZVN0YXR1c1JldHJpZXZhbCkKKyAgICAgIG1fZmV0Y2hTdGVwcy5wdXNoX2JhY2soYmluZCgmTmZkU3RhdHVzOjpmZXRjaEZhY2VTdGF0dXNJbmZvcm1hdGlvbiwgdGhpcykpOworCisgICAgaWYgKG1fbmVlZEZpYkVudW1lcmF0aW9uUmV0cmlldmFsKQorICAgICAgbV9mZXRjaFN0ZXBzLnB1c2hfYmFjayhiaW5kKCZOZmRTdGF0dXM6OmZldGNoRmliRW51bWVyYXRpb25JbmZvcm1hdGlvbiwgdGhpcykpOworCisgICAgaWYgKG1fbmVlZFJpYlN0YXR1c1JldHJpZXZhbCkKKyAgICAgIG1fZmV0Y2hTdGVwcy5wdXNoX2JhY2soYmluZCgmTmZkU3RhdHVzOjpmZXRjaFJpYlN0YXR1c0luZm9ybWF0aW9uLCB0aGlzKSk7CisKKyAgICBpZiAobV9uZWVkU3RyYXRlZ3lDaG9pY2VSZXRyaWV2YWwpCisgICAgICBtX2ZldGNoU3RlcHMucHVzaF9iYWNrKGJpbmQoJk5mZFN0YXR1czo6ZmV0Y2hTdHJhdGVneUNob2ljZUluZm9ybWF0aW9uLCB0aGlzKSk7CisKKyAgICBpZiAobV9pc091dHB1dFhtbCkKKyAgICAgIG1fZmV0Y2hTdGVwcy5wdXNoX2JhY2soYmluZCgmTmZkU3RhdHVzOjpwcmludFhtbEZvb3RlciwgdGhpcykpOworCisgICAgcnVuTmV4dFN0ZXAoKTsKKyAgICBtX2ZhY2UucHJvY2Vzc0V2ZW50cygpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQKKyAgcHJpbnRYbWxIZWFkZXIoKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiI7CisgICAgc3RkOjpjb3V0IDw8ICI8bmZkU3RhdHVzIHhtbG5zPVwibmRuOi9sb2NhbGhvc3QvbmZkL3N0YXR1cy8xXCI+IjsKKworICAgIHJ1bk5leHRTdGVwKCk7CisgIH0KKworICB2b2lkCisgIHByaW50WG1sRm9vdGVyKCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiPC9uZmRTdGF0dXM+IjsKKworICAgIHJ1bk5leHRTdGVwKCk7CisgIH0KKworICB2b2lkCisgIHJ1bk5leHRTdGVwKCkKKyAgeworICAgIGlmIChtX2ZldGNoU3RlcHMuZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKworICAgIGZ1bmN0aW9uPHZvaWQoKT4gbmV4dFN0ZXAgPSBtX2ZldGNoU3RlcHMuZnJvbnQoKTsKKyAgICBtX2ZldGNoU3RlcHMucG9wX2Zyb250KCk7CisgICAgbmV4dFN0ZXAoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBtX3Rvb2xOYW1lOworICBib29sIG1fbmVlZFZlcnNpb25SZXRyaWV2YWw7CisgIGJvb2wgbV9uZWVkQ2hhbm5lbFN0YXR1c1JldHJpZXZhbDsKKyAgYm9vbCBtX25lZWRGYWNlU3RhdHVzUmV0cmlldmFsOworICBib29sIG1fbmVlZEZpYkVudW1lcmF0aW9uUmV0cmlldmFsOworICBib29sIG1fbmVlZFJpYlN0YXR1c1JldHJpZXZhbDsKKyAgYm9vbCBtX25lZWRTdHJhdGVneUNob2ljZVJldHJpZXZhbDsKKyAgYm9vbCBtX2lzT3V0cHV0WG1sOworICBGYWNlIG1fZmFjZTsKKworICBzaGFyZWRfcHRyPE9CdWZmZXJTdHJlYW0+IG1fYnVmZmVyOworCisgIHN0ZDo6ZGVxdWU8ZnVuY3Rpb248dm9pZCgpPiA+IG1fZmV0Y2hTdGVwczsKK307CisKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgaW50IG9wdGlvbjsKKyAgbmRuOjpOZmRTdGF0dXMgbmZkU3RhdHVzKGFyZ3ZbMF0pOworCisgIHdoaWxlICgob3B0aW9uID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJodmNmYnJzeFYiKSkgIT0gLTEpIHsKKyAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgIGNhc2UgJ2gnOgorICAgICAgbmZkU3RhdHVzLnVzYWdlKCk7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlICd2JzoKKyAgICAgIG5mZFN0YXR1cy5lbmFibGVWZXJzaW9uUmV0cmlldmFsKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICAgIG5mZFN0YXR1cy5lbmFibGVDaGFubmVsU3RhdHVzUmV0cmlldmFsKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgIG5mZFN0YXR1cy5lbmFibGVGYWNlU3RhdHVzUmV0cmlldmFsKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICAgIG5mZFN0YXR1cy5lbmFibGVGaWJFbnVtZXJhdGlvblJldHJpZXZhbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgICBuZmRTdGF0dXMuZW5hYmxlUmliU3RhdHVzUmV0cmlldmFsKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIG5mZFN0YXR1cy5lbmFibGVTdHJhdGVneUNob2ljZVJldHJpZXZhbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgICBuZmRTdGF0dXMuZW5hYmxlWG1sT3V0cHV0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdWJzoKKyAgICAgIHN0ZDo6Y291dCA8PCBORkRfVkVSU0lPTl9CVUlMRF9TVFJJTkcgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgIG5mZFN0YXR1cy51c2FnZSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgdHJ5IHsKKyAgICBuZmRTdGF0dXMuZmV0Y2hJbmZvcm1hdGlvbigpOworICB9CisgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAyOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ORkQvdG9vbHMvbmZkLXN0b3Auc2ggYi9ORkQvdG9vbHMvbmZkLXN0b3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWQ1NTkyOQotLS0gL2Rldi9udWxsCisrKyBiL05GRC90b29scy9uZmQtc3RvcC5zaApAQCAtMCwwICsxLDI0IEBACisjIUBCQVNIQAorCitWRVJTSU9OPSJAVkVSU0lPTkAiCisKK2Nhc2UgIiQxIiBpbgorICAtaCkKKyAgICBlY2hvIFVzYWdlCisgICAgZWNobyAkMAorICAgIGVjaG8gIiAgU3RvcCBORkQgYW5kIFJJQiBNYW5hZ2VtZW50IGRhZW1vbiIKKyAgICBleGl0IDAKKyAgICA7OworICAtVikKKyAgICBlY2hvICRWRVJTSU9OCisgICAgZXhpdCAwCisgICAgOzsKKyAgIiIpIDs7ICMgZG8gbm90aGluZworICAqKQorICAgIGVjaG8gIlVucmVjb2duaXplZCBvcHRpb24gJDEiCisgICAgZXhpdCAxCisgICAgOzsKK2VzYWMKKworc3VkbyBraWxsYWxsIG5yZAorc3VkbyBraWxsYWxsIG5mZApkaWZmIC0tZ2l0IGEvTkZEL3Rvb2xzL25mZGMuY3BwIGIvTkZEL3Rvb2xzL25mZGMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjIyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmZkYy5jcHAKQEAgLTAsMCArMSw2MTkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJuZmRjLmhwcCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy9yZWdleF9maW5kX2Zvcm1hdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmVnZXguaHBwPgorCisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1mYWNlLXF1ZXJ5LWZpbHRlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tYW5hZ2VtZW50L25mZC1mYWNlLXN0YXR1cy5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3NlZ21lbnQtZmV0Y2hlci5ocHA+CisKK3ZvaWQKK3VzYWdlKGNvbnN0IGNoYXIqIHByb2dyYW1OYW1lKQoreworICBzdGQ6OmNvdXQgPDwgIlVzYWdlOlxuIiA8PCBwcm9ncmFtTmFtZSAgPDwgIiBbLWhdIFstVl0gQ09NTUFORCBbPENvbW1hbmQgT3B0aW9ucz5dXG4iCisgICAgIiAgICAgICAtaCBwcmludCB1c2FnZSBhbmQgZXhpdFxuIgorICAgICIgICAgICAgLVYgcHJpbnQgdmVyc2lvbiBhbmQgZXhpdFxuIgorICAgICJcbiIKKyAgICAiICAgQ09NTUFORCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4iCisgICAgIiAgICAgICByZWdpc3RlciBbLUldIFstQ10gWy1jIGNvc3RdIFstZSBleHBpcmF0aW9uIHRpbWVdIFstbyBvcmlnaW5dIG5hbWUgPGZhY2VJZCB8IGZhY2VVcmk+XG4iCisgICAgIiAgICAgICAgICAgcmVnaXN0ZXIgbmFtZSB0byB0aGUgZ2l2ZW4gZmFjZUlkIG9yIGZhY2VVcmlcbiIKKyAgICAiICAgICAgICAgICAtSTogdW5zZXQgQ0hJTERfSU5IRVJJVCBmbGFnXG4iCisgICAgIiAgICAgICAgICAgLUM6IHNldCBDQVBUVVJFIGZsYWdcbiIKKyAgICAiICAgICAgICAgICAtYzogc3BlY2lmeSBjb3N0IChkZWZhdWx0IDApXG4iCisgICAgIiAgICAgICAgICAgLWU6IHNwZWNpZnkgZXhwaXJhdGlvbiB0aW1lIGluIG1zXG4iCisgICAgIiAgICAgICAgICAgICAgIChieSBkZWZhdWx0IHRoZSBlbnRyeSByZW1haW5zIGluIEZJQiBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhc3NvY2lhdGVkIGZhY2UpXG4iCisgICAgIiAgICAgICAgICAgLW86IHNwZWNpZnkgb3JpZ2luXG4iCisgICAgIiAgICAgICAgICAgICAgIDAgZm9yIExvY2FsIHByb2R1Y2VyIGFwcGxpY2F0aW9ucywgMTI4IGZvciBOTFNSLCAyNTUoZGVmYXVsdCkgZm9yIHN0YXRpYyByb3V0ZXNcbiIKKyAgICAiICAgICAgIHVucmVnaXN0ZXIgWy1vIG9yaWdpbl0gbmFtZSA8ZmFjZUlkIHwgZmFjZVVyaT5cbiIKKyAgICAiICAgICAgICAgICB1bnJlZ2lzdGVyIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gZmFjZUlkXG4iCisgICAgIiAgICAgICBjcmVhdGUgPGZhY2VVcmk+IFxuIgorICAgICIgICAgICAgICAgIENyZWF0ZSBhIGZhY2UgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czpcbiIKKyAgICAiICAgICAgICAgICBVRFAgdW5pY2FzdDogICAgdWRwWzR8Nl06Ly88cmVtb3RlLUlQLW9yLWhvc3Q+Wzo8cmVtb3RlLXBvcnQ+XVxuIgorICAgICIgICAgICAgICAgIFRDUDogICAgICAgICAgICB0Y3BbNHw2XTovLzxyZW1vdGUtSVAtb3ItaG9zdD5bOjxyZW1vdGUtcG9ydD5dIFxuIgorICAgICIgICAgICAgZGVzdHJveSA8ZmFjZUlkIHwgZmFjZVVyaT4gXG4iCisgICAgIiAgICAgICAgICAgRGVzdHJveSBhIGZhY2VcbiIKKyAgICAiICAgICAgIHNldC1zdHJhdGVneSA8bmFtZT4gPHN0cmF0ZWd5PiBcbiIKKyAgICAiICAgICAgICAgICBTZXQgdGhlIHN0cmF0ZWd5IGZvciBhIG5hbWVzcGFjZSBcbiIKKyAgICAiICAgICAgIHVuc2V0LXN0cmF0ZWd5IDxuYW1lPiBcbiIKKyAgICAiICAgICAgICAgICBVbnNldCB0aGUgc3RyYXRlZ3kgZm9yIGEgbmFtZXNwYWNlIFxuIgorICAgICIgICAgICAgYWRkLW5leHRob3AgWy1jIDxjb3N0Pl0gPG5hbWU+IDxmYWNlSWQgfCBmYWNlVXJpPlxuIgorICAgICIgICAgICAgICAgIEFkZCBhIG5leHRob3AgdG8gYSBGSUIgZW50cnlcbiIKKyAgICAiICAgICAgICAgICAtYzogc3BlY2lmeSBjb3N0IChkZWZhdWx0IDApXG4iCisgICAgIiAgICAgICByZW1vdmUtbmV4dGhvcCA8bmFtZT4gPGZhY2VJZCB8IGZhY2VVcmk+IFxuIgorICAgICIgICAgICAgICAgIFJlbW92ZSBhIG5leHRob3AgZnJvbSBhIEZJQiBlbnRyeVxuIgorICAgIDw8IHN0ZDo6ZW5kbDsKK30KKworbmFtZXNwYWNlIG5mZGMgeworCit1c2luZyBzdGQ6OmJpbmQ7CisKK2NvbnN0IG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIE5mZGM6OkRFRkFVTFRfRVhQSVJBVElPTl9QRVJJT0QgPSBuZG46OnRpbWU6Om1pbGxpc2Vjb25kczo6bWF4KCk7Citjb25zdCB1aW50NjRfdCBOZmRjOjpERUZBVUxUX0NPU1QgPSAwOworCitOZmRjOjpGYWNlSWRGZXRjaGVyOjpGYWNlSWRGZXRjaGVyKG5kbjo6RmFjZSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlciYgY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd0NyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3VjY2Vzc0NhbGxiYWNrJiBvblN1Y2NlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhaWx1cmVDYWxsYmFjayYgb25GYWlsKQorICA6IG1fZmFjZShmYWNlKQorICAsIG1fY29udHJvbGxlcihjb250cm9sbGVyKQorICAsIG1fYWxsb3dDcmVhdGUoYWxsb3dDcmVhdGUpCisgICwgbV9vblN1Y2NlZWQob25TdWNjZWVkKQorICAsIG1fb25GYWlsKG9uRmFpbCkKK3sKK30KKwordm9pZAorTmZkYzo6RmFjZUlkRmV0Y2hlcjo6c3RhcnQobmRuOjpGYWNlJiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlciYgY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dDcmVhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWNjZXNzQ2FsbGJhY2smIG9uU3VjY2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhaWx1cmVDYWxsYmFjayYgb25GYWlsKQoreworICAvLyAxLiBUcnkgcGFyc2UgaW5wdXQgYXMgRmFjZUlkLCBpZiBpbnB1dCBpcyBGYWNlSWQsIHN1Y2NlZWQgd2l0aCBwYXJzZWQgRmFjZUlkCisgIC8vIDIuIFRyeSBwYXJzZSBpbnB1dCBhcyBGYWNlVXJpLCBpZiBpbnB1dCBpcyBub3QgRmFjZVVyaSwgZmFpbAorICAvLyAzLiBDYW5vbml6ZSBmYWNlVXJpCisgIC8vIDQuIElmIGNhbm9uaXphdGlvbiBmYWlscywgZmFpbAorICAvLyA1LiBRdWVyeSBmb3IgZmFjZQorICAvLyA2LiBJZiBxdWVyeSBzdWNjZWVkcyBhbmQgZmluZHMgYSBmYWNlLCBzdWNjZWVkIHdpdGggZm91bmQgRmFjZUlkCisgIC8vIDcuIENyZWF0ZSBmYWNlCisgIC8vIDguIElmIGZhY2UgY3JlYXRpb24gc3VjY2VlZHMsIHN1Y2NlZWQgd2l0aCBjcmVhdGVkIEZhY2VJZAorICAvLyA5LiBGYWlsCisKKyAgYm9vc3Q6OnJlZ2V4IGUoIl5bYS16MC05XStcXDouKiIpOworICBpZiAoIWJvb3N0OjpyZWdleF9tYXRjaChpbnB1dCwgZSkpIHsKKyAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgdV9pbnQzMl90IGZhY2VJZCA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8dWludDMyX3Q+KGlucHV0KTsKKyAgICAgICAgb25TdWNjZWVkKGZhY2VJZCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QmKQorICAgICAgeworICAgICAgICBvbkZhaWwoIk5vIHZhbGlkIGZhY2VJZCBvciBmYWNlVXJpIGlzIHByb3ZpZGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBuZG46OnV0aWw6OkZhY2VVcmkgZmFjZVVyaTsKKyAgICBpZiAoIWZhY2VVcmkucGFyc2UoaW5wdXQpKSB7CisgICAgICBvbkZhaWwoIkZhY2VVcmkgcGFyc2UgZmFpbGVkIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBmZXRjaGVyID0gbmV3IEZhY2VJZEZldGNoZXIoc3RkOjpyZWYoZmFjZSksIHN0ZDo6cmVmKGNvbnRyb2xsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93Q3JlYXRlLCBvblN1Y2NlZWQsIG9uRmFpbCk7CisKKyAgICBmZXRjaGVyLT5zdGFydEdldEZhY2VJZChmYWNlVXJpKTsKKyAgfQorfQorCit2b2lkCitOZmRjOjpGYWNlSWRGZXRjaGVyOjpzdGFydEdldEZhY2VJZChjb25zdCBuZG46OnV0aWw6OkZhY2VVcmkmIGZhY2VVcmkpCit7CisgIGZhY2VVcmkuY2Fub25pemUoYmluZCgmRmFjZUlkRmV0Y2hlcjo6b25DYW5vbml6ZVN1Y2Nlc3MsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlSWRGZXRjaGVyOjpvbkNhbm9uaXplRmFpbHVyZSwgdGhpcywgXzEpLAorICAgICAgICAgICAgICAgICAgIG1fZmFjZS5nZXRJb1NlcnZpY2UoKSwgbmRuOjp0aW1lOjpzZWNvbmRzKDQpKTsKK30KKwordm9pZAorTmZkYzo6RmFjZUlkRmV0Y2hlcjo6b25DYW5vbml6ZVN1Y2Nlc3MoY29uc3QgbmRuOjp1dGlsOjpGYWNlVXJpJiBjYW5vbmljYWxVcmkpCit7CisgIG5kbjo6TmFtZSBxdWVyeU5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZhY2VzL3F1ZXJ5Iik7CisgIG5kbjo6bmZkOjpGYWNlUXVlcnlGaWx0ZXIgcXVlcnlGaWx0ZXI7CisgIHF1ZXJ5RmlsdGVyLnNldFJlbW90ZVVyaShjYW5vbmljYWxVcmkudG9TdHJpbmcoKSk7CisgIHF1ZXJ5TmFtZS5hcHBlbmQocXVlcnlGaWx0ZXIud2lyZUVuY29kZSgpKTsKKworICBuZG46OkludGVyZXN0IGludGVyZXN0UGFja2V0KHF1ZXJ5TmFtZSk7CisgIGludGVyZXN0UGFja2V0LnNldE11c3RCZUZyZXNoKHRydWUpOworICBpbnRlcmVzdFBhY2tldC5zZXRJbnRlcmVzdExpZmV0aW1lKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDQwMDApKTsKKyAgYXV0byBpbnRlcmVzdCA9IHN0ZDo6bWFrZV9zaGFyZWQ8bmRuOjpJbnRlcmVzdD4oaW50ZXJlc3RQYWNrZXQpOworCisgIG5kbjo6dXRpbDo6U2VnbWVudEZldGNoZXI6OmZldGNoKG1fZmFjZSwgKmludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnV0aWw6OkRvbnRWZXJpZnlTZWdtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VJZEZldGNoZXI6Om9uUXVlcnlTdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIF8xLCBjYW5vbmljYWxVcmkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZGYWNlSWRGZXRjaGVyOjpvblF1ZXJ5RmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfMSwgY2Fub25pY2FsVXJpKSk7Cit9CisKK3ZvaWQKK05mZGM6OkZhY2VJZEZldGNoZXI6Om9uQ2Fub25pemVGYWlsdXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pCit7CisgIGZhaWwoIkNhbm9uaXplIGZhY2VVcmkgZmFpbGVkIDogIiArIHJlYXNvbik7Cit9CisKK3ZvaWQKK05mZGM6OkZhY2VJZEZldGNoZXI6Om9uUXVlcnlTdWNjZXNzKGNvbnN0IG5kbjo6Q29uc3RCdWZmZXJQdHImIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46OnV0aWw6OkZhY2VVcmkmIGNhbm9uaWNhbFVyaSkKK3sKKyAgc2l6ZV90IG9mZnNldCA9IDA7CisgIG5kbjo6QmxvY2sgYmxvY2s7CisgIGJvb2wgb2sgPSBuZG46OkJsb2NrOjpmcm9tQnVmZmVyKGRhdGEsIG9mZnNldCwgYmxvY2spOworCisgIGlmICghb2spIHsKKyAgICBpZiAobV9hbGxvd0NyZWF0ZSkgeworICAgICAgc3RhcnRGYWNlQ3JlYXRlKGNhbm9uaWNhbFVyaSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZmFpbCgiRmFpbCB0byBmaW5kIGZhY2VJZCIpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICB0cnkgeworICAgICAgRmFjZVN0YXR1cyBzdGF0dXMoYmxvY2spOworICAgICAgc3VjY2VlZChzdGF0dXMuZ2V0RmFjZUlkKCkpOworICAgIH0KKyAgICBjYXRjaCAoY29uc3QgbmRuOjp0bHY6OkVycm9yJiBlKSB7CisgICAgICBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2UoZS53aGF0KCkpOworICAgICAgZmFpbCgiRVJST1I6ICIgKyBlcnJvck1lc3NhZ2UpOworICAgIH0KKyAgfQorfQorCit2b2lkCitOZmRjOjpGYWNlSWRGZXRjaGVyOjpvblF1ZXJ5RmFpbHVyZSh1aW50MzJfdCBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46OnV0aWw6OkZhY2VVcmkmIGNhbm9uaWNhbFVyaSkKK3sKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8ICJDYW5ub3QgZmV0Y2ggZGF0YSAoY29kZSAiIDw8IGVycm9yQ29kZSA8PCAiKSI7CisgIGZhaWwoc3Muc3RyKCkpOworfQorCit2b2lkCitOZmRjOjpGYWNlSWRGZXRjaGVyOjpvbkZhY2VDcmVhdGVFcnJvcih1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCit7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBtZXNzYWdlIDw8ICIgOiAiIDw8IGVycm9yIDw8ICIgKGNvZGUgIiA8PCBjb2RlIDw8ICIpIjsKKyAgZmFpbChzcy5zdHIoKSk7Cit9CisKK3ZvaWQKK05mZGM6OkZhY2VJZEZldGNoZXI6OnN0YXJ0RmFjZUNyZWF0ZShjb25zdCBuZG46OnV0aWw6OkZhY2VVcmkmIGNhbm9uaWNhbFVyaSkKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5zZXRVcmkoY2Fub25pY2FsVXJpLnRvU3RyaW5nKCkpOworCisgIG1fY29udHJvbGxlci5zdGFydDxGYWNlQ3JlYXRlQ29tbWFuZD4ocGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10gKGNvbnN0IENvbnRyb2xQYXJhbWV0ZXJzJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWQocmVzdWx0LmdldEZhY2VJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJkZhY2VJZEZldGNoZXI6Om9uRmFjZUNyZWF0ZUVycm9yLCB0aGlzLCBfMSwgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFjZSBjcmVhdGlvbiBmYWlsZWQiKSk7Cit9CisKK3ZvaWQKK05mZGM6OkZhY2VJZEZldGNoZXI6OnN1Y2NlZWQodWludDMyX3QgZmFjZUlkKQoreworICBtX29uU3VjY2VlZChmYWNlSWQpOworICBkZWxldGUgdGhpczsKK30KKwordm9pZAorTmZkYzo6RmFjZUlkRmV0Y2hlcjo6ZmFpbChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQoreworICBtX29uRmFpbChyZWFzb24pOworICBkZWxldGUgdGhpczsKK30KKworTmZkYzo6TmZkYyhuZG46OkZhY2UmIGZhY2UpCisgIDogbV9mbGFncyhST1VURV9GTEFHX0NISUxEX0lOSEVSSVQpCisgICwgbV9jb3N0KERFRkFVTFRfQ09TVCkKKyAgLCBtX29yaWdpbihST1VURV9PUklHSU5fU1RBVElDKQorICAsIG1fZXhwaXJlcyhERUZBVUxUX0VYUElSQVRJT05fUEVSSU9EKQorICAsIG1fZmFjZShmYWNlKQorICAsIG1fY29udHJvbGxlcihmYWNlLCBtX2tleUNoYWluKQorICAsIG1faW9TZXJ2aWNlKGZhY2UuZ2V0SW9TZXJ2aWNlKCkpCit7Cit9CisKK05mZGM6On5OZmRjKCkKK3sKK30KKworYm9vbAorTmZkYzo6ZGlzcGF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1hbmQpCit7CisgIGlmIChjb21tYW5kID09ICJhZGQtbmV4dGhvcCIpIHsKKyAgICBpZiAobV9uT3B0aW9ucyAhPSAyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZpYkFkZE5leHRIb3AoKTsKKyAgfQorICBlbHNlIGlmIChjb21tYW5kID09ICJyZW1vdmUtbmV4dGhvcCIpIHsKKyAgICBpZiAobV9uT3B0aW9ucyAhPSAyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZpYlJlbW92ZU5leHRIb3AoKTsKKyAgfQorICBlbHNlIGlmIChjb21tYW5kID09ICJyZWdpc3RlciIpIHsKKyAgICBpZiAobV9uT3B0aW9ucyAhPSAyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJpYlJlZ2lzdGVyUHJlZml4KCk7CisgIH0KKyAgZWxzZSBpZiAoY29tbWFuZCA9PSAidW5yZWdpc3RlciIpIHsKKyAgICBpZiAobV9uT3B0aW9ucyAhPSAyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJpYlVucmVnaXN0ZXJQcmVmaXgoKTsKKyAgfQorICBlbHNlIGlmIChjb21tYW5kID09ICJjcmVhdGUiKSB7CisgICAgaWYgKG1fbk9wdGlvbnMgIT0gMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmYWNlQ3JlYXRlKCk7CisgIH0KKyAgZWxzZSBpZiAoY29tbWFuZCA9PSAiZGVzdHJveSIpIHsKKyAgICBpZiAobV9uT3B0aW9ucyAhPSAxKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZhY2VEZXN0cm95KCk7CisgIH0KKyAgZWxzZSBpZiAoY29tbWFuZCA9PSAic2V0LXN0cmF0ZWd5IikgeworICAgIGlmIChtX25PcHRpb25zICE9IDIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3RyYXRlZ3lDaG9pY2VTZXQoKTsKKyAgfQorICBlbHNlIGlmIChjb21tYW5kID09ICJ1bnNldC1zdHJhdGVneSIpIHsKKyAgICBpZiAobV9uT3B0aW9ucyAhPSAxKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN0cmF0ZWd5Q2hvaWNlVW5zZXQoKTsKKyAgfQorICBlbHNlCisgICAgdXNhZ2UobV9wcm9ncmFtTmFtZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK05mZGM6OmZpYkFkZE5leHRIb3AoKQoreworICBtX25hbWUgPSBtX2NvbW1hbmRMaW5lQXJndW1lbnRzWzBdOworICBjb25zdCBzdGQ6OnN0cmluZyYgZmFjZU5hbWUgPSBtX2NvbW1hbmRMaW5lQXJndW1lbnRzWzFdOworCisgIEZhY2VJZEZldGNoZXI6OnN0YXJ0KG1fZmFjZSwgbV9jb250cm9sbGVyLCBmYWNlTmFtZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdIChjb25zdCB1aW50MzJfdCBmYWNlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb3N0KG1fY29zdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGYWNlSWQoZmFjZUlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0PEZpYkFkZE5leHRIb3BDb21tYW5kPihwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRjOjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXh0aG9wIGluc2VydGlvbiBzdWNjZWVkZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25FcnJvciwgdGhpcywgXzEsIF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXh0aG9wIGluc2VydGlvbiBmYWlsZWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZGM6Om9uT2J0YWluRmFjZUlkRmFpbHVyZSwgdGhpcywgXzEpKTsKK30KKwordm9pZAorTmZkYzo6ZmliUmVtb3ZlTmV4dEhvcCgpCit7CisgIG1fbmFtZSA9IG1fY29tbWFuZExpbmVBcmd1bWVudHNbMF07CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmYWNlTmFtZSA9IG1fY29tbWFuZExpbmVBcmd1bWVudHNbMV07CisKKyAgRmFjZUlkRmV0Y2hlcjo6c3RhcnQobV9mYWNlLCBtX2NvbnRyb2xsZXIsIGZhY2VOYW1lLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdIChjb25zdCB1aW50MzJfdCBmYWNlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGYWNlSWQoZmFjZUlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0PEZpYlJlbW92ZU5leHRIb3BDb21tYW5kPihwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRjOjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXh0aG9wIHJlbW92YWwgc3VjY2VlZGVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZGM6Om9uRXJyb3IsIHRoaXMsIF8xLCBfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV4dGhvcCByZW1vdmFsIGZhaWxlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25PYnRhaW5GYWNlSWRGYWlsdXJlLCB0aGlzLCBfMSkpOworfQorCit2b2lkCitOZmRjOjpyaWJSZWdpc3RlclByZWZpeCgpCit7CisgIG1fbmFtZSA9IG1fY29tbWFuZExpbmVBcmd1bWVudHNbMF07CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmYWNlTmFtZSA9IG1fY29tbWFuZExpbmVBcmd1bWVudHNbMV07CisKKyAgRmFjZUlkRmV0Y2hlcjo6c3RhcnQobV9mYWNlLCBtX2NvbnRyb2xsZXIsIGZhY2VOYW1lLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10gKGNvbnN0IHVpbnQzMl90IGZhY2VJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUobV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvc3QobV9jb3N0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZsYWdzKG1fZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3JpZ2luKG1fb3JpZ2luKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZhY2VJZChmYWNlSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fZXhwaXJlcyAhPSBERUZBVUxUX0VYUElSQVRJT05fUEVSSU9EKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRFeHBpcmF0aW9uUGVyaW9kKG1fZXhwaXJlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydDxSaWJSZWdpc3RlckNvbW1hbmQ+KHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRjOjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VjY2Vzc2Z1bCBpbiBuYW1lIHJlZ2lzdHJhdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25FcnJvciwgdGhpcywgXzEsIF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIGluIG5hbWUgcmVnaXN0cmF0aW9uIikpOworICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRjOjpvbk9idGFpbkZhY2VJZEZhaWx1cmUsIHRoaXMsIF8xKSk7Cit9CisKK3ZvaWQKK05mZGM6OnJpYlVucmVnaXN0ZXJQcmVmaXgoKQoreworICBtX25hbWUgPSBtX2NvbW1hbmRMaW5lQXJndW1lbnRzWzBdOworICBjb25zdCBzdGQ6OnN0cmluZyYgZmFjZU5hbWUgPSBtX2NvbW1hbmRMaW5lQXJndW1lbnRzWzFdOworCisgIEZhY2VJZEZldGNoZXI6OnN0YXJ0KG1fZmFjZSwgbV9jb250cm9sbGVyLCBmYWNlTmFtZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXSAoY29uc3QgdWludDMyX3QgZmFjZUlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmFjZUlkKGZhY2VJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcmlnaW4obV9vcmlnaW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb250cm9sbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQ8UmliVW5yZWdpc3RlckNvbW1hbmQ+KHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZGM6Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1Y2Nlc3NmdWwgaW4gdW5yZWdpc3RlcmluZyBuYW1lIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZGM6Om9uRXJyb3IsIHRoaXMsIF8xLCBfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIGluIHVucmVnaXN0ZXJpbmcgbmFtZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25PYnRhaW5GYWNlSWRGYWlsdXJlLCB0aGlzLCBfMSkpOworfQorCit2b2lkCitOZmRjOjpvbkNhbm9uaXplRmFpbHVyZShjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKQoreworICBzdGQ6OmNlcnIgPDwgcmVhc29uIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZAorTmZkYzo6b25PYnRhaW5GYWNlSWRGYWlsdXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQoreworICBzdGQ6OmNlcnIgPDwgIk9idGFpbiBmYWNlSWQgZmFpbHVyZTogIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZAorTmZkYzo6ZmFjZUNyZWF0ZSgpCit7CisgIGJvb3N0OjpyZWdleCBlKCJeW2EtejAtOV0rXFw6LioiKTsKKyAgaWYgKCFib29zdDo6cmVnZXhfbWF0Y2gobV9jb21tYW5kTGluZUFyZ3VtZW50c1swXSwgZSkpCisgICAgdGhyb3cgRXJyb3IoImludmFsaWQgdXJpIGZvcm1hdCIpOworCisgIG5kbjo6dXRpbDo6RmFjZVVyaSBmYWNlVXJpOworICBmYWNlVXJpLnBhcnNlKG1fY29tbWFuZExpbmVBcmd1bWVudHNbMF0pOworCisgIGZhY2VVcmkuY2Fub25pemUoYmluZCgmTmZkYzo6c3RhcnRGYWNlQ3JlYXRlLCB0aGlzLCBfMSksCisgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25DYW5vbml6ZUZhaWx1cmUsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICBtX2lvU2VydmljZSwgbmRuOjp0aW1lOjpzZWNvbmRzKDQpKTsKK30KKwordm9pZAorTmZkYzo6c3RhcnRGYWNlQ3JlYXRlKGNvbnN0IG5kbjo6dXRpbDo6RmFjZVVyaSYgY2Fub25pY2FsVXJpKQoreworICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICBwYXJhbWV0ZXJzLnNldFVyaShjYW5vbmljYWxVcmkudG9TdHJpbmcoKSk7CisKKyAgbV9jb250cm9sbGVyLnN0YXJ0PEZhY2VDcmVhdGVDb21tYW5kPihwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZGM6Om9uU3VjY2VzcywgdGhpcywgXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFjZSBjcmVhdGlvbiBzdWNjZWVkZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRjOjpvbkVycm9yLCB0aGlzLCBfMSwgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFjZSBjcmVhdGlvbiBmYWlsZWQiKSk7Cit9CisKK3ZvaWQKK05mZGM6OmZhY2VEZXN0cm95KCkKK3sKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGZhY2VOYW1lID0gbV9jb21tYW5kTGluZUFyZ3VtZW50c1swXTsKKworICBGYWNlSWRGZXRjaGVyOjpzdGFydChtX2ZhY2UsIG1fY29udHJvbGxlciwgZmFjZU5hbWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10gKGNvbnN0IHVpbnQzMl90IGZhY2VJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXJhbWV0ZXJzIGZhY2VQYXJhbWV0ZXJzOworICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VQYXJhbWV0ZXJzLnNldEZhY2VJZChmYWNlSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb250cm9sbGVyLnN0YXJ0PEZhY2VEZXN0cm95Q29tbWFuZD4oZmFjZVBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWNlIGRlc3Ryb3kgc3VjY2VlZGVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25FcnJvciwgdGhpcywgXzEsIF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhY2UgZGVzdHJveSBmYWlsZWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoJk5mZGM6Om9uT2J0YWluRmFjZUlkRmFpbHVyZSwgdGhpcywgXzEpKTsKK30KKwordm9pZAorTmZkYzo6c3RyYXRlZ3lDaG9pY2VTZXQoKQoreworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9IG1fY29tbWFuZExpbmVBcmd1bWVudHNbMF07CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJhdGVneSA9IG1fY29tbWFuZExpbmVBcmd1bWVudHNbMV07CisKKyAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycworICAgIC5zZXROYW1lKG5hbWUpCisgICAgLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KTsKKworICBtX2NvbnRyb2xsZXIuc3RhcnQ8U3RyYXRlZ3lDaG9pY2VTZXRDb21tYW5kPihwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRjOjpvblN1Y2Nlc3MsIHRoaXMsIF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWNjZXNzZnVsbHkgc2V0IHN0cmF0ZWd5IGNob2ljZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKCZOZmRjOjpvbkVycm9yLCB0aGlzLCBfMSwgXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgc3RyYXRlZ3kgY2hvaWNlIikpOworfQorCit2b2lkCitOZmRjOjpzdHJhdGVneUNob2ljZVVuc2V0KCkKK3sKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSBtX2NvbW1hbmRMaW5lQXJndW1lbnRzWzBdOworCisgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgIHBhcmFtZXRlcnMuc2V0TmFtZShuYW1lKTsKKworICBtX2NvbnRyb2xsZXIuc3RhcnQ8U3RyYXRlZ3lDaG9pY2VVbnNldENvbW1hbmQ+KHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25TdWNjZXNzLCB0aGlzLCBfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWNjZXNzZnVsbHkgdW5zZXQgc3RyYXRlZ3kgY2hvaWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZCgmTmZkYzo6b25FcnJvciwgdGhpcywgXzEsIF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB1bnNldCBzdHJhdGVneSBjaG9pY2UiKSk7Cit9CisKK3ZvaWQKK05mZGM6Om9uU3VjY2Vzcyhjb25zdCBDb250cm9sUGFyYW1ldGVycyYgY29tbWFuZFN1Y2Nlc3NSZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQoreworICBzdGQ6OmNvdXQgPDwgbWVzc2FnZSA8PCAiOiAiIDw8IGNvbW1hbmRTdWNjZXNzUmVzdWx0IDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZAorTmZkYzo6b25FcnJvcih1aW50MzJfdCBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQoreworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgIG9zIDw8IG1lc3NhZ2UgPDwgIjogIiA8PCBlcnJvciA8PCAiIChjb2RlOiAiIDw8IGNvZGUgPDwgIikiOworICB0aHJvdyBFcnJvcihvcy5zdHIoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5mZGMKKworaW50CittYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgbmRuOjpGYWNlIGZhY2U7CisgIG5mZGM6Ok5mZGMgcChmYWNlKTsKKworICBwLm1fcHJvZ3JhbU5hbWUgPSBhcmd2WzBdOworCisgIGlmIChhcmdjIDwgMikgeworICAgIHVzYWdlKHAubV9wcm9ncmFtTmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLWgiKSkgeworICAgIHVzYWdlKHAubV9wcm9ncmFtTmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLVYiKSkgeworICAgIHN0ZDo6Y291dCA8PCBORkRfVkVSU0lPTl9CVUlMRF9TVFJJTkcgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAwOworICB9CisKKyAgOjpvcHRpbmQgPSAyOyAvL3N0YXJ0IHJlYWRpbmcgb3B0aW9ucyBmcm9tIDJuZCBhcmd1bWVudCBpLmUuIENvbW1hbmQKKyAgaW50IG9wdDsKKyAgd2hpbGUgKChvcHQgPSA6OmdldG9wdChhcmdjLCBhcmd2LCAiSUNjOmU6bzoiKSkgIT0gLTEpIHsKKyAgICBzd2l0Y2ggKG9wdCkgeworICAgIGNhc2UgJ0knOgorICAgICAgcC5tX2ZsYWdzID0gIHAubV9mbGFncyAmIH4obmZkYzo6Uk9VVEVfRkxBR19DSElMRF9JTkhFUklUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQyc6CisgICAgICBwLm1fZmxhZ3MgPSAgcC5tX2ZsYWdzIHwgbmZkYzo6Uk9VVEVfRkxBR19DQVBUVVJFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdjJzoKKyAgICAgIHRyeSB7CisgICAgICAgIHAubV9jb3N0ID0gYm9vc3Q6OmxleGljYWxfY2FzdDx1aW50NjRfdD4oOjpvcHRhcmcpOworICAgICAgfQorICAgICAgY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0JikgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBjb3N0IG11c3QgYmUgaW4gdW5zaWduZWQgaW50ZWdlciBmb3JtYXQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2UnOgorICAgICAgdWludDY0X3QgZXhwaXJlczsKKyAgICAgIHRyeSB7CisgICAgICAgIGV4cGlyZXMgPSBib29zdDo6bGV4aWNhbF9jYXN0PHVpbnQ2NF90Pig6Om9wdGFyZyk7CisgICAgICB9CisgICAgICBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QmKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IGV4cGlyYXRpb24gdGltZSBtdXN0IGJlIGluIHVuc2lnbmVkIGludGVnZXIgZm9ybWF0IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgcC5tX2V4cGlyZXMgPSBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyhleHBpcmVzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbyc6CisgICAgICB0cnkgeworICAgICAgICBwLm1fb3JpZ2luID0gYm9vc3Q6OmxleGljYWxfY2FzdDx1aW50NjRfdD4oOjpvcHRhcmcpOworICAgICAgfQorICAgICAgY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0JikgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBvcmlnaW4gbXVzdCBiZSBpbiB1bnNpZ25lZCBpbnRlZ2VyIGZvcm1hdCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHVzYWdlKHAubV9wcm9ncmFtTmFtZSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBpZiAoYXJnYyA9PSA6Om9wdGluZCkgeworICAgIHVzYWdlKHAubV9wcm9ncmFtTmFtZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB0cnkgeworICAgIHAubV9jb21tYW5kTGluZUFyZ3VtZW50cyA9IGFyZ3YgKyA6Om9wdGluZDsKKyAgICBwLm1fbk9wdGlvbnMgPSBhcmdjIC0gOjpvcHRpbmQ7CisKKyAgICAvL2FyZ3ZbMV0gcG9pbnRzIHRvIHRoZSBjb21tYW5kLCBzbyBwYXNzIGl0IHRvIHRoZSBkaXNwYXRjaAorICAgIGJvb2wgaXNPayA9IHAuZGlzcGF0Y2goYXJndlsxXSk7CisgICAgaWYgKCFpc09rKSB7CisgICAgICB1c2FnZShwLm1fcHJvZ3JhbU5hbWUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZhY2UucHJvY2Vzc0V2ZW50cygpOworICB9CisgIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgIHN0ZDo6Y2VyciA8PCAiRVJST1I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAyOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvTkZEL3Rvb2xzL25mZGMuaHBwIGIvTkZEL3Rvb2xzL25mZGMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODk1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdG9vbHMvbmZkYy5ocHAKQEAgLTAsMCArMSwyNTcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbG9yYWRvIFN0YXRlIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgIEJlaWppbmcgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkZEIChOYW1lZCBEYXRhIE5ldHdvcmtpbmcgRm9yd2FyZGluZyBEYWVtb24pLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkZEIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBORkQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5GRCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZEX1RPT0xTX05GRENfSFBQCisjZGVmaW5lIE5GRF9UT09MU19ORkRDX0hQUAorCisjaW5jbHVkZSA8bmRuLWN4eC9mYWNlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3RpbWUuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbWFuYWdlbWVudC9uZmQtY29udHJvbGxlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2ZhY2UtdXJpLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBuZmRjIHsKKwordXNpbmcgbmFtZXNwYWNlIG5kbjo6bmZkOworCitjbGFzcyBOZmRjIDogYm9vc3Q6Om5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIERFRkFVTFRfRVhQSVJBVElPTl9QRVJJT0Q7CisgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBERUZBVUxUX0NPU1Q7CisKKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXQpCisgICAgICA6IHN0ZDo6cnVudGltZV9lcnJvcih3aGF0KQorICAgIHsKKyAgICB9CisgIH07CisKKyAgY2xhc3MgRmFjZUlkRmV0Y2hlcgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MzJfdCk+IFN1Y2Nlc3NDYWxsYmFjazsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiBGYWlsdXJlQ2FsbGJhY2s7CisKKyAgICAvKiogXGJyaWVmIG9idGFpbiBGYWNlSWQgZnJvbSBpbnB1dAorICAgICAqICBccGFyYW0gZmFjZSBSZWZlcmVuY2UgdG8gdGhlIEZhY2UgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBmZXRjaCBkYXRhCisgICAgICogIFxwYXJhbSBjb250cm9sbGVyIFJlZmVyZW5jZSB0byB0aGUgY29udHJvbGxlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHNpZ24gdGhlIEludGVyZXN0CisgICAgICogIFxwYXJhbSBpbnB1dCBVc2VyIGlucHV0LCBlaXRoZXIgRmFjZUlkIG9yIEZhY2VVcmkKKyAgICAgKiAgXHBhcmFtIGFsbG93Q3JlYXRlIFdoZXRoZXIgY3JlYXRpbmcgZmFjZSBpcyBhbGxvd2VkCisgICAgICogIFxwYXJhbSBvblN1Y2NlZWQgQ2FsbGJhY2sgdG8gYmUgZmlyZWQgd2hlbiBmYWNlSWQgaXMgb2J0YWluZWQKKyAgICAgKiAgXHBhcmFtIG9uRmFpbCBDYWxsYmFjayB0byBiZSBmaXJlZCB3aGVuIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHN0YXRpYyB2b2lkCisgICAgc3RhcnQobmRuOjpGYWNlJiBmYWNlLAorICAgICAgICAgIENvbnRyb2xsZXImIGNvbnRyb2xsZXIsCisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LAorICAgICAgICAgIGJvb2wgYWxsb3dDcmVhdGUsCisgICAgICAgICAgY29uc3QgU3VjY2Vzc0NhbGxiYWNrJiBvblN1Y2NlZWQsCisgICAgICAgICAgY29uc3QgRmFpbHVyZUNhbGxiYWNrJiBvbkZhaWwpOworCisgIHByaXZhdGU6CisgICAgRmFjZUlkRmV0Y2hlcihuZG46OkZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICBDb250cm9sbGVyJiBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd0NyZWF0ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFN1Y2Nlc3NDYWxsYmFjayYgb25TdWNjZWVkLAorICAgICAgICAgICAgICAgICAgY29uc3QgRmFpbHVyZUNhbGxiYWNrJiBvbkZhaWwpOworCisgICAgdm9pZAorICAgIG9uUXVlcnlTdWNjZXNzKGNvbnN0IG5kbjo6Q29uc3RCdWZmZXJQdHImIGRhdGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgbmRuOjp1dGlsOjpGYWNlVXJpJiBjYW5vbmljYWxVcmkpOworCisgICAgdm9pZAorICAgIG9uUXVlcnlGYWlsdXJlKHVpbnQzMl90IGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46OnV0aWw6OkZhY2VVcmkmIGNhbm9uaWNhbFVyaSk7CisKKyAgICB2b2lkCisgICAgb25DYW5vbml6ZVN1Y2Nlc3MoY29uc3QgbmRuOjp1dGlsOjpGYWNlVXJpJiBjYW5vbmljYWxVcmkpOworCisgICAgdm9pZAorICAgIG9uQ2Fub25pemVGYWlsdXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pOworCisgICAgdm9pZAorICAgIHN0YXJ0R2V0RmFjZUlkKGNvbnN0IG5kbjo6dXRpbDo6RmFjZVVyaSYgZmFjZVVyaSk7CisKKyAgICB2b2lkCisgICAgc3RhcnRGYWNlQ3JlYXRlKGNvbnN0IG5kbjo6dXRpbDo6RmFjZVVyaSYgY2Fub25pY2FsVXJpKTsKKworICAgIHZvaWQKKyAgICBvbkZhY2VDcmVhdGVFcnJvcih1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisKKyAgICB2b2lkCisgICAgc3VjY2VlZCh1aW50MzJfdCBmYWNlSWQpOworCisgICAgdm9pZAorICAgIGZhaWwoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbik7CisKKyAgcHJpdmF0ZToKKyAgICBuZG46OkZhY2UmIG1fZmFjZTsKKyAgICBDb250cm9sbGVyJiBtX2NvbnRyb2xsZXI7CisgICAgYm9vbCBtX2FsbG93Q3JlYXRlOworICAgIFN1Y2Nlc3NDYWxsYmFjayBtX29uU3VjY2VlZDsKKyAgICBGYWlsdXJlQ2FsbGJhY2sgbV9vbkZhaWw7CisgIH07CisKKyAgZXhwbGljaXQKKyAgTmZkYyhuZG46OkZhY2UmIGZhY2UpOworCisgIH5OZmRjKCk7CisKKyAgYm9vbAorICBkaXNwYXRjaChjb25zdCBzdGQ6OnN0cmluZyYgY21kKTsKKworICAvKioKKyAgICogXGJyaWVmIEFkZHMgYSBuZXh0aG9wIHRvIGEgRklCIGVudHJ5CisgICAqCisgICAqIElmIHRoZSBGSUIgZW50cnkgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGluc2VydGVkIGF1dG9tYXRpY2FsbHkKKyAgICoKKyAgICogY21kIGZvcm1hdDoKKyAgICogIFstYyBjb3N0XSAgbmFtZSBmYWNlSWR8ZmFjZVVyaQorICAgKgorICAgKi8KKyAgdm9pZAorICBmaWJBZGROZXh0SG9wKCk7CisKKyAgLyoqCisgICAqIFxicmllZiBSZW1vdmVzIGEgbmV4dGhvcCBmcm9tIGFuIGV4aXN0aW5nIEZJQiBlbnRyeQorICAgKgorICAgKiBJZiB0aGUgbGFzdCBuZXh0aG9wIHJlY29yZCBpbiBhIEZJQiBlbnRyeSBpcyByZW1vdmVkLCB0aGUgRklCIGVudHJ5IGlzIGFsc28gZGVsZXRlZAorICAgKgorICAgKiBjbWQgZm9ybWF0OgorICAgKiAgbmFtZSBmYWNlSWQKKyAgICoKKyAgICovCisgIHZvaWQKKyAgZmliUmVtb3ZlTmV4dEhvcCgpOworCisgIC8qKgorICAgKiBcYnJpZWYgUmVnaXN0ZXJzIG5hbWUgdG8gdGhlIGdpdmVuIGZhY2VJZCBvciBmYWNlVXJpCisgICAqCisgICAqIGNtZCBmb3JtYXQ6CisgICAqICBbLUldIFstQ10gWy1jIGNvc3RdIG5hbWUgZmFjZUlkfGZhY2VVcmkKKyAgICovCisgIHZvaWQKKyAgcmliUmVnaXN0ZXJQcmVmaXgoKTsKKworICAvKioKKyAgICogXGJyaWVmIFVucmVnaXN0ZXJzIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gZmFjZUlkL2ZhY2VVcmkKKyAgICoKKyAgICogY21kIGZvcm1hdDoKKyAgICogIG5hbWUgZmFjZUlkL2ZhY2VVcmkKKyAgICovCisgIHZvaWQKKyAgcmliVW5yZWdpc3RlclByZWZpeCgpOworCisgIC8qKgorICAgKiBcYnJpZWYgQ3JlYXRlcyBuZXcgZmFjZQorICAgKgorICAgKiBUaGlzIGNvbW1hbmQgYWxsb3dzIGNyZWF0aW9uIG9mIFVEUCB1bmljYXN0IGFuZCBUQ1AgZmFjZXMgb25seQorICAgKgorICAgKiBjbWQgZm9ybWF0OgorICAgKiAgdXJpCisgICAqCisgICAqLworICB2b2lkCisgIGZhY2VDcmVhdGUoKTsKKworICAvKioKKyAgICogXGJyaWVmIERlc3Ryb3lzIGZhY2UKKyAgICoKKyAgICogY21kIGZvcm1hdDoKKyAgICogIGZhY2VJZHxmYWNlVXJpCisgICAqCisgICAqLworICB2b2lkCisgIGZhY2VEZXN0cm95KCk7CisKKyAgLyoqCisgICAqIFxicmllZiBTZXRzIHRoZSBzdHJhdGVneSBmb3IgYSBuYW1lc3BhY2UKKyAgICoKKyAgICogY21kIGZvcm1hdDoKKyAgICogIG5hbWUgc3RyYXRlZ3kKKyAgICoKKyAgICovCisgIHZvaWQKKyAgc3RyYXRlZ3lDaG9pY2VTZXQoKTsKKworICAvKioKKyAgICogXGJyaWVmIFVuc2V0IHRoZSBzdHJhdGVneSBmb3IgYSBuYW1lc3BhY2UKKyAgICoKKyAgICogY21kIGZvcm1hdDoKKyAgICogIG5hbWUgc3RyYXRlZ3kKKyAgICoKKyAgICovCisgIHZvaWQKKyAgc3RyYXRlZ3lDaG9pY2VVbnNldCgpOworCitwcml2YXRlOgorCisgIHZvaWQKKyAgb25TdWNjZXNzKGNvbnN0IENvbnRyb2xQYXJhbWV0ZXJzJiBjb21tYW5kU3VjY2Vzc1Jlc3VsdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKworICB2b2lkCisgIG9uRXJyb3IodWludDMyX3QgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisKKyAgdm9pZAorICBvbkNhbm9uaXplRmFpbHVyZShjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKTsKKworICB2b2lkCisgIHN0YXJ0RmFjZUNyZWF0ZShjb25zdCBuZG46OnV0aWw6OkZhY2VVcmkmIGNhbm9uaWNhbFVyaSk7CisKKyAgdm9pZAorICBvbk9idGFpbkZhY2VJZEZhaWx1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCitwdWJsaWM6CisgIGNvbnN0IGNoYXIqIG1fcHJvZ3JhbU5hbWU7CisKKyAgLy8gY29tbWFuZCBwYXJhbWV0ZXJzIHdpdGhvdXQgbGVhZGluZyAnY21kJyBjb21wb25lbnQKKyAgY29uc3QgY2hhciogY29uc3QqIG1fY29tbWFuZExpbmVBcmd1bWVudHM7CisgIGludCBtX25PcHRpb25zOworICB1aW50NjRfdCBtX2ZsYWdzOworICB1aW50NjRfdCBtX2Nvc3Q7CisgIHVpbnQ2NF90IG1fZmFjZUlkOworICB1aW50NjRfdCBtX29yaWdpbjsKKyAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgbV9leHBpcmVzOworICBzdGQ6OnN0cmluZyBtX25hbWU7CisKK3ByaXZhdGU6CisgIG5kbjo6S2V5Q2hhaW4gbV9rZXlDaGFpbjsKKyAgbmRuOjpGYWNlJiBtX2ZhY2U7CisgIENvbnRyb2xsZXIgbV9jb250cm9sbGVyOworICBib29zdDo6YXNpbzo6aW9fc2VydmljZSYgbV9pb1NlcnZpY2U7Cit9OworCit9IC8vIG5hbWVzcGFjZSBuZmRjCisKKyNlbmRpZiAvLyBORkRfVE9PTFNfTkZEQ19IUFAKZGlmZiAtLWdpdCBhL05GRC91bml0LXRlc3RzLmNvbmYuc2FtcGxlIGIvTkZEL3VuaXQtdGVzdHMuY29uZi5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1YzE5YwotLS0gL2Rldi9udWxsCisrKyBiL05GRC91bml0LXRlc3RzLmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsMzEgQEAKK2xvZworeworICA7IGRlZmF1bHRfbGV2ZWwgc3BlY2lmaWVzIHRoZSBsb2dnaW5nIGxldmVsIGZvciBtb2R1bGVzCisgIDsgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgbmFtZWQuIEFsbCBkZWJ1Z2dpbmcgbGV2ZWxzCisgIDsgbGlzdGVkIGFib3ZlIHRoZSBzZWxlY3RlZCB2YWx1ZSBhcmUgZW5hYmxlZC4KKyAgOworICA7IFZhbGlkIHZhbHVlczoKKyAgOworICA7ICBOT05FIDsgbm8gbWVzc2FnZXMKKyAgOyAgRVJST1IgOyBlcnJvciBtZXNzYWdlcworICA7ICBXQVJOIDsgd2FybmluZyBtZXNzYWdlcworICA7ICBJTkZPIDsgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAoZGVmYXVsdCkKKyAgOyAgREVCVUcgOyBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAgOyAgVFJBQ0UgOyB0cmFjZSBtZXNzYWdlcyAobW9zdCB2ZXJib3NlKQorICA7ICBBTEwgOyBhbGwgbWVzc2FnZXMKKworICA7IGRlZmF1bHRfbGV2ZWwgSU5GTworCisgIDsgWW91IG1heSBvdmVycmlkZSBkZWZhdWx0X2xldmVsIGJ5IGFzc2lnbmluZyBhIGxvZ2dpbmcgbGV2ZWwKKyAgOyB0byB0aGUgZGVzaXJlZCBtb2R1bGUgbmFtZS4gTW9kdWxlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0d28gd2F5czoKKyAgOworICA7IFJ1bjoKKyAgOyAgIG5mZCAtLW1vZHVsZXMKKyAgOworICA7IE9yIGxvb2sgZm9yIE5GRF9MT0dfSU5JVCg8bW9kdWxlIG5hbWU+KSBzdGF0ZW1lbnRzIGluIC5jcHAgZmlsZXMKKyAgOworICA7IEV4YW1wbGUgbW9kdWxlLWxldmVsIHNldHRpbmdzOgorICA7CisgIDsgRmliTWFuYWdlciBERUJVRworICA7IEZvcndhcmRlciBJTkZPCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTkZEL3ZlcnNpb24uaHBwLmluIGIvTkZEL3ZlcnNpb24uaHBwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDI3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvdmVyc2lvbi5ocHAuaW4KQEAgLTAsMCArMSw3NCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICogICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICogICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbikuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBORkQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBORkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogTkZELCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBORkRfVkVSU0lPTl9IUFAKKyNkZWZpbmUgTkZEX1ZFUlNJT05fSFBQCisKK25hbWVzcGFjZSBuZmQgeworCisvKiogTkZEIHZlcnNpb24gZm9sbG93cyBTZW1hbnRpYyBWZXJzaW9uaW5nIDIuMC4wIHNwZWNpZmljYXRpb24KKyAqICBodHRwOi8vc2VtdmVyLm9yZy8KKyAqLworCisvLyBUbyBjaGFuZ2UgdmVyc2lvbiBudW1iZXIsIG1vZGlmeSBWRVJTSU9OIHZhcmlhYmxlIGluIHRvcC1sZXZlbCB3c2NyaXB0LgorCisvKiogXGJyaWVmIE5GRCB2ZXJzaW9uIHJlcHJlc2VudGVkIGFzIGFuIGludGVnZXIKKyAqCisgKiAgTUFKT1IqMTAwMDAwMCArIE1JTk9SKjEwMDAgKyBQQVRDSAorICovCisjZGVmaW5lIE5GRF9WRVJTSU9OIEBWRVJTSU9OQAorCisvKiogXGJyaWVmIE5GRCB2ZXJzaW9uIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nCisgKgorICogIE1BSk9SLk1JTk9SLlBBVENICisgKi8KKyNkZWZpbmUgTkZEX1ZFUlNJT05fU1RSSU5HICJAVkVSU0lPTl9TVFJJTkdAIgorCisvKiogXGJyaWVmIE5GRCB2ZXJzaW9uIHN0cmluZywgaW5jbHVkaW5nIGdpdCBjb21taXQgaW5mb3JtYXRpb24sIGlmIE5GRCBpcyBidWlsZCBmcm9tCisgKiAgICAgICAgIHNwZWNpZmljIGdpdCBjb21taXQKKyAqCisgKiBORkRfVkVSU0lPTl9CVUlMRF9TVFJJTkcgaXMgb2J0YWluZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kIChgTkZELWAgcHJlZml4IGlzCisgKiBhZnRlcndhcmRzIHJlbW92ZWQpOgorICoKKyAqICAgIGBnaXQgZGVzY3JpYmUgLS1tYXRjaCAnTkZELSonYAorICoKKyAqIFdoZW4gTkZEIGlzIGJ1aWx0IG5vdCBmcm9tIGdpdCwgTkZEX1ZFUlNJT05fQlVJTERfU1RSSU5HIGVxdWFscyBORkRfVkVSU0lPTl9TVFJJTkcKKyAqCisgKiBNQUpPUi5NSU5PUi5QQVRDSCgtcmVsZWFzZS1jYW5kaWRhdGUtdGFnKSgtKG51bWJlci1vZi1jb21taXRzLXNpbmNlLXRhZyktQ09NTUlULUhBU0gpCisgKgorICogRXhhbXBsZSwgMC4xLjAtcmMxLTEtZzVjODY1NzAKKyAqLworI2RlZmluZSBORkRfVkVSU0lPTl9CVUlMRF9TVFJJTkcgIkBWRVJTSU9OX0JVSUxEQCIKKworLy8vIE1BSk9SIHZlcnNpb24KKyNkZWZpbmUgTkZEX1ZFUlNJT05fTUFKT1IgQFZFUlNJT05fTUFKT1JACisvLy8gTUlOT1IgdmVyc2lvbgorI2RlZmluZSBORkRfVkVSU0lPTl9NSU5PUiBAVkVSU0lPTl9NSU5PUkAKKy8vLyBQQVRDSCB2ZXJzaW9uCisjZGVmaW5lIE5GRF9WRVJTSU9OX1BBVENIIEBWRVJTSU9OX1BBVENIQAorCit9IC8vIG5hbWVzcGFjZSBuZmQKKworI2VuZGlmIC8vIE5GRF9WRVJTSU9OX0hQUApkaWZmIC0tZ2l0IGEvTkZEL3dhZiBiL05GRC93YWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWY5ZGYzOAotLS0gL2Rldi9udWxsCisrKyBiL05GRC93YWYKQEAgLTAsMCArMSwxNjggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBlbmNvZGluZzogSVNPODg1OS0xCisjIFRob21hcyBOYWd5LCAyMDA1LTIwMTQKKworIiIiCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKK1NFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCitJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIiIiCisKK2ltcG9ydCBvcywgc3lzLCBpbnNwZWN0CisKK1ZFUlNJT049IjEuOC4yIgorUkVWSVNJT049ImEwMWFhMTM5NjM0MzdhMTllNWQ4NzQ4Y2YyYWZkNzFiIgorSU5TVEFMTD0nJworQzE9JyMvJworQzI9JyMuJworQzM9JyMpJworY3dkID0gb3MuZ2V0Y3dkKCkKK2pvaW4gPSBvcy5wYXRoLmpvaW4KKworCitXQUY9J3dhZicKK2RlZiBiKHgpOgorCXJldHVybiB4CitpZiBzeXMuaGV4dmVyc2lvbj4weDMwMDAwMGY6CisJV0FGPSd3YWYzJworCWRlZiBiKHgpOgorCQlyZXR1cm4geC5lbmNvZGUoKQorCitkZWYgZXJyKG0pOgorCXByaW50KCgnXDAzM1s5MW1FcnJvcjogJXNcMDMzWzBtJyAlIG0pKQorCXN5cy5leGl0KDEpCisKK2RlZiB1bnBhY2tfd2FmZGlyKGRpciwgc3JjKToKKwlmID0gb3BlbihzcmMsJ3JiJykKKwljID0gJ2NvcnJ1cHQgYXJjaGl2ZSAoJWQpJworCXdoaWxlIDE6CisJCWxpbmUgPSBmLnJlYWRsaW5lKCkKKwkJaWYgbm90IGxpbmU6IGVycigncnVuIHdhZi1saWdodCBmcm9tIGEgZm9sZGVyIGNvbnRhaW5pbmcgd2FmbGliJykKKwkJaWYgbGluZSA9PSBiKCcjPT0+XG4nKToKKwkJCXR4dCA9IGYucmVhZGxpbmUoKQorCQkJaWYgbm90IHR4dDogZXJyKGMgJSAxKQorCQkJaWYgZi5yZWFkbGluZSgpICE9IGIoJyM8PT1cbicpOiBlcnIoYyAlIDIpCisJCQlicmVhaworCWlmIG5vdCB0eHQ6IGVycihjICUgMykKKwl0eHQgPSB0eHRbMTotMV0ucmVwbGFjZShiKEMxKSwgYignXG4nKSkucmVwbGFjZShiKEMyKSwgYignXHInKSkucmVwbGFjZShiKEMzKSwgYignXHgwMCcpKQorCisJaW1wb3J0IHNodXRpbCwgdGFyZmlsZQorCXRyeTogc2h1dGlsLnJtdHJlZShkaXIpCisJZXhjZXB0IE9TRXJyb3I6IHBhc3MKKwl0cnk6CisJCWZvciB4IGluICgnVG9vbHMnLCAnZXh0cmFzJyk6CisJCQlvcy5tYWtlZGlycyhqb2luKGRpciwgJ3dhZmxpYicsIHgpKQorCWV4Y2VwdCBPU0Vycm9yOgorCQllcnIoIkNhbm5vdCB1bnBhY2sgd2FmIGxpYiBpbnRvICVzXG5Nb3ZlIHdhZiBpbiBhIHdyaXRhYmxlIGRpcmVjdG9yeSIgJSBkaXIpCisKKwlvcy5jaGRpcihkaXIpCisJdG1wID0gJ3QuYnoyJworCXQgPSBvcGVuKHRtcCwnd2InKQorCXRyeTogdC53cml0ZSh0eHQpCisJZmluYWxseTogdC5jbG9zZSgpCisKKwl0cnk6CisJCXQgPSB0YXJmaWxlLm9wZW4odG1wKQorCWV4Y2VwdDoKKwkJdHJ5OgorCQkJb3Muc3lzdGVtKCdidW56aXAyIHQuYnoyJykKKwkJCXQgPSB0YXJmaWxlLm9wZW4oJ3QnKQorCQkJdG1wID0gJ3QnCisJCWV4Y2VwdDoKKwkJCW9zLmNoZGlyKGN3ZCkKKwkJCXRyeTogc2h1dGlsLnJtdHJlZShkaXIpCisJCQlleGNlcHQgT1NFcnJvcjogcGFzcworCQkJZXJyKCJXYWYgY2Fubm90IGJlIHVucGFja2VkLCBjaGVjayB0aGF0IGJ6aXAyIHN1cHBvcnQgaXMgcHJlc2VudCIpCisKKwl0cnk6CisJCWZvciB4IGluIHQ6IHQuZXh0cmFjdCh4KQorCWZpbmFsbHk6CisJCXQuY2xvc2UoKQorCisJZm9yIHggaW4gKCdUb29scycsICdleHRyYXMnKToKKwkJb3MuY2htb2Qoam9pbignd2FmbGliJyx4KSwgNDkzKQorCisJaWYgc3lzLmhleHZlcnNpb248MHgzMDAwMDBmOgorCQlzeXMucGF0aCA9IFtqb2luKGRpciwgJ3dhZmxpYicpXSArIHN5cy5wYXRoCisJCWltcG9ydCBmaXhweTIKKwkJZml4cHkyLmZpeGRpcihkaXIpCisKKwlvcy5yZW1vdmUodG1wKQorCW9zLmNoZGlyKGN3ZCkKKworCXRyeTogZGlyID0gdW5pY29kZShkaXIsICdtYmNzJykKKwlleGNlcHQ6IHBhc3MKKwl0cnk6CisJCWZyb20gY3R5cGVzIGltcG9ydCB3aW5kbGwKKwkJd2luZGxsLmtlcm5lbDMyLlNldEZpbGVBdHRyaWJ1dGVzVyhkaXIsIDIpCisJZXhjZXB0OgorCQlwYXNzCisKK2RlZiB0ZXN0KGRpcik6CisJdHJ5OgorCQlvcy5zdGF0KGpvaW4oZGlyLCAnd2FmbGliJykpCisJCXJldHVybiBvcy5wYXRoLmFic3BhdGgoZGlyKQorCWV4Y2VwdCBPU0Vycm9yOgorCQlwYXNzCisKK2RlZiBmaW5kX2xpYigpOgorCXNyYyA9IG9zLnBhdGguYWJzcGF0aChpbnNwZWN0LmdldGZpbGUoaW5zcGVjdC5nZXRtb2R1bGUoZXJyKSkpCisJYmFzZSwgbmFtZSA9IG9zLnBhdGguc3BsaXQoc3JjKQorCisJI2RldnMgdXNlICRXQUZESVIKKwl3PXRlc3Qob3MuZW52aXJvbi5nZXQoJ1dBRkRJUicsICcnKSkKKwlpZiB3OiByZXR1cm4gdworCisJI3dhZi1saWdodAorCWlmIG5hbWUuZW5kc3dpdGgoJ3dhZi1saWdodCcpOgorCQl3ID0gdGVzdChiYXNlKQorCQlpZiB3OiByZXR1cm4gdworCQllcnIoJ3dhZi1saWdodCByZXF1aXJlcyB3YWZsaWIgLT4gZXhwb3J0IFdBRkRJUj0vZm9sZGVyJykKKworCWRpcm5hbWUgPSAnJXMtJXMtJXMnICUgKFdBRiwgVkVSU0lPTiwgUkVWSVNJT04pCisJZm9yIGkgaW4gKElOU1RBTEwsJy91c3InLCcvdXNyL2xvY2FsJywnL29wdCcpOgorCQl3ID0gdGVzdChpICsgJy9saWIvJyArIGRpcm5hbWUpCisJCWlmIHc6IHJldHVybiB3CisKKwkjd2FmLWxvY2FsCisJZGlyID0gam9pbihiYXNlLCAoc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgYW5kICcuJyBvciAnJykgKyBkaXJuYW1lKQorCXcgPSB0ZXN0KGRpcikKKwlpZiB3OiByZXR1cm4gdworCisJI3VucGFjaworCXVucGFja193YWZkaXIoZGlyLCBzcmMpCisJcmV0dXJuIGRpcgorCit3YWZkaXIgPSBmaW5kX2xpYigpCitzeXMucGF0aC5pbnNlcnQoMCwgd2FmZGlyKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCisJZnJvbSB3YWZsaWIgaW1wb3J0IFNjcmlwdGluZworCVNjcmlwdGluZy53YWZfZW50cnlfcG9pbnQoY3dkLCBWRVJTSU9OLCB3YWZkaXIpCisKKyM9PT4KKyNCWmg5MUFZJlNZnclMdAMi7////7wCQH///////////////5CGBqKmeIASgSMpASEyBIRYYelc93isHCMpIykjKSMpIykjKSMpIykjKSMpIykjKSMpIykjKSMpIykjKSMpL7r61T1b3Xt7ntLhr1q7beXLs105eZtvjzPPWh7du73191PS+zVLbbu299eeo9804NZM1ZdzDqpfXi9e3CYu622YfSvcZSMpOnp7t6Htqh7sHPe67FVnrZU6dtppPnvXjZjXzd7nwe8+alds+vvt98aGu7d93Xe99nD0A1nbxt7a7sc+769tvAXYdiy2dcgjKSMpIy4jKSMpeewjKYPJbIAjyCgGAU3b3sKcwBdZxmDLJ0Zd22e57qGgB7YGg1zqtiMuBgFC7akSoUkFIynXQ3YWZhQokqoSAlJd7dJPY0FUlAKUlQUVUVrJSSMuN6Btg8ttqunt3Dx69469W3bOFuzqBaxkFbZo0k0SeVUsaqZ6Uy8e3b17d999O33butx7GXz7n17WWX1rvO2O8zda9rNO7LtbVvNu32K+93OtG69XDtu2aOQjKVKmxqgQIy+ignskkFGHlZuZ3LuvM8aAIymhe3ezFR0ltmSJa3vbvdtwAaAkBARVUAHeZ7uaXVtprY6Zvbonudrtzt7wyd63h1u9bvfd5tu3zt9ZVUiSOmxW1u3UmpjXbfLdb207Z3Bzszodyd8e9U9rbK7143jfe9z32rXe3vVYWmPKntzXpryNSkAjL1Um+948mTX19vO9PVCuk9u9w45vs77ydn171ndc53vb3u11Pemvve81Pvd3s9cdvtZp2wd7uq1nurve7H3r3AtvSh3t4q55nu3Fdju3kevbNve8avaqtKW8dbbO7b6qlUKSbjdu733Nc7Pvnu9de+fd2e9JXt7OPtnj5ds0uLfdo120d3bZXcue7ja95129d9MwAXpPnvN7zPZvg9uDdNzTgFACoVCglAvYd2ayabtyjrYjL7l1tJznH0bm+R09HfbyPLqXVfO955Xb0qU4razBpRGXtsZKj74stt58c980UFPfXOhUIymH3s3u5X3d3ne+PvvbXOB4777u8XudRL3YW66PutOb7221HW93Ym6jGg8CIy82z16Xu7XZyauByb2+73VX0V97rvM+9vEyfevh9IAD1evvru9Xr1HXu9A99m+pX327sHq1u2pbfWjt7ue993327d0ut7rc91vHdw+udbe032w2ted3OeF7W05Pctm15O+2qtI29hdu5lBPrNOVLBrrfXg+JoMJ00PqvDUfW4y02NX3bPOee97B8KIHQGnxIy46+aadfXN7uD7KdudO3vZzm9Mem8Vbn3Gcq98SbW73d73Z9fVp8843vSffWH33u0G3XAOlBssppQyi+x3tb31i+fdUifW9gAHFhCn1oe4PtgPI6CmlAbMl2rPe87uwDzZO7neerGm8+1vvvOAyBQdCzVQrZyH3sOPlC9OHt6x27nc0PS5zm6Vzb7qPWd3W3em9tCiqSL124naLtyqd2febmhPs59PdrKuvc3usrvse2e93d6++9d47Xxzr306lX3q3Zufe2vduqU6cnTve3eRTvYrTqtXpXr7eMt12e97tyfea++xLUW1cryO9et3k3YPqGvi0JTRCIykgASMpBCMpEaAIyaNAIykmjUwmpp6po08oGg9Q0xNND1PQ1BKaBBECAhMImmmQKYEnpo01GKNNqek9IaeoaHqBoeojKSMpIykjKSMpCQSIggIjKSJiEzIjalT8p7VTzRPSmepplHpG1PKPUyAaB6gjKcgGgCMpIylJ6pSSCapqflQfqj2lNqemoaepo9IjKRkaIykaIykjKSMpPUABkCMpIykjKQIUkQIjKYGgEaaaTRojKU0CYE0mGk9MkJ5Rsp6TaQ9QIykjKRkjKRoBJqIggIAjQCaZNCAR6VP1T2im1I9lEeoP1Rp6nqab0ptQIykjKSMp0CMpIyl/+3zb+rbbV3RJP7OSd1Y1c1rN329tqbsliaPhttTlKSkgiloQJIuCoiMpe1ZAE+X2/PLOWD/m7L9lQj84/TBM2OOph5ouJIU1ZMYLlYiDjMUzZI+Cb43n9w6fQf+0k58QUvmkIDqCXViBQSMpuy8Dvl8M3YRzRb4TTcy61HG3qqWMjtI45pzI8yu5SY4west8LTjeXVmJHh7UwXQ+HrFxL2VCnEq1SpTE4nFRYbNb4JI7xvZ1OEAh/8Twi7/kyHixITSFKNJEYYYqhKilIgNDSojMgUqDQMQimyqEiK4gid4YHEkjKQNpRCjeRR0oECOiVUiA+yEMIA4TsAikqhk4msKVpCMvQdSgoCnmBVXbJQSAUGDMSkMzTEiEyIUYzaNmaIkpqRSxkTJSjMUtpKhqZSxQNCQmjalRtJQYREoEmaJsoWyWSsygixsLGhNMKUGxpIybEWjFEUkpaaokGCWWkjUkgmDKIka2k1QsGZpsaWJsjFBSSimkSMTTNi0ajVNVpqqlJNZYjJMkajaCmqWrGJmzNKapLJlmqiVNsTGzVJJUhpmSSTUWzI1IzWjUhGyaZoKJKNFktJBaKUqkhmxiYIWCiZpMTTYoYJspsEwgApEMZgQEKmSZEoiTCyWyQJFLEBCKyWRJEpCEKSUlNikyQVETGSlJtQlqCzGobIqGLEwoopSBgRYDJRJpGUTGLExUbJlNopJlpBSRNBiyNJGSVKKKZhqkKmkUTYYkwhJApsRqSyMum0SQbIKRJioqIiMvyZCmbGCSTUlFJGRCRMyIzSBJmTMxkrMpgaEsYiQiSEqTYQkCSTTS0GJMmiylMGzaI00ijQiiFKSASjNBpEmbUs0CLKUUGJSGk0sk2aZRoDUsUlmRsaMrJMxJIorAM2MskKiSyBsqIy9ZmjG0WUNkozKbNElLWmwaGITKYwwkakyUmYUyUs1GksqVGxRMIKKTURMSZEElKCmgBhJGSGmRpEg0EJYMNaRaGayEMzSLJmFKQptJskWyRaNJMkkoSiyUNI1gIo2BgZMsRSMukTZrMZNSWNBKbDKZpTEJIy6Fpk0RUsYs1NikyizSYkoU2SSFlFSRYlNMFAxojaDFJk0pJmGybJoyZCoZIymEayTKxMNoLJslASESSyZRkIppoMkZTKRliMFpKVTZrG0aiEyCZEpIitGNsaSZrIoaTGjCSGEZUaQyQEsS0bRqUjFFYktJkZmikwksiJQhilkjKVo0mQxlRmkjLptVLW2gpKooyamgayUGykjaKZKZJjGslos0SNMZTNNNkpSi1MjGzbEo0KmyykZoEKFLX4Kt0bIWVpDISyjJTWLWisWio0JmVETTFGyWg1TGpapiKGwaWIw0pBNJGsxsZDGioZahNUWRTWTIbGUWlRpFoWJkzGpaWYyQqLDMymqzRpkLWakapbDWNNlEllRlKrFNWk2kKzZWs1JSw20xQpkRYrRpqVElplFEZY2isbZmjbJVZmqNVhIqSjbY2jYLJRVDREKopCojLhaxqjUM1IbWITWSFEW00QylElFIJojDNSiU2pVGo2STaMakLGqaTNq1m1aaCLFhBZrGyyJlTWRJlpphSTNqpaimzNTSpmtKpWStShCY20qZSk2pptTZFGxSIy5s1mZkkrLFBsGpLaW0shRamkbEQGBpsaSjSIRRsBIRkEQxCG0UyTAptRtSRKLFMprG0pNNioySaDSUwoUUimVEWKQWlmNCEGmimSmTGsps0MaJCUNixZkhjFKzUlgMbZlkyyzMFSEbEyMvUsmNgwmxURFGxsSUlGRoNIsyi1MxsxCkrGmEzYNGTYsTDGzLUCmihLFERSIVKbRkLM2ixY2NijQiojSWlkimYLQpZaDCSJMVkJpKRlNgyWxCktIkk2alEJqo0qmZiyMuipTSbI2kyizRViiQzCiSiUkk2Uk0lSWjKRszSIaVNZZsbQVlNlYqMTYpNNSTLMmipltSMmUtGyUlGbIklEsRMaDTKNFEIy5lk2SlDExE1JCRaKxG2E2LRUaKNsRWmkwyTNElBSaRaKYjKTYpIgSxYNstNJJUhgKjWTMjLiUsyGyFaNGwhtGorZNGhMsjL9BEEkVktioMYwwoGik1SlE1Y1jKZmhCoqSTaYVJRJaNkNEWWbapizJqLFGJKyWhpTSxpSU0FElSySpKUpSjVsQapSKLJRorGGUbJY2yaSosbbZmKZRsprIWqGkmbJFJsWGQQiLFi0zJQzRg2kwaiUyxItUojTCZS2YilGo2otiqSEKhkmNARgjKao2jaZJYqSMp0GKKTCJNWlBRaU1Sm0lRWxrG1mYrJazIIy/RbJqSixTFKBkjNGNmhEkJjZKYNGDNsQUVjYto2KU22koZaIKxgMmoqJCtEzbLLUbRWLFrEkm2pRmzZDSysSqMWimWKqak0rKMo0UolkxZUqLSFRRWTaTbJRtk1YpNpTMosm0aFI1FSUaLRrbbNa00ZqGyWIkqZRtFRrCgWiMuJqWzVkxTFirRRFWK0bbFotto2qGWTWsRapqVlUTZSBsSNpJjBsrCylFkjZpURQTMbEkSSZSTIiFqTWLMtUx8PvN+aa/pedvH8JF7381cq0W9Zg8X/TtpDjZOoyP9v/L+3lO0VwkaHGRdaqIkTExZon/SRZhw/6v9VHwjLqUpsFRcQcif+mdRlGz/qfaQK9s9aQH36TjIbgdULYMZslGlVaUDdUkMpukLRG6dmSMvt/81X8++IWsP0u6D/0bD+z77rsP860kyaJXM5EQVTBSztrtZYiI8jsLCCREjLhO2buBddfhezD92pztxMJ624z+ohU7px1g7FaNRGUwEQ6c27YjpVGalNUaNqjLZJJSkqY23X0LwamNrtPBiraHYo8KiNYqgVXdDa0rJVGUwwNmkjkqSNeTYMqiFKijEtMoWzWilUDVXs9H8Hr1K9LezBc3NRslrMVEk4lFiLcBGBWl3LoqLdUAo/vOr3edsy9m5SY0YjRu868U04p0ioP/vQ/2qBjArMYdqokHEnzYuWtExEe3DeNEjLi1Xx/26ND3+GcJ2Iy+FlbXaHSqPNlCFslCAp4Z0K/xzkgLjTONQuojRiO19W++g/2k8O/A6TqSlIVYmQ1OJTfUTbEo9aaaO5OIrawZxZZwV/zfxZ0gLDgNcWgWacLtQRChhQjG83PMZru50XcaK5uUmkKTKRFUBQ0JXnI7CE3lDaEo7c9Gn0wmhjeyVKCpIHCMoa4c9CD8jL1yHbtTYMji4b311cCMOGaeyEK7zQJKQ8Wvx217p6XuarqW3s1BobdijGNYyMfD53t6WSILqGDR8OkVaOWCI3FqpUrIMHuQHIDcGblyTd12HddNFQb3qt5539y+aqxRIKKHklZoaJQiAibNbNbiBTkSUxX51S+qisfwrTHlT/zXpgmWD/0KpNkquWcYSKhQVJaF4qBTIC0kr+Q8xnc+zIGl1ERTUziXJhVaSUfhVa9ty+iMv5/dFz+jx6Zns4qMaxnIyP2ZfDEM84Y6yQjjjeuf/UoO5NU4CFcah38aXZM8+NX7EnbEScUOhLuft7X3LUJjOb6L3G8zlIbNQCAIQkfZgcgjGd7hDOqULDNPW6BjbQdnZVxEwtGQ70teixtFYuzCsTdYvUoRQWCXnpePo/DFGHokqJ01os2ag2NKDGMbntZdTK+Hu379axJsjLktI7Rz/lyG+juvYYyQ02SYyN+X67TIyMcDN7KJhzdcWZS8VDhcpUX/stL3FRnaTpDjG5MjIWVtpr9nSlGMWQifrIe4u6m0VGivHMyybxXNdA0gfZaCQobusqkpdpzwwPZaomf+zj3fuxOo3MSmshyRMwMWimtFgxiMJUnpy5X2PXz+3qraxoRZbQgKdedYTCReSFCeIhQktJSQimEsfPFAbNICrA7XLY0nMF44yjfgzXM+DjSWyYWojLxzOLLMkqbE2hNiYwO41GYwjFkPFoFRYXVE0o7b0EPXmjIP+kaLoKYAsmvlQHPbNj+VE5ZKhhEQXStrNm+lq9SiQte/vtPI3NupvhLqRgoU0owWG3O7Fk3GQpN6oLrRC0iS44B5Qaot7KZiyEwgjvxGmGmtKbM0ERmRA7qotpVE07bsBv4eXLBmBqkpnb2VZEFJMFUjAXeuy4c26JGNifaRlfKZ4PEMlqPdiIy6ytbaWnGWRTIQ1FHxI2ebhtrprIy/TBtnWRFZ4dlQ8WYBR4oG19OFGJE76pvuqX4VRmh2R0Q99zlMeM5a7GHudjdpHvRJXJ7Ks5OmVWqCFV7XN8sIHP8FWixVTOhDQF7jtu5nhVydoIy5sEQ7Mgk2IWoEGxg/V5VD9pPPamIYQkY2mw6whHGHnnjc/0vpffdNH+nr0vm0uqGw4411ZhD/H0rkzTII0gsPJoFifbb2nIvpyh7E1uHXskUYQwCoOlNAhEaHIaQ9arG3YjVykHjxhZLZBjevZENlZLt7wwXh/Iy/lxMhxMJTdf00VNuGvR8qPnw5DYXmvf/UnaAlMfrIcWEc98farPl4z32G3ysxUO++STHG788ZWMV43NSZ9VTRCPy0+0zM2VAm/c54LqiMhc2zPZAeqE6Q/pkL8hg+UPKr0qYerKHUEyT1S8od4Ng+foxdXHs0V/ElGWReo6F/abpH10Gi4+XnPs3cbf2uOxwcnfmp/S09X4cdZLyh55YXCSM4ZbDRjmXhmjXwlBqM+787sy1ttg+JnIIWqpm7sZdVE7qlIL8PdVvvaHL423RQktUVYufF5Y/z1zhUGEGDm1S45PRt9VIXMnaFMxlKWhdaXmpW/hRr6tKNH0HBcpWRGen15cDJmKBt7pU/skDhrz3x6bQa8If2NFrhpitIjLjTe/vxZhzRQueNzDgFdIy8UPG+1l8EqPu1rrwMw41WDwrYTJiMvHWqVYjx9lky5efKpqMigh7TjXJ1cojtt44nbM0ZTarRC/v/Xif05MrETfHDGOKFLimq55sud9XfFlvm0kUlHQUFIwhusn8Lk+9TrUHPnRtT6P9MSodHZENFjINPzhjrflCj1kSYjLurrGyZzIeaqn6hNAkZUuaVNz7YqonUhO66hwhc+eMNJarICPG4rdDY93Y7osQkwYVpoby8zUyW7FwHO+Ay2UP2dENMw8EptYqJpU3bBd27ENPhu7v4M+5l9r4sISNWfC45F1+mfdkNmOCYFZ0tV34Z0zfrjZNSk5hhIxEaL3PF5vTojGMzL4t3ru2J5scGFIm7eGjRBbxnlLl4mHnq00QhppgM0P2X/himz/JVQj4bHgZeNUCh1kgHFEiMuxNHytVjc9lRXWK2Nr6tfMs/J/ylj83sUCSFa6FwRR5Q3rnBja+dr4bMrfNNnC96rJBR/bBT1niMu2bi4askZxDzTHIaba6pi8Hs190V8obY6EfHW8MG1ixkenPnuop+jMpjI0fk6j3H4UZLKpgkEUdCofJC4Wzo4dHhT7cxVNfo69KuNBNkD/UoQLOWlf3kI9xIgRwabHHqw/CRsz3a74GmB1aCmJEX82+GLT76m91EXYurAQQWCgJikbkkgcTHwiD3p6JD8p94oVDpwSUc8fS9cgR2xNeERGNbU+3jjF/JvaV8fpMPme/e5qUYwbI/Fn48B1q0x03VEzxfrZTURaVVCgo014tFr2ZxsOMlR/dV7546QzHTFPK020GeLIzxnWrdI3xJ5+UrYdOlqGgJBO5wzYuzEwIooiymgXonKqjDzZnA0KMe5PHcvuYd3fHylO7jGLmW/w64Vzt7cxMyccrLto5KRpjZt6pGxnSHC8oWpEca7GOmYUkETdqaU/wu9Z4Vp7ak8lxwg5odpYQJSmPJYREh3If9y89YiiMm6PNmPL4/henfJO5hvwing8pPT76LDD4XmfTWs0hulWVFh4EejC1BFYhxZkQuOi7956j+mMoVxFjzBFPckpfvnHlumdEAieB0O0SMpeLH8GpZIGqqayoTfTL+owq63K61vfkEEbNRsn4O+nJ78Nv5SZFPV+0XLkfwlp4bkyjQkIQSjeaikZ6Dsegn/7Ll6f293jXRLmbkJw1IcKM46RdrpjvpcKjvVSSfLr40s01M0ITcjkZURzww2Yq6YjgQswWaueGxVJWrya9KTU8Lp3b4jLnNXpXqpIqCmlsw8dHPS4gbko5byFL0aodIE+sI2PTRBm5F9X1HdRu+/Et6YeNNXdBsbHeM2TK0dJ5Um51WR8Q/2Mtz3zHqjKBrdwSdcozeYZ15/r/bN0Fdgc17vIy+ZB4Pt/VF2+vobwMZw88ZBq53l/UXqqvl+W6s9XuHVHG5lAvi+YdrULhc/FyPXfSTnw5t+B4yghGFKa0inEq5elIvk77+bsfjXqRfA7Ohzu7+86ryKqz0/fVW9Q5mHZPJE9lTT6uVHjsRZCeejVI5+e6gcXdprvxcgWpE4v3S1r06HMluqujRuep5enG8D360e/2Jt2agmaaMUbNzxqbNv3KDFERv3dTOZ/X/DG2Ya6BTz6Y8cQUDV8kodUSGru8Q4ZTYnzeCsQlB6j3b+D+7frpxY48pPQMdE0MHHONcB8RwRGCGgKxFqh48+3t66djJ48cFklIcmQ+fssLMjLiQ3+dQD1vR61rOB4405EpgemVq5CCMv6zvrTEeLA8G9ZxgmQjbIWykbDxfSxPq4+u/nrWmZInr2c6BszSI4yNruZ2zBrhM9e5Odcqz4SNA8iNcW5xEVpiOrPYUj4jht00REbbSbttL59ai4Iy6T9pDwsw6Qt7emfZo6Um5gULCM/q6QGE1oOhGIuHXe4KdtwJN+Iy8RY/Vr+pr3PWPl7wj/CSyNj3M1pVTUF1avhhozjJjFIzPSsZoqKOKKJnpRcWRVHRMXQUyhBqqSmun8as+j3aSg4oZgqMEb6YTJ1Y2ndvY9jCYRt6t9CTF3ZAefv1smGq0DHgNcMqYvzemaMcjftoTPIy91tdrcI++IpGIZ0whH4fTCyVSMU5Hm5npQQxS5/yMp7FVv/DX68YOFvbmuXKh2H9HaJctQ9hf50UeEqlHE2KgllvuTOdeGAsS0pfatmcrn44hNYvyT2SQ20Sj8ad0hNwlPWpD8oe48kMrM1tZWKGJW9UKJ+FLK+W1+dcLyPwnPVzWo1k+PGFZjjrUad9nnUVmAxppsY2ugzYPwy1fc52y/pyK9bxhm2kVg2ZtmLbFkyUflan29VSY8Kh2CWcGvmlFpShndnRlSeDc9jteGPja83Y14NKDAtiMv5TXiEOdNP4R+5N8k3hMGI5id1MHJVOPHLn1UrydyxTi4w0H0eECEmlDouHOud+Fi7G0JmhELKLYMwJhCgRYjERIwW7LzTcwmMF3EQ7UMo6FHo83VmKqcHYbGH0aMPuQ13zNRnv154yMvs6IUdlShm9VU2o3SY/llbBVkL2eyymJhopN2nGJZ7eGZhEH27SMv9nB53G0scjIM891U+sS1rFa5H42sbZsFBdXLP4FYZt3ZNMNUhtojLn35KXFTQX1aUZufWh3vp+nCWeyJfPnA6yeuyBtGPvZKEno1evcYW1KCsAsCKqi2XcoUPqc9a1iiaBqM0OgRwrJWLTxNYBlUommmC6QgOjUZE5kg00WKEPDFZQMJEZmpKFKolCiiN4pXFVL1bqkqSlKvHjxcna5GVpaAaaKgm2AlrTGqssv6+7s9MaOklCn0d3z8G6Ar7k5qtdEEdcJJedOkkt2ElSSbqwFW33WWVSBmDiVmH3aLmSHLpbrvu+1mZgtZmYLdNLztJGF3gcT4s3pNlJxxM0nsjt/2/JX/DDRJzodbnNa7NdH5atfj0627fy4L3zqnsO+H5m1fe65omqSHtYWxjsm/FMZWFhNFvbmKkjzt1MkHm91MMaTOrL3ZaG1btiMvObopbKRKGaJqhd0kbk1Eu2RZHGRvHU2jX5Q9Ht/ujnbmIyl4ft0bWKtXWSEIOBfK3rb6V1qDKZcJ8cu2029S9eiTRU9Zm88XJIng81Kjjpr8XF8T3L+uV/xXj+qkGTo/GqpaFoXqFo02TPGxo8+saMa1OzRMnJwU9+EtlT+ihHPXFJwqGXK+qhPTVGJ1+uvUrBW/LzHCfN0fJstn7aQQKJOQxkcjLt9mjn2bTeq7Ja5c3NdHqxcztx4OzFW+rDtnq/u5gw9R+repdfTvdp/av9O53LQr17w0JuE0U/ZOulN8FBtZPg4JzbuWuIuGqyPb9czQgKd0grvNqTa7aPV1H3/KLT6nBsffAvi928dvHPWU9uLrzL1aiakZFHuIRfbDXrMF5MjSbSWNbaKieCg2mN9IE4Ydu2tAXIr2HEuUySt1/augSzy5t1D5WcP24zznnOO2zBH0XJAwHPpU5ZqTKUyG71fWmrDfSvg1rWWFoDPkdhxpJ3Q6EKvK+153oaiRZm9+959aKJs0n7Lhnh8r4Yy2IymyOWVLdW8f21t6sy2ZdfAoJCHdtag/FEoEsO/mko1JeSmtS3nqFCEPdza/QWVSKDtD82quRyMvZJbSHl9MWRUr0/HfXKSbhDsr2GLvon1lWdiY8T5aG/jWk0DuiZulcUZaSB+c15CREOQg2YWHiJETS4vaILWMOXp7jpHK0KKQ+JcjL00cJ2N4Z2NCDKpBZ43Ggyfe11mmd+VeKJIjLsZD5OMjLlCYaxMjLpXOFSwZJI+fA9tdH9Ds5q2xjoyeOzTplp6cXmrZv1qccrYwkWx1zqWydDX0PFb60NCap+lyDySzlqq7+OjdS936NEc3Pq2E9aXRyzfEzJ68TN8JPbcdA7nCdVdFso9V779L3bZ48NuHX6MpC/mQBP8jL4D51UIF6jhy/g9PgPp4JOzpnHVSoUeCSzo8SFUjg/YstUWN81/ZrkQf3JrsYzsvnUSz7YSq0uej8Cj/nxrpWXu6bN3rneXSj4t8kIEkpBIwfTFDh/pw8/u+mlHikif34Zi7S42KQhKtayA6SB0jLkObq/v83Pvt6uZKUa21Uvbg+d5z4r1MZ8OygV9tu0k49MLrfy4drpxXbJhG5xv5PFr0xlfmT7cY+2MIrjf4VWGfUF8y9KTK8oNTHlRaRy7meEQIfM6b8yiLkHby7jrrpMUi8PZDru/z83jtnGa6advppprsrFsXTYUJnwc1X4RZDmnblsKnwOjJqzlMfLOKzDYsS8+6urSU/vUF92Gg1PMySV60w2YtzaqrRSWKhSMvuTx3O6eZt0UR5p9dxg/dL4K1wztnWLIkhU2P8GJyemOp1H7Sx7Swg5qV0tNGrXbIwNdbkld2Gys2nK3SrMlfp1qd7Hd0zLmMk1VUrLCJxm783G8loqca1DCbH7KPbhhx3bpVMLW3tfJVKuKthKWWDtdcdaKV8Igkiv6a4McjmrJJ+7bVonRLFVw0+x7Lb515WBVvOjzs1JTNfx35/Xuz8UcytZuTXH90padHmP+gKt0n1/4f5R42cc1KQmEyEJZtrJBjNcXmR8kPDKrHVdDFEMm4uw/I7/wFi637xGK5ujHBl48uvDnZmYLvezMwXdjEB5HYbHw+6YJMCTCRSbGv/K7T1sxOFxHWq6So/P5Ld1lrU7L1BRpz6N5gdSJJpciDuDbTy9Js121lUctEdnr1en1fVadXZuNoMwyJz3O7932TPcm0rkVokWyLRCCxM6HLRkOfY6OW2HyOB2KoaOHHpVVMKsoB02FrzVsz9l0Xdaifjnbe0mDShgxVcm4hqkzA3/P99cXP+V7rrig0aGB0wMhzUj57ZTucq86qYDETFIjtVGqE0EWKoD2Pr+1BIZ+O9XSaVvlwhnFXGdsq1M7eU7WGaVf5+VyV9xOoSFV7ruHDj8dKpI9n3F/JMykk4hGur5q9mehKvZvr1Sr6QcvrcohipIsIq3AgReHRuPxMSO3w1wsZGHm0J357mmM7dW2Yu0SunE2O3/g7t5OI23+NVB/LdbFGBuzqibUCl3kJeGNu3009NLKVXWTz+SMp/20YPATDAaQmQm12Nh2IE3q78/U5GG1BhXZernJqUepDzgm43v6Y6eJNgY+1WVD2ND+F43WJmtJ35tUSxlJWN1z/V8U8bZu/xV7Pu8Zle63HFhfk8uCPxuqzB1TZa12Us14yef6HJJT/T/QP2xcjL+19PxbtFWnTuJf7LtaNFXl4yubs/V5uqRRkg1RdMa2zRfmV6FuVJl/Hqqw2KGgcckKD5HjZofOaevHEHTAbSM3+33c9s6qjFBQkgTJIx5PmP8ii9pvLrtKZv+aD53+fRnS2Zs0ysmVDio+k75OoVROqR/tfhmw6m5ehbu6V99v0Vt274YgRQnEwkXuCetRhTI0IdLlTZb/D+OfpLNRvVL7PoPPeV2xelBjOGtSSQGNSHdxqFkvPZOqLTW39SHZo7QfH+31NWzUIYML059qajrsjPl5szvDW+5lmbwmdIyncq7e7X8Tx8PbAZlcxpiG0LTjpz0j+Z6gEMhI1fGKUdHg7su85pT+n1jPw6xFh2TQkjXVeMHg+0GgRbIzL4xLsf2fvuWktth1duTfl1Zx4/Hv+p4tIQPt8KV8uNBMLBLSMJz/ihTJr1sM/PU7xkIN+OTbgHGit6gs0FMYM+kVTGYP1XTUMz56e3i7SPfH+DP7o4bF9WgysMzuKumJ+h5xbGn3t3T4TUJmeND9FxFsBYya0lDn3O1EjpufS8ntpyxd/8/22cW4sLhDxkICVJ7oHIy+lRDD/r5IjL2p7EeRXuHphq0nFw9RqnS07lnjHNDD2/fnFajTQEy0HRFpwtlvqwX6a6tF5RRY5eqbzdNV2rRsrGsVWvtf6cv9ILNnJzC6fpkaNNM8VoW+yum00yiMu2BWdCwawrU3a83Fdc/sslUNj6HVt7uRnIx/iVQ8seqLphvwOuYnprp3/Y7prXC4HTCETI4Sa+n7LnCMubf5LGealvZNj+pSakAd2Xe5BpJ11JiMp7flNnv/h8W+ndaXQ6jUpaFjZ1iMpYkUjCMx1TJztn2VEmveUGCIDC22EztFvQ00IS5qirA5rIZhTxzD26Op9zmV/ZruoJXPQ3zvAQcEoUV55vD3dwm+yumrLDidhsphh2BiW9zx3iJwf0cbsemK6RvVh9u8GWM4EsI8U5AtDv3YQpNjoJEyITMDiHM/AIy5VldFu+mHE1ZaPtBGShGGR1FoOnqy95Y+aSEQel8u7+97Vvv52FN0zfQNamYQmCzbpPDc0qepV3KbTwNdE0m6HIZVZuSJpQEmB6thzC+GJ97z1kho157dubhlp3ZPZ2qHZ8M43ooml5lgtiZ0kG0tZBD5z8vvNa9yIloZtgieii5TrDq0FqjTEatBYls6Nb4sUgqzFFCkjL8VmMyMvLYDGpHELMds0Ws0ONrTSJ073+BBeF6Zx8LqNDvwX/CWCRBAhCA8sd81QhCWREqMQEWCw+ZrjOG+w3xqnUcaG/7f7ZJA9++Qk3HbcUWCS3z7cXCMuIM5ip/teWTtJpGPpAROGOOOasPkjLkIY1LrLO/ycAe3YZsywRITMIDJUiCEzkPcft1rT6XnUMPLc69/UhSeSZ8/qXvXbGuJ8YvR26UPy7lopNjPw1JK/V/Z0M8ba7afX/LGDHxxx6a1LpS5gTZ252EX9PzrYTCu0c6byOOpsTI1oz1qLlKZdLNPUmlRxC37Ru2LnzuIH1B8S8+XSKyMujBjmegK2Ri3anxXl4uZvAp0L3XjsYMz1TYQ0fxc/JcI0qhZhnEI8xvLpo9fP1JfE3Bj8mlOnk52wPSzzyN+3NuXCd89d9GL0zXtvTgmMTYFjOrZiZabhyCMucPbMKBcI6eRrz8U0aiA0mTmzLztEt4RaCyQ6yHBSKcIyqNjTkx8eUsJJOThohw+5tyMEXOXqFMR6o4EJGxWlD1WXYgal59n0uVT+nV8/GrGIfts9na6SrtO9dGNjzchI4iq9wdHc24K9ugnaFusjGUq7iymZF8JW5GuQcVrXsYY7787m0yR79HRD+nWCSanUZwz46u6Y3LfXHu0MujiYFHMedBiAMfj/H4GcpK2BzJs1894CdXyEPWSZ6xRFcpV7XgwPhbkWcntvqCHfVMnHX1XG2TeWKK6RCYf+EFSiXJMUvsnJpLMS1IYEim728t6Xj0wwid013VedyNMSRod27DluVFirxfDx9PnulnRrX363n5cX25w92nw48UNDCEOaSkIosasIxtqkwHiKYMYVjEw+OvLAzW0TSW2qKLiQFCQPXUrcy3kuhmE8ufLOKyMu3zstiSXaECTS7pBxHEMYIy/UUZHqFFJySf7/5UVswP4OIrJR+WHA5LojhYcIb5oiMeskBYuthmuDDtbYRcocYq+KPWO7HGODsur92aqPys5aPBojL7iJtJNojRCRbq1gu8mQq6ojL3dDWRFxExECiKIHeZmG89OO80ZLbjmIhqa1Sjq4GtisJ08etGMMXEOmTOumiTfxi/x7ZA+ejaL585OcJFHfj+4jL3n29TRRkLWnZnbXVP/rW+O/rrQ1cX15vtvAZkjNevi/xwcu9/dNJHQjL3dmcfgz8Ymh2LgiEDrgMY1RwYLWbRpozGp8b4Y2sGWG1mg6WZrQmL4pqgHQFdC2qnEOkkyZCY0Ob51aHmMnEjAnAmMM1Aak6oMlINjMID+GMQtR61UJTUOk0xuCoktFCc5V7rHTTKyWBoaSL7/DWk0zz+lTP3a3pxHgQXqwIy8SKJwjL5QwMMVr51t4JKi0UzY1mpW2olMlaTnNJxka2iMuZo0JtKazBDJDhYxqXeLhgOghGqBaBqURe9NjbOaourla0iO/VpuJ4cdsQErE46uz7VO9yqK81uXXhXrwKr+JMrpjFXYrbL6CJPgipKz6Z8wV4152tvQSfN5gFwO5iaWOXLeXOzeUy7dn66q9+PX9+9uFwbYjL1TwayN5EpeTflpH/a7EwqtDwsK529r3ov+KrL6vV6tOWaL83Y95tZtmyJM6buo5X8eQMxK5upKHrAyYZgyCxpEGRkY2MTY0WERWQvA97MKz5ZDzv7Z6sm6mK0aqJQu6VW5doh7RwXDKBMMxTOHPHTUyWu1Uvx3lSfXME8VgnCg1HCKYn8nOJCWbH8f6YbmsfLcZ58uiWPs+q5zlsO5EcI/aTBQvyzGnqPNQgslMN4E4lR6cEz062pG2c+qg2kHQ2w8L3nFP46SH5RX8Ozx1Wrbnj2y7+k/FmZgxPr0MczECQ5o48bODZQkQsO4xmDN3QUi2airglz+7ps08GSMuiOOCVQE2/GSSgVEYN9T0M5JYx/dqC7djHpmBSH8SDj+zTDwx4WOkgOtrq+5u2L21CFVSIfkyjQxgq1+8+h/jPDXp2nA6HNmB5ae8jBCh6rDAkuUhhtCvSQwXuj9SMSDowka+LwxSOGRb3USDcH3vu8vhelCp/x95s6pLTNMBtNMoNJTtZbIq0ugy15qGJaa6YYqsRsKLclatie2tJmMMRXtPXnTqaXa6diMue7xmqN1Q6RYDbCJ+MiBjSMYEjCCgZANGppdaN9Ji1RwwylojLrMjLwIkyJhNGwTMixMiwsjQCZKgUwVXLCorKYSDSbSQ0MSebOMOPpvXnqcSZmaEktxXLNeejxSqV8DpBBk9FsRb+ZzNVe7XdvfY8Zjoxr8SyBqG6I0jznMDRLtPRwPJBPli0YpxN4kiEY3DOInVX2b66vAjnDkOtC6r2xHLThTMAT3PE6pkPj+r7OVQyY7kbTMJN5PULZFrNcl0hYlNIy/sl1k1rN+mfZ25QdA4Xs2QJvM61Au/TlR4/1jgwblyEOQdQwSTvPa6YWHUsW8jKaOxUoqtMNp6ofC/4rmCunxy1JkVFVFRTMlnQ/Yrphy6dsYw+UojEqi248SKDBTdTHtRKVvJhuMlax+aMF+2nH191ZC7d0oCKvjaSVUMtBhowpNk1O+2CyU4OTyunKulDNanOr47Pr44SZDdATBt5kkDKYJ4fFOcMs4xAkI1NSMvs/wvUTGPIynyanmaGSG8k/MoTO1kikcMiox191ka2Rc9+NYzRgzZTBsjLjMd4+ivJ67fZ/nBb3wnaMYpdDrjSxxrKlJEAtDu1JVSfhVHMvPbwV7MzB4Z1iVqDBFjwpCD8Tue3jzebew5ZMRvZSs87uyMRziq194b2YwYfXULDCKhYOuJTywR5/K9YKWEP7Dwoniz6ei+UpYpYy5E/dj4mGFTYf+rJTrS9kzFwTrxOffr1v9h22fcgQuqYJNpIymBDJ7XYo7WlmvjPjRxsyvTA+yYtll+mlEljGV1Y5s06bS2Bj2HKpjOqGhOYYqlILIopsYLc22ubSRVGtG25a2EoTIZgWy4bbOERRtZZPTNaShislC47rgaJaRdflxzg4nMPlnG04woQEeJSc12MZhjau11/M7GboGrKTt+IVPkfI6QVXFmZg+kAYdmZiMuOoy6/nxKNLRTUH0tzHn95LlxJ/dzDJpmDt0vLd8VsX/Clfh0ljHVPWYbnUaDJzRM1nXVY1o20xsUfD8u5vz1HLUf7D2aOvA7mNKbZN2H2u3Qjm6G9HOWd7q3Bcua6c2K/NVw8vNq+bWZb6Vyn2Zy2CP1qr07hg9Q/3V/QelHK5Y1On/YuyMv/OjiZlnX5cZxibX65QlRD7lOyTlVdTr6iergO3JJ3rDyIy9HX7J4E8s8G53xyKy4pMJCNtQ4hJ3nAbsvt0RMxvv6JSyk4r0SnnkYJphTpq6evGnoveKde5/rFhu8YqRX5OZqPr8mnjHPWZ+g1md/NNuzj88Fkz+uqQbX8kBk0JSqpZ8Dlb0fmzusq82H87mmxSMvpvQMers7e7dovxX0Lq5jwyMp8Ly/pr/FXO6fp2dRcIRhtPwYh1e6dQVb+HD8j/w0SPynpO73n4uzl1r+vj/Dh4/J9v3SbTojLj3Hw9UbTfSh3L3N1Qx8R7Gd3IstqJhslISkFCpeENW00x8dR6DwwO7d5fhttmXlqWR/CzLTkV/P7tNDcnF5KyMu/GvLlRSOaIoYQlNOWFqynhyGIknrr2N/00zotH5Y/B9vjqa7mutP7bMCodpas0Qh02QcgmonEvRqFdXnnqq8lhEQYxjSi1Anb+EoGN6GWkZAslJGDihLGawLIz9P8iMvodUf+xVDH+T+rNoyrl+//V/L5+XwZmYjL7VaMJA7CWErS6XMdr84vw7Puiz5W8NlOQ5znv+dfqFfV616+767YiwqFGsRnqdrQRTLUlk+hXMmJFSpYlSfXcZiaS0qNr9T7dYuC0FAwZGZhjhA5AaqDv+Z1Jo/i/YfJdHj2mBdPd/0ZH5VYFeFGraShVwnGgdJ3WEtFphYJ+9DAhhn4X1uaKy2KKK0UWYBmYAYEG8OpH4BtjQ15WyCEwhNmhqZeR/HD66HrXezycgLYaSUNepI+pGMLEv2dv339fcbvhttFvWGz1BI8oSSt91uV6v3ddbX3PXURtojLC2IeD3hZR+SZQv/iVY2kEYChtCmc0Ie2Np2gMITYkMCXaIikXiyHskE2IV3Iy7xMCiAN5fabj/i/DZ1czrM1VEasl1HNijQbTgm8OSUanHZxtC1FIhiYiX7yjMeqesFbUT/vkQYTH4iHFLOD+cjLo0SUFG/YSh5t0plDN+w/O7e5ngiUjuP5s7NkbOqbaDAIQWzTAFTY/HLsf9wT6YlM75UfZlJZ8k9n+a8Vrk/WzokP3GKhdFBBEPX7ZyNa6elXH8J2+2BHiYcMY4HmErMKSQ4s6zBQvqD4oXDmNJVSubx07frizc91R/QjgX+FwMIgiTYv16HuOmbXEgyKgYg6LzIZjfRFTGZ5KXIenjc/2wmqRn4P1ZjtiX8sMLOkijz2RFUpSfZhT937KLWT9VhXVnSOWZtIYMBwqHTQQR6bFCPjQ6ZhICSDruz/dYppxw9sDpR72PlaPlp7/xd9nXv9HtD58z58P2+eP76c9vEXRZHRLol5Iu5pFiNXjp+Slv4z89f7/rw6jvJnMvQutfjfXo1SnKr6qrF91Of5z4iC7Iygv1vp/C58+f5+i0lov7+5jOyqOm47v30gOlBIG4b7PMiFrOmrRL1vG7PP4RhjlfXWUTrrFVCs6MPPt19miyn66nDrFWctmN+IYiUOcr1w+Mt2X/bUfnipclth68P6z8/lq5VfHG7Aq0nefplqSMvzmg3aNkS5n8dGXKWwtSxSdgjKp3Z9xVh2MqCR/FnVNBqXhOMM6wfPmaj2s7Ofl0uS6PYo0w+e4A2HDQbgSMp1CXtMyMvTsHw8TJFjFE1fCbkfqtsq1REc+rovsZTtju631ZavRIUnNvGyGx0amw5p96uWYMqOOjyPMtNhjqQVSob4iOM3GvQfR63b+VzmtN+I7T0n0og9xOfKc0jLh63ceUH1NIhiQOO0m4Iq/jq9q8Sso0cyIEFUosE3owm7ZOzjgNEVrFNf169mQNAUn2ZuJC0pGqhpYN5hAbadhATn+PsXNnOlxvC/1+l+GoahH/Jv06YtblOxlMMnpiPtsaX7iTwh+jjG6mfywjG9NSdAjltkiY9e4lwI41Jr7fXTyepR/f9cFzWitmuDCw3wbDpjfuMFaqFCLERcIcDUhg/pj6ILPkX2l0rE2SbV3oZIqiBPlTgIpOYj4pOVpxfKio1lUyR5ix2IWM2eBLYPsk8jHw+mmhpp8mUyqpjOrQhPIlE+NlWZ+FYjTNMIDRCQGEi2me3mfe9fWdbz5cB5AmQsnOZZrTbrseQYrg/06YCRfgnbkO4oRqIJJiRW+y957Hb9Z8jKcjX3aEksUBikmSYdbAEaZLMnMKVwClGIiqr3e3zJsnh3mjnVJaDRquY/QzMsPwR8FItQzPNH3gz/iz2M2xMxVXg2FslNtsljCxALghL975SDgEZMJBAZKSbWucGJ4m2MiYxJsk2l6CB+rrLIy9+VPWvk/hw/pvz+7v4fz76uev2ebJvs9Z9CD7AO3nt68l3t8V9vyMujZ/tv9+vj+K+85/nNYbcYPfpwsxN8jV6KqSq26MclP0j0NiPZ3n6tm7TqMPHbjXfhq6/xUqz59v2vcqWp/0rz4b8aVXHCX7/7Z8xTPocfyMuvdzU/vw76adMrVqx3anIl9MpYr0dio/RQ34yn85827v+zdzHmy9a+jXv/ISOO/o49XLd9lOBHHjiPwuDXJ+f4q6vTt0+Hn5jWZevn9nr1Ho0adh8Mu/9AbGpHXJvd/Z8PTqrj4NNkCt2BlTgvs1eTe+nO3q2X8pULceyTacevwmIVuid7et29JSewrOYc/p1bDw38uOG3RPR+qeWqvRJvf4+2LKtm6K7MdMuGxLntcXj2/mwy5+zE8eWptH9KtGyVthHmsn2kiv0Vde7ft6LqT7ct9fKiKLU2avXM0E+ntPYXTPo/V0lt/nVVXh07+eviV7I12Dlst67KeZ1h+K0s0ab7/YY1O2Jn5Oi6VXDQ2n0WVemHKvyZc3WdG2/TZefQ5cZzNm3mL6VRVDxzj6iKTRZKUu55x9/xyMuu+U6b1tVa8/Vf077fGqVxu3e7VqSv1j8lPy+/bf5L9nt6PLcWxyjPdpefocjm53bXIr92HPw5+mqw5ui3Dd7b65bnsTKokvV4Boo3nriK1Yv187so1S/3Tvq4c/yHQSmdCKXToRLt+jwa6WNND+39Ezd+EbWer2Hy9Hf+hWfN7+J8sjTGaEX1RpODz1GMF5snX8pOXkf9Nm/0Z3Fkdmn6j0kXaeTXFnn2znFHFts6rMgnqv/x+Ou75CTxWGUwyq7/wbMNFx+PPKrs3y3fF6Je46jA37L1+Hy+flVVk7dP8XNCa6xunIf8j7fl3/q05F8zd8/9lpgV+azPSpllKSX9B6dNenHyvr9hhjz1ZfL69dm6hcfIy5vL+z3YOWHGr4Ro/Ftb008ftzvu19tT/plHrT/D4WSn07/5fb01S4ZR1FVvsvlGzJuYUYJL3Wxtc/2++7Sya5zxuLtBp8jLoSyp79Ad92jdjutlh7PV/S36tNq0cDpPlN/+7+fD5+/7fosIy7n68ujbhPn6+ep9nr9tXX4G6Oj0ftKfN2YSKjEv0EjLuXPN+z+b2fV/g5f3eH9zSfpsHRfbaNrCKabMPRGktPNokvf1O21BX3iRZG5OSKBNxPT0D83Me74pUVZ+KdEHzsi9hhr0wOX1BQlYZaeBKX2fPr+QNfJm/dV0d51dev6vXzX8j/H3/d6Pq3dvpLu89Xm3kH55HDuPCum6vdPE7SXL8TIrs633aNuzVs+v7fUtSH3dH+3xG8Ux2d1v8tHUeXu8fis7v19XOdnw/P4/oLiDyncek6uk/YdTfc3A2NjrwYHb9VrPWeB8Po8OLfZ+P81XG3L6a98mzbZq6L/hWfEVmvyt/bh1Ybr9HQrz207vn+NeXdpD4vzm+w8/eKpKi9otUh2R9prX7uY4B+b6152sbs7+EAPxHmI+VP2yhuoR+urbFGptis/tGQ7IEIb6ProWeSb07Bh3ZqxpDciP6t4nRh/OZpvu7uruN5gls+fkeX91a5t+/77ZJ/xxyltF6se7vfXdL9FnK6xKt/nXhZhbWy+dHj/D9eV1jVo8nZZ8dWWrH09Blj9O4VObnbX7LL+Os88M1bHP89t24x91Zr1rJQwJo5ndi6GauN1LYar4oIvw29duvUaGVhcrR0Z3SSw0tWDmpXcwrp6C+ohqxe1rK1uT1WPGE3v2Lqz5bKWW1Z4JfHtq5/hzqqqevXsw69F/PhnXzg5XwO1OJtsr880pyiHO3n+2J87c0XaW6IhUt/s5pc1M0Ymq2aSTkXTG6OyewNJPf+Xlr89hXo3ewZZXy9mv78eHd1++qrwe0N9exNCdUodwn9tVpH4K6NYaLeZPFXw3xHwlEc2Xd08cIxpWS0BeulKnfjDQy+CrO85XBox2M1utXCN9XqTMZTzvoKBR+1yFw8xbsiJzE/471jVn8DEeuKeO0V16v0DO2w+Aio87tNxrl+GLQxjLCM6juslBpskhcL9hndwEvu99dot+jg11+gxL8i32+7Zz32UMtueedKOZ+zxg5fJb/PwKbLS/l/Ak2ZzlEK2p2Cevo30CXWtbaNJE7ntVy2SLI2cqyCbLdVZFoLifL+zfaIT0y0fThL7TflQ7O6y6zoLW+KR2eOyqey/vurtrtbnE354nN7OcRBzVYESon89XKX1anxQVGWbOabtWZT9/bZgV52f4Sv68IX4H/LVZ2eevZu38/zfNSxTOddWubvZKKeGLyF48zj/P5fdOm70/jOr5c/Nv9p0N5C80CPObF+n27o4QetcJeH79w/GStmn/X0e+f1Z9l/Ph4+3CG1cp/Ley9EeSG6qN5MDw5sb8KzLEbl0fpl7s7/H1+6hl7jYZy8gZm9T65mw6PQklPnzP7aiwTUJ8+RgvI7+Pqx5sSX7SkyGstzur+qv2IrZdnssfWuojnz+qzH/P6gkm2CPTC/vL/NhXbV/kJgZmXMjdbchEU+eKuxEhBuNPD79YjGjUGGaWCNpYRwRBzQorRUqSY4mgK0Q2OGRYxVQYoRhRFEVU1Im0jBhtnL01trbWtxOkEsGo4MyExYtYIOK0mw0yTRiLLjIyLYUWUXaEyxZDCt0iNS66eVGuklKgpN4zYWE/LH9eMTimpkDUTNFRt9kRD+lC1OLJtOsX29Z3N6zIbka4SUFB/4eOWd1h+1TGSTP0xQ01l0n3/z2hrUZl1HicTjSbl0c1EURDFGbmUUiWUOgHJjkxFPHQ/RfByR0Lz3lgIvYcLxYYDho0iQaGUiJB0dKBrKvboWhmmxkGmNmKorVkSMuNDUUmnanB5FGyunaCBEoIP8kOMkEx6YbvwmTfDjd9GFvhVlp1b/kK/x0+FOleU+gho/p2ZW46amqeRga7Ni165F1KtPwrt8m+3Wbf321Z7NiX7vX5rs/Oelcf0/i9OmR+7Kzlx2df2nbUxtyb9WrFr8+2lVfzWp3Pf4PldqXjg99tuPvpSMvfwiwew+mskWJoL+pvW0mokhW80vWpeoxa4/Gefs936f0PV7NWv1dSGvZCF0J/SdfKTDalc73/i4w2GC2fR0Fuj8VL+XHp6+rKrktt9SN37oulJpSeUniHiuUXEF5B5PRhP+Pb408lX4vR+zVWuXjRFJd38n0Hm+S3gjqmv2+f4/x1Wy/TZ1e3r/lh19/VX97N24W/rq/br9mkoFZ6SJ2OfgLyWXBm5zzfK5BqdoUVv9h4BJjTSlJTTkI/JD4uUEH+u5jGukQwrDxyMsMhSaVuMEsbStHIy7gqYkupqUYASNogIx4yjRGsrcjKWmzBNxCwyPAbINMSDCIrHIJlCWJimIMc6tJtQbO2okHhC7xptt3NacdAQwFmVk5I5IjLwwUKVolGKFgyKVNpsSIwqViaaaMuLBseFZa0p19MRoQ8nUle1JvcKb5pswI8G3RViMu1yMpGrB1MTIoONtDoUcadHFGHSTed6cao1g+Iy4jLzkIUUIhgNKAMCGmBBK5mES7bYQQwGmGShaVoB2zR1xV8aiOdkpogyDgKSKUqBsxozIjLmUfEx0i5qUjLiJOKkaeFMiHbJKpYmw4JAhYtcjDWDBhBLBpFSYDUE7N1sLZp7b2YJM0wbIIiILGKgurSCFTxEj3YsfaordmlEj+1iiMTNRVVqacrsIk1Cih2wWGOsMjKZlooEsrUoPxIy8RnJncKHFOO3BHrYcQw3E2tSVNjjNNRV6tbt4xYZDfgIywj4+f5H0FKfDY/3M862/wXDokXn1u9lcI+I7XubYfDOzLt8un/VV9XdV8zeRb8PBkt/bn5yh+K7x3nxy87b/oPwwa+Ft15XZrlPUjLl4dca711qxSWc8tjRwyq+vXlh/df6vyGwOv27u77ZHDZmzds5NHIy+axvUb26Shg1H8kNsXFM6dFUN+CPfXLvoPSlKSmTiZtx7uY8qv6rV2m55dWhzqEVGBbvpUqFC3D6sPD12ESs4d1nTob4tmJ13VfYhJzwWnhnGu3XKST66v2W1VIy/a/CTlszxu5TcPCOuXZtHHU8qmioMGEBjpUuefTR4qmSO/L4yRxJguehBciBS+S3DByt7A5Dfy9zGMfJqWWekHI227ZJ+zIy+79D5HaKpeoaVh+f0vP8z+iwF9v9KvLc+7T9Ec1DAjLvvUtDxSFq2cZ9U57/LdUXZZeqCcxXO/Yeuki5SzaosnDEMufGqprwPYkmGcWBDBzDe3hkUycGQ1UgREl3MmG3jJOs716VS8I0XZJHAa4sTB/oySoG++dOR5ZySEQ6al5iXzt80uUujgW13JycmaPa4IRQPB2O7MeVMzQW9FAXAFig+1/BUZPd3s5Yf/Hz9Nrx7ByhsVTj9sfiQgDDLLJOh1a1x/o3Mxr1nEz2YjLv6jROevJ7PhxMY38Itt22awu1dIbHsjLiI56/smSyeymDme3Bl6NRw3UZrKqXsUbn4TVrv55TSS3mrDBlaGvcHNtZ449GxRPa9S2tcMmsxW1j66b8X2VxK6ccR4om5yJ6pePjZd9f1uOb0zohAfIJlUzuyS/BK6xptqoiMuSEcRqRFiaiX+BitiU/ZKclQmNQQQiVTjw7sIRCCE6YfD76vR7vwbPVZ8/efj9D0d76YeHT9U/poUbU4mYQgEhJhIQmieBpirnhklIy/fimgmDzTOoJXsNBL1TDGIIAjlWGpnTGMGbG2FmfXkmyZmm4IZxLpiNU1YwINESTzTlZpjkcXsoFYU3CsIyMVyTMLEjkldy0GkVGDQyitRYBV8HoeiRTdO2bQVoa5cC7vRwXGg1XkcVbLdQFHbvWCztvD5GImkjCMvUjrKwaLQ4L+RHDNI1y0WolaRHphi65BMe0RtLOLc8DZAqwZBnV8jKczJYwXgHLT1oZxqiqHt6dp2hFrKxjgMYNg4DLTU6aieoMGxRLRWjkossSMuBTbKBrU7UptGjkXOCSMuUzU0iKkuFW20WjEilHGyoJZjAS+pGwE4TM5RLSMvF/Mf1/8SSbDnTi4xed5K00uxVFjDLWRKViidWsVKwxQjLwnwyDwtW3MjLj77JQNmDLsjLvi6cDZMqdOKis6YFqHHFiHRnP4c+/5/y64ze3uDwPKR56fNxuj89exzIy5Wsb0mEQh0mBMc0QUfLSqB7IfodSIhE0EI9hWOQ4OyESRP+7q6LGNIjzHuPZ68Otfk15QPu13eu7g05ao8YSsPf7kvxo49HDD2YH4T6i/QfsIfbBXld5xBbQmWBcfzozBFG0hwvODDltMeYZZ8KkxNarMZ6F4QvdhoJKWxMCxOjtdSI4NOQJGRIkdgxqGqT5SPTekE6RUGzrgUr/d2i4NJQhqcTrY1ppmkyhA7dMKdpsGN0IHNSpRjGsOC4sSDuhaqNLRooUWOAYtsgSRt6dosHV3ls6uUbU7dPX4Z41VQJRVZNpJE0XMFjXpoi+bURIFKb/Z+HR6OH9x++pfp6M66/kl9XXT8GNVfR3U14/b5PE15eHq/n5LeXY97QxzMQm6HbqKI+2n6mG3iy8cSaCRctKBSNzY6Njtuz4mO9tmMkuOyC0wWKCMvDhoGmFIwdiqRugy3YlLQlCJrVCljORhUaW5RjWk3HEQjIYVxVfqJCxYDqiZXKi1jkacRS8DFW69lSyHCmZOmri5nSLJkxIWUORiotUw8TMsZkzAslMqS2DBa0w460rfAGhnXppV6WnlDDI9aVWD5b0Y/waRlXMrfGIrT5nDvOywZBi7vMXU2Tr253wQ0FGnIyFKGpyd2ElwTJN4cmwwiHGjgw3xQ61IVK4XxSZM5sWmWxi8DjiZcin66uzQWXw7EKHROIGxp6MgooRR2KTdkjEOoQnGU3hel6Tl+eK1He3y1XtppTrq0V6g3zmR7Ib/P5ezEdvtew7nMUo2T/WJm3N41mLNVsbGbm5WZh4GbesyTsNBwmurVzlHUMrNN2BhqI3zBxeryek3cqncasQWGb8pOxcuGuXCbOVOOz1jtJ2Dr3kezCZY9kCYVweS804swnIvUhL9MBKS/oc2bM/ZtGG9X5IMJqZiDpBIjLtpCdm50XIOkxLTWWTEB2ZrRvlEm0UcjLkLjjbzlY+sjG2MjLq1N42rG3I2YqUr3MMysGDI2yNEhVSqwIQaSqkRLKFbNIy4OsmY6ZYa5q31u+c7+qq8jLncZKw9fx785zgEOIMYjLTQSx0GywNtM1YhtWBQFplMUiqVSCZddZNMZ10eDwhp1j/giJMD0GlI8nBSVpgNhxgPlJGn2a4jeXNiGoQFoG2Ep24EYW+dMb4Y7wSMvjFMsZhCclwcy4aais3zfwIiVh+1tvLfDl2ZMiNYRKqM3R3y4ZzDCb0YXkmJKQ5XiwgGzIgbUeU65n2I0Iy4yTZuqHU7Hib2aDCEmaEwkJAd6O3WyhfPjZWDbXy+c74vAXbQOhJrt/Tjza11NoSvBvl8ogdZZh+ISSSwBlAsg6ZqGot+A8uVQWTtdsNwwuDiDiy35Rhi8GCHfcEcjcQVuEoeYzdCbs2s9a6RDjZ2NXBEjLxEnIiMdqjtrUwdG7XxvnB1dYTwyRWiHhkruK68nTZk63tsMZ3w4LNK5wE0U2awdOQw3DEh5Zzpiocf8MZms2zhNwdc1S4Kw1KJJG6DUIYMGBxql0CxeCyixoLZDtK2YsxNuxGL6OSW4tXJgnmq5tnwsKCMuNWSg4OrOTNJiMAnwKIkesPpx78YilV0prLEgTE61fjbw9VpckDeodPRNQRmf0wRlgsZ5fl4e9tte1oMntvK5x5T2mYR1l8PCplMR4+ixPe295kZbc+TlvZ2LUcOXgfhsKtFxfOlilTYv4ZbvrFl/43H0PogmM7JHIvE5X+giuxqrnfeCJfQ8Q6CHonbYsiaftGJmE9CfYu6guZeSVdxHcFaq+9upt5ibcqnw+BZlniMvmMBlRjEdtVWch3yTU522LJSFCdIxUJlJhoxA8fpXh5jS15SZkdUZkRKbphqsvGUQ5W76rKkjKehCYEkYe2UybUMMqjXk6zd0ljnQ5pkwmQJA08RyQ5KZd/95dsv5Q8X3mafx071e9Nw+SE/Y9HYeEi3w8TF9Tp4WcGczLxBapeS1VstTzkIfMiOsOYpN/e0OLE95SlpxXBnk7arBollErWHiTm2++2vKc9XwjOOW+dCxazwyQ/cdD6zLGejh4uFA2lpWh8PFPLuREjqaPe+XjTw08zY1jkhrhSle4Vex7ebzIy51wZUqcQwSjrJ8YoRM0Sg6P6xcghv16TAXIy7gwNWWqDdSkKZ6Nuevq0JjNSUm5/vcuG+6Lo0ydM3Yu7eKKxSzSgKWKJMZ7H0I2rWqVDndqoXjp22ToSi6XmyYfSwkFEHu1rsB6Mthpy14azGZOIw1Qucf2kSjsHv0jXLJy2NEc3FSqWumiCprcndk18tCtVIeXNqrv5H5vn/n/O09/+7ttJ499UNMikfxHRDwtpQZideyWOJlMJRP7zOhVRgcMepDwHTG4wT/e/Mc/p8vMn3eSTTakn+xEor2N6faS+wlZ+lXfIFLAQvIWZt1NrZwc2kfaw8jKUg5cikmYTQ6BTgjnkXdPJhrKV52EmK+1zZKo6AUN7fu6qqUPP75Iy5zDEndrWlcon9Xv71FWHf5iFr89LcIJh+33vKWmLJcI9C83qnPXGNKll6pk5Tiy02z9S0jLn4XlkRz0d7Kh8m6SUobX7MjKRIPL5qmqlSk5gnjU3ks5E1jIVXLQCyKUyjLPh+R/LuLKIYqPQZLzlWXf5vKXXWiSQjMd0Ow+rQ6UNIZxMVear9+OF5d/dq2l2psIHHHIy6EIy7n4SJ0beOU2CMuQ8vgGyMv6hbaWXUjumWHmadZzumdOGCuTXETv5+mKZZtXoyO5wO9HdjYf3zv14Qi/MNXSrO4k/dQvtEy7XCuWj0kmvbgybTPYSqwS46GOwsnPdoeRDu8mb4u5/SIaSg3+nYc53gwTjzxJLp04OS5ZJUUPLECFSUVvHzwOH+7++GrO9J5iY9ePc+SzAY4+y9z1v68/1t1UiQl5clBXboOzBMmYqnyg4XzZHLZ/hnkbLae0lbYRwzkIHNSEiCC8QSqLSMvW2NrOGdjDPIgsgKE0nLFuD9UGJTusHqe3+g6HzweD0fen5f0d8gTBTwRKIU8ibVkl9XoHgQ74T+hq6x5SRPXNoQqUoS0iFGifUnMJ6pjYvwrx2uPM7ch0KAdcBDlwfOSwJyd9BhUHay1ICKm0psrXsUTKcpXKYk8d6LTK3W48oFpvf/DRUfEslrM+b4GkM/rXZvXSdrPU9okkfh2dnsWpfwjL2T8NQvh92dI0XrrulYhrUROosw7eMQmStsM1LLsufNHqSdBeoRiPl0fHFb9wehKSe3BXugs4Ho8mhYXHaHYSHQOkmYIhxqVFZVqxutKszcWGs2Dl92DVMZTPaZNnjv0M8lvbs/Efjfde6ybOZdzzsmmCeQ0ms7TGOWzK9lprJP809MlIRGI4k5G2+jAu8O9wVui8ClIocyH7HaJvs8g8X2wwoaz/mlX0pc2Id2PlS0OsLo52FVMUCGUcjzjuR0snqP1nMMk1ILT4Vhj/bKnNIe5kmWBaQw47Oi7aPepUsJcVAJ+tXBVxd6McLrCzY2DJoioqzB2IFFmut6bFZhkhnJMPeYpuoy1qXPtZRIybRaYdDpw/DdcLjnfy23w+WsnQ3zGNiogJaq7Xy2bYv/kIyvIqtNk+zRbfcqys5HlpXdHmLLVFPKHIPh8D4sCdBejzRDb1NhalcY8ZymLH7fRlHEtuq8Fc3AxMSROBuI9fLm59dZiQ2+6VesREORwhxYpxId07iClC7X3skI+R7OeVPp5tyQTsY5Rc4KPIJnwrMmamhtFthJ2nNZNFV96dyHuMuUiXQmpZxLMCOAYsH6I6QGdpCTFG/B5SqbaSjjK4JgcclBH65lmexV/ZI+XH1bsuycnPU/Tt72x5I8a7ZeWRpQeWjYmx51S+DNZ+Rf+o433E09xjiMuxYSujurmJqK9XlEn7jz/VngRhrGwJv3yP5ibamiKTuIvhvDVqrsRRB+JFUn6dr27ZJ55msyGuKxhrMve2deaLXYTQ7nhBPCR4DwO2IqDMQXs0xJxBi+J+Y9i9NmPn20YRu7WV26Bi3Z/vrOb5jl9qnuvcrXIXNjYsPDh6KpXmg7r46bn0VquVDIhx4h4ITv3TifFykbVKbi87laFSqIr42m7fVtHpSNNjVYaTDvxcQzy8Z75Sxjb6jDZaFFjywlC4h7dru7Xd8N2me84sy+ZJxEvJTJHPL82UzYdsEP9rH1of4oO2nCuTeRMT2OCH3RJyqFziIUXzc64HNLsuIbcx+uAunDL7PhJKEuu9R44mP5P5Lnr7Xk+u+J9dd104fFkCaRNnv6wXA/jGRCt71FqKbdOFCRTLdhkIGa4TMDBWINzNYLQm9kEeUHE8tV+RJjjO1S78z5rm7o1yjo3HlES3GmMpI1NWdUvOJaIXuqlb32o3pDv5O2M5VtddT66M4MLEYRtdFchTu0jLsd+wiMuU2EPk+CbrJg8720o5HNjkf8qfC8GK82h28T+3xi/X38zXtehdRP5a81NIcDzHv0TybuNv2vzsvbuIsuSG4l01Yz+5esTxGk8U5jM98caXs92+a/yRLVrHsV2RbbfAfBNtNShEOJGvRvyRZjDp4OLrHszuQYaS7ZKNthFpZVM2MOz7dsFXBgIEeqTMOEzmjI+jCkSR7WYzUWQiH91D6o/3DSKcw6uZg9vWT17mM/rjsSJt0YB1vUwk03Sm4HXV8tTYppHuTOtBp97v7PdTVNU14Tb9Ntd+c3Hyo5s6xgQ4JD2lCMuqUcamSRwPxbAj+WMn8zj3j04r05l+euc4S8FfKJUsdjg88+cjrGkuiJZaOGuyNFxvHpVu9AS9+znKko7qXMkU4n84efiM782NBtNrGbYwWj5Gcb+Iy6+Zim9Fss3A5zkI0+2M3Xs1o5DcHY2+OIR7M7kUS82paG1cSRIpaR8nSZ6KsoEsiMsLZEFLpGWWCVmbinmGd6CI07SVPyNSNkX2Dic+adHrjXWakTpJ+0uSn3520h1a2T8Bfi7mab4FFQ/kc985wkbwRlRBHkjL+sIxh1TMspbwe8Ot5MjLpf4Sz/p/alfAtB8ddSJjnyOSJOWa1EGl4fHk81LY7+liXhuqsd1kNrAvizAqC+KeZ3ibNN+OEMXoNiYnLdIjFmk5GacaV83DPKKNaZkt5+Jx4v5uc9u516cs67aUyMvE8cRmI7Ftxd2IiMp/dIaGYiz2cZR8S35VF4c5mwppahNzVorq+GGi0Iy51JpU6Q54rdNTa/JmPY+e3BLpiYUw58xx/y0oqnJ/JKAohBJOpvCq7/2fTVdsdizUvPmXYSu6fN+4smVobhiStkrrYus9U9OKRJ76nR4POKcasKX1Bwr1DQIZDdw8zTca7Fowta64cd6hZEzF4pLq57sE5MpTlhLBPrK16TUWNEihdfN1GX6iIkWlTm9Hzz5rjNI1XZ26FFbeXdQ++n7e5VCusL5VX1rvjmKGTviqzYRVFN+0lmKYV+Rxwm7il/j/fDbLNO0llhY+HMX8vEkTVV+V2nTe1YqYcgXHQ6m/NVbeSaylyjgrhtWczHTbarxqt/fyqvLWszeufhS2qjxcCwqLZl09OiuJVSkpzv5ykUSvqln3XGJTZ0V6cX+SMFrxFxHdzK6n2v2onr5v5dJ5tit+KJlJxVt/wt0i+c/q15tXT489di0cIyS4OWWbIx21Ei0xjGofQ6e6Hu545w2FTVY1lUnxyxuwSV9aWuuMltWWlPK7YYE9NMWwHRblfFzuhQ9cURHoiDZi/1eaZntt2BqrkX4ZyLNhKCKSkkY9yPOXMDu3TUlH+365/VRXcxHXfbnc1SOmj+qnWsax36X44qXOSSSBEe/Gs6zZkvqUa3h+V1+H9Zg23n58MrGknysVerGkKREU0cqHSp3DnNHf2ap8e+mexFDOlUtrnBaUU4xlccL6jfnZUIjL59NIKJ5c2cS6p03a6ap1iRbHfyXLeZJS+c49oMG/9nsZmZ5by8y44fVcR6RFq2rTomQVJFLIi0UhN5nPPEu1eE5MsLXjWum5J/bp41nyVq7xzKiv109JeCIL0+rMpe+Kgf798duPzVd8rLIvRfQKks3bmsLrc7N3K6xhKXKGS/o/GG0QY4Zjs6Pb8PPkraxg/UilVeWn6Sevm3TOoZbipLTBz9fa9X1uVj17FlFBXXc9LzVw68nnlV4nDb+Pr5456X2ULWXOuf5b9IOpWcdEnvw+buHjonOF3I9++OTTs/h2nLmTLYjfdzR0iMuXRyuu+q3wc2Wc3PhbkKhlqC+JeGJVXN4uellhK4m7HkLu6Kq5Qbu6eV9S6DGv9a3rYumY6rerPbF8bteu6VW4cttiy6TKdxkLVS+VLhGHd8fBUxhBPHTHHzWeW41ePP5+065jY+Pye9d3Ozk+/9dMcW/084xJ39nIDg8XM67Zh7WPhVPBHdn8J1rGefnv81heWB+OnvFc3Cd3n9/SGl/Iy8zujdFHL/Lw/NZNC1qY8qz79b37cTLGkld/DUtvDrzfPT5Y4l9vaOJ6+fhLD4H7Lz58rmL84N6nniahUQ6aHZdy8nmpcn8IOF3P4IfWlG4n1c9OvSMeWo9F33OO++N3fV61n33B1I1HwH+ZxO2SEmtnjS3Ea+Pj11Xrw5tkqIc7rMfTeasq685jr04TOml10qiPLGs0P7FsTJkc2eTbltuMSrpKt0ZyHOnptysd+nUfbjoyaTUr5JEX1uTQeW3M+/nHTgzGz3c/Avjt6fWs7jOdwJ0HFyvW3CjlK+FRypup/Otr1UWhnoqCXCg8atoiWiWlorVEWrGNYRqm84t18uvIy+xEV6K1KQ8r4ujKItfdIeWheevRaOK5J/QXG85wZl/ZHz2Trqnz02FdKtLjHwIJ4wjL2ulleuPDxB22+1j9Ye3T6B08Z4/wbenouTcqiJX1mdcptW11UBwxVe1ZZxowFq8Yru0dGQ86mWOkU8+Iy99/htnSta1s9hR39dbNEevfcMEnCMvlSRky/Se/HQbFKG02ZzgMUhSkmOkDyLVDy5p3o7FRaK+ZG26mioqhSR4Pnxysqr4XYyMb2fgtSMuFcH0jXj1jv0jLm+/3xR9dxmvFaKSrpl5f+ih5JYPLcqtTyMYwjX0RC1Yj3xVYS1J6lTR0GnCeq2yDCLdKuU82xul11WzlnddZKxaJ10jLissNOfC6urJ6PrPHcwRfz4/d07+j2FO/PkSekbr3qSTyyQartfGuIPKx1/ox23OAdnTGYx7+zHSQwuwumddPbIXT+FGusM/znxUrd/JRXfMdBajgxwsqvpQqnqXG6MJC5yNWFjBO7sB4iy6CBdqMVRS3PrqnOseDGTJ3WBIqubY9We+M59Yo/9H1nfJ3irktsOqh8Zcn73dE8Kp6SCS+vSNopd5e0kJbHQvyjffZePn+OL18sa7yFy5r85Jljsfrc9yvlued+TO9ylKHFZt23fWB5B3TdnNZdkxWu2Au5ff3cnTWTvx1ieMVPxjjE+nQ9a7IMuOfPj7v49mGKNd+jOcyV3QqXKY4sXHz8Yhm06VMxPtw8VeJThQ4VMjLo5mSXkT12lwWrvEmOtYh2P2lOYZ/f4y0+9bjMas6PUIZNb1xLPLgjLis58jLmUG0a48PXwh+BTXHHp9x3izOTt1ru5f4XXbs9T7LcHXwH0fOW0hZeXj65pZQ/u9Iy4JW4xEfNzfJRQrXrrBVIj6vMdYrEu7U6YSFEvDurpsZlNCieFUouzzN0iOjjyxypndjJBLyu1+Gkisl2z9ulz6flEcgs46RUaFEbw/zf4jLzF5R9iSTfvZJsbd0ESHTPUsU0RcQHM9ufGd6NyplYkabDzUmykmuHGG5QN+6XA8Zfmx2x7d+vw8NZn13uJbW+4qrlq6B++s5ZSi2lHHE7SxuM9/T4SlWBTWeC31jqyKiKc/T047J+bCuLLJWybFYYPrq3RVZYcLav4zuKz2odGa4271emCXuqecg330qy01PZhVEw6rh1S/bnOy1PwfHPfq7+1D1j5L9SbF5deeKP33397cYZ8OXxZPT3ztVu7i3VyvYstFV/MRpF1e5zba+vJ2eL75O0xwuTeRcUaFzrOy3qJMQJgLqRAQ+rxfbXRuKPlqdjyWcywloucLVXSI4lKvCXYRumaoswXRjhEclcz7ZdHjOktG7HHl9kKmz4/KfFr2ICt6YneGNPJcZWu7HB/SQ54q64JV+Xqnz7Hp93Mtus/JswTX6415avYry8vVQOJHosjdg5ibBZScZyjKSjqcM1Du5J2gnKlT9cq8Djs1XTN+r9Pq+wWE887qfLbTK+zZ/gtQ090XdmEiSHTmNR36rGYwlyfmxJBDT451ytVqIy+kvLBFbwI33yutroju7ClnSUr4HgjBp5+eXXTEVP4f2bk/V2jJ95j8e5e+jyZzsMlpgcrZyojjg0u41InNNap7HstNBHZ2341X0fNt1s82HVe7E37NUPf0xS+Wa06qQyecQjRoo7XF/nrxtrN75cuB4oknyRffBBTu6Pl4uCtuN+aPuriuaT1ZTvm1BRV4vVMmI2rmU86PLG5a9eNVhyq1RTJ1dqUFsm9kBwvdW/PEV3V88T0dA+fpr1Uy7rp+rq2XEhLeolKA527OL314hp74X9+Wklt7khB6PUevwnR1cXzXbrqo673LnDv8MOXzXNEmcxvN3x1TH82/6UdOu4v1fpjjMkmx8c8bWYqqyd637VslfdR5ndb74mplVDXoiyGtyb0FiPywFL85/D7Y+qS3vMBPruT6UPh29DrP9by3qFRY2VaJSEJKIdolYR0jLsCP3lLtmUFa3rTXhOR64/gtkixNQTIESdb8zzSXN5sg7AxsRtuiHf5nAsR5Zj9AmZ9l8GaOGX1zXi4Q3cmZreq7Qy0aKYNcV4EkHWtsGCzUhu3Zb5pbPCs8LJ4dIy8IabulmO+mNcuUZxOfkM6+JXVGCLqvF91LeVXkyJxje+/HPSLyV5ZFrQaBDpwStMt5km+nvr7+r35rPD49MnTk8B97b5/TmuvRLEZDmaDLjN+mVNRpLJ1DVdFfIy6X1Kvx1nxlv05eqL2vQYw1qGuUpAfJxTQaZtrydpFttGY0CDrq7tKxPda9jXWs90iOzk8Wu71v0WCTFcX0tjrpYunXdFHHMvD5T/1O7FaTdNZzOk2N6Pc+V1Kr0wRPZUGi2Cda7V0Z343tda9RjKJKUQO7LhqnBLRiRKSD1DVUqqz5PoMPfm4dYHzmEnNLpdbl0ay8pnwnRovDprlOtWvcQu2+PdU+qRiRp05RaivDPRIkIEMJS4T6SFk6KPDVPZbrxX4nG5vHXjMHvvUGSn+fj3PW6FvBGfEkdemDDPzRlenwfVM2PPJqOD4PhYMnhRD558iWVdFFn0RZg7VLdU68k30w829291MHi4Thm9hW+iVDcjxqeWWpjGyeD+xaML4DGWi0JNV3nfX27eWXH+sHdShL0XOh3DrcbZGOl8ic5yLxT3oM7wwjLjGmoPlo9z7UP6/xxLgZl7MTkplwnZJeIgIxy66zm3r7iH+kgXLjydT1lGVr4J9ddGbQm5a8matLIM4mYX86MTHZaw61CMI1a74lp0JPir1yqe3ZU9G1p5k0+kqdQJ3kpxEXCKRKOqtFz/ZA4uqY8ECxEL7afY2u0evRstWP78Ta7U/akUvaG4lOav1rK+t9kR6caaZZ3EtLctNT2bfEvroysRxhr+CcsQXIpU5xccvTCUum6XTjdnqcujQndBhvtMzJx3618VbWjx18qKBMbHziRGYeJc6rfmD3bpwdDo2fE+vvX0L5z91OIyqHijl6jFwkXp5JD4PC30OKKYUY1IH0uXUE8qysiW7UWyLitMzskfM9/nkZWml2ZCT4csfHnOUdHTcUm6Sth54aq83SCwYwmZqBmPOXIy+Lk8ctHqJ0lt30FqLp9GaD5qBsicTMLx02HYVA2fVOkQhS710h00L2vcHOeE2SqM6XtGu2/ukMzu/XEa9E/k/psbwmhzyiEcv9nHODuTqbbI9ShoMjKbyoiLHd79qNb23FqLd0U/UiouB1buwpkS6ZkCT0Xn39NIlP6y3SVXfWGg5SioDsL1ZMXd9Z0zd0wz9uv252zFCZx0OyYyWEU234TcMmpZoRo2vtucvW5VjJIZApJM9tnPVnWXfDH9PQLry36lHF+ehRE1pZcO3+7hdv7MQcPh/jPgXMbi6y63rTNRN6cQtMkZKcDvGjftx1ViA2/Dyxzl7P2kcu/qOoQldUzzvwtJX4tZPTrYO6t11WYex3DmKI1cpcfTlQ1t9Zx4U8vuXyl5sOgzDXDxhmc0hSHJ0vXfz/RLJj2IsUj/GMBzqq+tFLfCrQWGzymgipOLRVEadMvhrakU7brPO71d5/EtmWtRKxwWTuYCd7oKSw34R4FVR6vCd5zk3IReobU9igkmKQlBLucKSDyciYH+KwKnrup/DFmfar/TytqJM6eZXv/E0PvzpxH7K2t9xc0opmuaWF4pt/A1euC9FVgzhSd76tvPGprtsatrWRbdhiSr32SLqnZC45uaFJncdBa+nU9cTmFIm0kxUnPb639D9GEtd7+znea7E0wQcy/TH4fVfd5PM08a57ZzXPt3bUzBITJvqQ3rR+0/Nl+EXhzNE6RvV5PiuRfuqPy2212xGCI60xdDzant8jLlcqVCGmm4MRMZ0yPdj+aLzzglvUVSSgNYS6+Z3IdS/P/YYnSJIzIWiISKA/Kp7pIy8maoGJRpEaBDDArOusOdkGgomIQMDiDjW4UqBY/m5nM0CnImkjLzpm9e3J36nCT9r02PvOHaagdWIJIMhSlFTDSRAcUQT7COXKw7fUZt38opk1pXHxDJx8/Ebx4c5oLabK6rMqNKaoj5VShYPwlCbahRucFUuqQfvE2bP2zmf3YJqenKZf3BT0tP1BiIsxZj7vnz0dJhVU7amFVf4nNpK4xhCQ7jVB9j+qCzzpIqzg0gIqXK5H+E9Njh5wXJCF5k/1sw43NF+XwqauXxhoqu5O6vpFcp1k+RUTPUQFrgfUPr3N2bukv6vm+O+3yK2E1j5UfOPlGvidG0NfJ93l5izA+YWGrnaWl/uOWJBl9+EjLvYBvHla64lZpbcnq0XgtrcO/rarc+jfWdHZVJJsEGFPOVU+Wb0PBrXP8A/u4Me/sM/AMXBxCbRBNkJFU+kCHHg+hlvxkO6MZ2OZSCfq/f78VdIIYpvvIm1ZmuGMbsOxnprUpCE7TSMvP6BA9GbIPKOOvXX04HMUbWuD2vNwQO7xGZaG3nORVo5fS/2b/f+RJ5RMUknilI7sGwZG+VcjLsb+5mfTqn6+NUlrqHFG146bSwJTcfG6FR6iZWtPHMpqqoeKkeqV+AZIK0A8YTkd2ZqikwwgEq19mtu5gqY0IGgohxE90h6JOUD858iOMP5o+UDyjpb2Qnlr7dI9n/HnOckE+hCCdvLFQ9nmxeJ0cHhGcXma5SGM+6GqN5a8RLfRiVl2zm5BdQ8jKdVAbGLNRbDoEA9qQxH4HqBEvHr6GgM6YeRGAckw+EB77rwwR/mkOEMR+fX6bKaNtfSqZmQgORfX/JMGeyMurAFUMqqz4PfZVuflRm+qaHhUyO9C0unnpLDARFONe5t8+67B7fPw26b6m2u1wWEjLgZKKiM0q+BXtaS1igVPSjfAV1764qM3ZfLe5DX9unbh8GPSPLhYBWhsYSeQ7xqGGJKdlCPulA/gdnhZiEF1K4caxHEa/urNyUHuVbOFq6fu2xDTsbTbEkxYnYEjKbDCDIUvIy86UHCdW+Uz9dUx3zQWbCGsuTuv70L2qkDI+ghYeYSIOBv6Obqi+yowLHnN5Tmk2TRBzzZ9DuC0d0Y6NIom+5avhnUcO/+CmuGP18ucfGzxdwID+kjD0KlKQoWjAaleedoyzCKNSj2j5t4dp5aIbB3c9RA33qZAZxBfYNuSTqaPj01e3w69sONLtvxHGpqR1QkGH2Pnwi03xFNe2pmQo1QyMRghsUsalBFTsJvcw3dPGiUy0g6VJoZOWSE1TVBSGQ75D4dR2DmTDNorr0yw6D8ZhXLQp6N98pGzaNaSbcmLRnXKq0uOjur3Vv3Ur2YcivjucHjQ0TQ3BMFN7UE3fSMGVVQURYkqxMOhKUc3Iy+vsBj1gfF3QTG6bmwxdLBM2MkPin5+1/yl5XVKpq5cubvxhInxsbCbznnXzyMuvKodz+KG6HT+Iy/Rsz0EpIHBBSQsUNoQVpBBk54WxtBX0jjIecxE+SO5Geuc7++JM+0BCC0Q0JLfGiHwgu9lfo2IFBR00jEUyxqTR20C961+/nfZ8L278knLPxNDvs8tIy4Q1YAjLyw0GKRZOSYaLo7OOL7FIImM7MYP85ElHzB68saeTHr2NqJ6+p380GC7Bz6TSidySoeAm4iIx5fDPLkqwPV9aDTMeYuHXVz5lR7Nm60yZbWPmRLBq9b5VgmlrHjWIbU48y466cNdlUg0uM/qZ1Wm3SeemV0d9Y+WA3k3VXaVOp1WYPO+GO01Z1HP0wa5CDB9OWuVyB9NOs6H09tOGq0jKdVzraJXwk1skpN1cteit8d9hiltu31uf18PObdBNaYgh0PXdfNpGA9DdLYCio2ZbKjRM6lr9WXLqMybacjFrvy5uTziFgss7LZYR3FWCMJMEkwaxASm7TKXipR6k2dC37iq+GZtNdhlIpIbKNMk6nPuxsMdKjjFd41utt0jKcaae/4Y303lNykQ410b3ZmrS9xStfi42R5VfQ/UJ5RMKP3Xx27WbWgPzmeM9C4adPVwlVeWRmSaKnszEIc07Ma6sMqilVZPKvQwp5X2rJTjSjAL6o1toDKN2WIyTSMOnBojLgYDs9XdupQEu5DVQ53wPqxmQaUT7sYfbTo4J7zln2xMYr9RO3Y7sRn4uzlPB7mK+wjZfZ2iKE+qrJo5wdUe5fzIHZJgOEOCJQO33DYGQPjQsy0OZKlYarX4O+VWRKemzTWDtnXq48MZD+CzwNdC5NNqY068KiMuctBEpasJZXMxQ8wmYmjYmbbNnbRvpofEaKSWE8fn135cKHZbebAWEM7VDK4XZmDzz4J3lXXWTINDtWaOUsZl2h4JYPvLQtbliMu0H5YnZ5fFwq2vqMzBLF31EYmQsaFXUY1wEgsjL+tvJSoeN/CmycCbIy4e+SihNPEiiH9yMdnLTXingsh9ykJMVYXGF3QXmVhhJxo5nMBBUJilHNUB8Ky/XT14neJDs02h23OjMJEjKcICyA7Ln3eAaRGU3l4kY2hCnLlrw2aonx/AlG4Wm7Gqzb1aZasXTvS52sRO8jDKvLiBQlDSgqrLUF0p0lC3GQ7dmqWJwbU3iYAF19rEYvlkSRFpEjU6uYtLg7yjpiH6a9LGsZmDZO92ghv9SjFBqKzyRnBNHYNtBnMCuo98ufiinCQzJDlBxDkkzHkFGrqhiljdlhDGxMOm4Zvjaaxr+Gw80dF+UyRwNb3Uw72QYY0RihLk8HWa7HTEIy++azKb+fU9U2F7+cYwzZQ3lt2ckON749/AdUPeE+nXm9Q/J4DYkpKqTsPGqBy/OPBUDnKA5VJscJ7qYZSGjMfuh9dM4LpsndzJe3tht9J6iofYipNBE+a8lacdcp+vfzM7+K4R3amNHDYjL6ZdFx9c0fAxhm1HZZ+TNbUgvyTJsoeeneevvizdh1sf8bG9Idsqja6oOWyUraVmKrw168vPH91pLVrtk2ibsyQ2DuC5TpFm+rPA2HSwLdfcW8GipxqrmmCRUpWIUUWrGoNQ8Bdmp140uen87LDiHqBSX3GufmK8JZKwvzr12Y1aKPgd2bF0nLS3i8aX1dLWs3XjzFVuosXdXoIxhteggYlazS1Bv041NfScEQSbgbtMNOwDOB0Y2eSwZl30OkqVemuHaxh2OFscb66OlpcexokuJUKG95PWIxiqa1SigKWwptOffr8fAdOcpDVnXlvzOJuUkzqCbMoFuHTY9XKBnGSbd2Y5yt3rRiMv25qkG4ROSHou1Q8SJIqqNBM1cCq+gPbdIy4Ikl3yVtra1flan2ISb2f4JnSbXo6yPP18eATHGCMur+2DU0oX9A5lRRUxSkkuOYeubHAjLhrQaZosgDKSQx+/7Pv7UaQ0O6dGtHzgxX917Vb+J3m9OKwP6DFP+HuKmSJEz4fL25tvW/twLWB7OiqH94g6QO9lt6MznostJ5e3m5wmg/1IOSbr431cqCEVUVInCH/RB3walT+AgXf+XFB4If3H3/e1OWNTe71eyRzjfTR2rDqrr5q5gVNv0uDF06Jgg3jtU3YF3q7tzdCt+P33yJp+q5sYYSbA1WJ2qRJj8smIfB8dHphdjPDDQ3TMgk8bzFrsTrXUln49fumsZ2azQnP572P5V8hkhf2+8s9rgO5KIe7uvzHHZRXM9OFYiEwbjFUhLgzuKNc1MsOvZ2qilmzHQdMCoipUhiIWangjLiJWNflZL0N5j8tdxlfU2sTElMEZTIIu6NcjLlDcdCGHlPdU6zUOyp6ksxN2kv3Hw6GDIqb86JU3ODgTMWBz83GsrOnz8ohT77ayoynJ96aXxno/PbXNKr5IbzggoebE+/6Nh1SaeWg3aYYTptBxksw5yGf7zy5FOb2JJtPqdo/Jsj0q9q2ELoHEORg0y2jfBfqqJMQmYrw0fEmOTPpxhD2zZoX5v3hck+ry+2O9PmJHhB6z9AYnHg/UIZwcNiMpoR2QOQG6gX1IhoeKBx4IaY+xgSMu+/YZ2WojfBRA3fYjKcU61ImlglnRIx0yrB0TQmn+WDl8bF2DimJhwZEhggtA8tsR5ImxgaWVn5wByNIaKJaQWAdhdKoJUKxclfYS7iXBxnbYi0LCuiMuknEU2QuLg7GGOyqfohE5Hy7IgqCDViRWT7zzt8qv1/dmC/u6NvxY4svc7GXO7NrQfQ45Q0JPoFKHgJMQjVy1vJ2XpvnXUy9AERZaczWfWkvqe9dCYWEyBXkmIWejoNjqwR+h+b+mtzcn9TAR7Plo8HpHZePocZISn06w0nndS1Jscp4tPCvETM5qph9XUMqjymNqk6MqBN+CMIEo/w+2eKzqCPksiuqNV/TcR1uypDaOixq+HkjA4n/oyzlUM6G0NntcPTly2yXsdmKy195k3h1TE2DEKkWLKQKHM0QU1rEfGNXVbSMuHN4e/S8ZIy9RJqIzK1WjF20rPTMq1i8dVrwzmLvCCG/IO6R08DdhjnmCwoe88KtgbIV1Es4jLzghc4cTH0U7FINNMTOhBdFYLjZOrMwaiyMuIuXL3oXVQ3ZO4ZqprWWFJ/su6X41HTeidMMvP46kPAjocRGBI7tb3LX2mHIfsSRbu7GYcWBfYISM+9oPeftOvU/3HyhfGHHe8wNWe9wnRnGbbqbhaz6uKQkfRkT768mtGTCDXtq5a97qXTg0bLFhUVkVYIYWSSTwtcA7j0b7ndgwFZZZRUpGKClFVCzs28tZkDnMHjOfazV35nK3D7Hop19M4HYYrz5O2letbi9ktAUOxC7bBxlMhYCpDqjnGY44GOaTO0SIERrcCdTs00orVWcjpKuUAWgcIy6RBaJzmJE9KgFCQLQ7+R0pl4IbeHKAQuBug6nomfvYAcw4wQhbAgYIacJqjhfdw23HCV6HnDEjLpI65BdQ95y+dpY68cD6igttNUDmxSLg3oIYD1ZhbDqVxiDXDlUjLmFrmmsctBiEM3ToN+yLaJinc8JIWskG0zMc77B0QlLat+gmffY6oMFCYoCoMmEx1jHQwZQbGVR2ICpMxe0rc775WiJV+6wagc54y/DNed2IJtR3Dns4gJuASvPWeDS3eTjN5sA+ojidch4wUBEjL54oS8scHVSKcoyUYlUoBKRQiV2gTCQdkJ1hn0tZm2yYiGJIQq2vl9a3MbbIZbCJIj4e+uYmJNHhB09SEnewphVguo3VEIXv0vJBIy5o5vJh4PPTt6B0ZRcqNuVqhGlrkhUzN3kaeUIZOjBY1PV3pkz3s+WxOasuqfnpxg8+Hv05W8T8XNej04nYbeL8vRobuUehLVDSUAFMQDQHq5ByHXpJARhx8C875KYpYw6+XMNIccGk3yCZFJ5Hz6JBV8AayKVILF1DcMWiJjY8gcqwYaYEEaBJNR+GSMUZW/ZEoNaDDpVZHeTPUw53yOdJQjqBz9CCbcYtMJD9eHQjqQYjKeBNtGA5Iy/lQIUsQlKZKnJB/yCcYE4EBSjnr19R0B5W2LuhjZa5i2eAFmlkMkGq2CFJM7j523vSYmw9Ix9BRKHbAbEnnna11zmkiaMypzDle+Drr4X8pioBC+vFiCHZSrKFErQjLjAgENemYSGohrc9mGBii6vVg+5N27DbcJXXeEOvQ5dVvxSY0lU9YeQlQKBA2GZQw93v8dvDr7+SHqPHwDkqh1Y8ztmYfrIchPACTwO/qBNrszCounHjWp6HgYhkgMBSCwh8hAEGoyJg386OB4dcnXmK7L2HJuDEMzEJmbDVpr3ToLMyt5YzueheSKJgzGatg4yWoHSBc5tmMBpqLOeeL71Yry7kUffZUyiKnBF68ycPd4wURphQNeZdsvVsrluy4T13k3Ok2xKIQlpSiWMpUl0soAdes2PIIHj45pZtUsKFTBXQ4yZtwlm4lmHLaxZYePilcSO9nDo2NM+HLazlaAVHmwnqVMNfSiMpoST40YHBKT18d+I7rBDQ95OCejp8Z5ocVvzOzjDu4zpxfVce2Nt06G/tlmk1yEAE3kvqLe2x8pgESKpd5Htiw0fH5QkISEmQdcNRuAfj6pSzK9Gj8zQE2yMuBgzNz9OltKbCjs6etKArD7pD0h0HD9Hl6Ntz0Yc1dj36HaBbpmFS0x6Pmogd3S6Qn8CpvTDfP8vBv6Rxxt0UOPaeEOb7Q/5O4qFPebyLkdy2FKjoq9cIKYbX5RfM3Y3AJMyLhA42QQenjyxDfiMvg7GGXEAfDBCUCEDsz0L+mbeWOMv2i1TndsRppa7h8z57eNFdm0bKGRtIt030edEirzq4oiNI776855SEJtiZotxcnofq2cXHBhvJGdOznNNGJUAk4P7USQOvhRhAUhCBIqBOe/wxFiHOpco4QTo5CytiqOgizgi9vbxzjuYjKasOMYgkA6tShSFmJrykBDJEtAYUnD2hE48aJRs3eSytR7XaQ+TJ5k1QkLP20Afndsgq8/phe7m3vljsU6dwmYY+PdW4+GbDPKQ+PCnaiiRJhVCijWHdNgvwHHGdECBpoZ0mQs2twBNwfXz0Xhm9vfhLKVtTGqN5iZf7/rj3VVjJ8vuhLNb/Pp46zu+Md+eOUXPiIsda1i7zknz09r6evoW22TsRaqivcb2JSukgqG27pEkxBHurqpDScDjgB6nwQsGqoSjYJbZ3K9ir7vVLA2a7KOEmd9wpmhVBNh2+V2fQ78kztNS4p+JISsTsvyJ6+tRj5idL8Jz18uWz+W3vbcTf5TZMY8kQzJ4CHoGZys0DPhAo1ZFiMRBdAxOPStKoN00hsm1+FtF2cPgYbzQ0ceNDTQYHFII25UsOFnaE8S93FQWxDFbGM8X8PH74a2ofOxrgOKGZry2Hn29siIYYIM9yX85ghw+O/kXiq9ydUxiDQwN0ND4/kVA9SchfRpVNITVIqsjMdulafyYpbMqrCEupx12UIecym2wMEUUw7d2fRjBx5OY+tRHTdhB9nG0HZ27aFhHo+9tseGsjLioFzIx18OBh77Gag+9KSmItLSzgWoHM+P0SibA0um0zszHSgbwm7dh0eTURt085tBlbwgXXsrC3aYbAvAHYqfBMzLI68SUkxB5ms5MDefg62BshQzs18YcPKiWnESMuu+N288kMGaap62LQY3CYbS3nPHORoODsYhI1Jt6qQ8GE8xIiaMmyc9yd0JYYRIN352Iw+zTzG4ZjgTBlIXAI2m4psENsQyG913XfJbxaRTSxaPTXVSWYk0pmj11e+G1fOy9PmeQuu5dMl6jYmh4VNwSIcZUIopHsaJSQ01gHuNw3tuYk/OIaR5cXq8tsOp9SnF77Z0O/Hfrm00VFGejD7czWha3YYMZj3mvQQNwQ5qr8BvtGTWRh4YCQ3LoYcGcPRx8b8y8eM2BUIPn69CpAuvoMfxJ7UcmlhdshkPhNAhUuG1EMeYMz2c89Y6KNV+d+kgOGyqbeWbUFqExsTG4QwkwVLFOGfdZdtvuunWM11vYjKUDA4fa3FCMpxTV9XRs0fjsYt+D7oP1yNIpseKeg7EiHSiMuH6LEUYRjnIycmInvn+3T2CSX0CYZ/T8pYFpRxW/Fomef2aMFT4uhmZgqyN7s3OgqTMSHz4Zr39qqHp+CqHfx4elceZ450Id+SAn7dMi6I63LvAb0x90T5eXlmZmUpYjUzVDC8Y9fKeTF0D7QZM9SNu+NY98abttb0lm9/3pTsfuTMwX0YqmWvfB10fPtIylihkC60whBPDird6tAGFMjKWKIHLGZmDVo9r+37N0h12fUpyqkmYBX+T+gekcIyFKSqQ5W+2O0b9MP6PLqwiyusNDa02i9fV2SE5AobFEB8poTX/aw6GsycMbWSRxrv+NMD6zy3l93u4Ksa/n9vB9c6ZDaZpIsufNMNK/yn5xfmT7tOGsi3XKbMAzNvfYoZgGZvYfyX5/5/r/b+f9iX85TSoj/GEicp0KWUIUjL8hnnFc7J2RrnKF98vzXV3XVRY8n+eVsh7qXxnzaTUH9gzMkwzDf7VUJAU28/o4oHGw2+ZrXBSMp4QPtfv6ct/pLYBoYBSVO2J3ucKXcdXaB6GxP+R8Yhfr/Iy8fx2FZTmdiZ8wf6P3vw5dL7OSi8ZRB/D8njrGP9/kdOkHMhhwhM3P1d3Pu8OvjWclNeM0iwUhjh3Ycbh1n9EnZJkI/78ZGQYQxJWRkUKdGUz+/JTalC0hX83uLD+P9d4x+n7TaJMesTM3vat/xuxDfTL44ZM/TipSzcdhZolfZMJCEMj53bri13hc2uqOYRw7ktU55W3Fd2WWLWk8Lu1rKD2sxZp62o3513NvH2O4Q9bXMZDnSdujHRrv6q5f6f6ferOp6gOVDsJeTmPA225XlngjysHH+OHktsowzGKYG6dD5Vi2x179WzxgmQdkzMEfD1WJGwi2BkHdFknP5T4VYuduJAux1viSGgCHj02m2un3Buxbg44kg0HJ3lnKZNkymPNh2HOxPzIxiYesDhK0dWGJVFGvF0fP49PszHycG+ozK6xj4ccB05MSfNoQZxopgsFYIjEAdkmHG21MjLsPqjANP9Oro55a3zhSdVvK1JqcyKPn9n5uqy5cdadgQhjxbQ429McUDS4k/Nxfz0Eu//T8ctj4wdVx8MT+meG2UzRDTSGz2eY7vlwztvyLYnL7MILWaoctd7FXGrb7IKw+8qpBX6/HwLz8Juv9PP5v3GVa6G06WggZt2g6Q4swFBMVj6oRzrhOZ29zd/P38x6TYHm8jL+vxhqyUvVI0NAw0WEx/+hoIRCVrMB/JnXXCpsIxPDDEcWsQMM9mc8F5ws/d+Op4QDvvjjjH7P9BjUojLhpxgys2MQknU9Je32MEMyMpvZ1var3eFsX6ZE5ydJJMe1hvE8QpLh3dQHYjLuXqpi7dr9RCKh4z7idUsLXt834PuJMafFLyeUaBCILYMxS9Pmas/Vzaw0M1PnZDa2CJeFPHueF3dwEnqO+FSlVXIy59PZo6uL5WS5yXn6kHG9569Z6sPx23+FtdifgF0zXfs1v6WErpB83GIAXk+FRzU72PA/Q7H7o/XtlL9+0p8coqfp38LfRPzpfwout8p5N+LJw+x7FOQTQzEMwHlYw524r3+/zMBz/PayMu59L7PXzsY2dBGFxfVKk3l5Ko6qRxznol1WW0pVciQzEX/Cp7KlYQequkt/x6A8lnu9Wzid3rPV65+nUrEODnsq9h9On6ubciH3i4jMwcJO+ub0eS7NU5Ro3Jqut2dg+pIy6/e5JnR+5c18wfyS5yWH8PncK/hf+D4+fo3VnQXuezV27upKNSTFOvPydGB39PkUshgm/VJj5oOu+aYGw/95a/HnjJhi0gy4zMFJm/P+Dl3hBhSRSAmghNO9OVhJ4TIy/IkSKISFd9XXXidT6+WxWdNOrw16wrD57KjYJkyJhcwzfBrtssMdeue02kk7AUKJubq/mWuIXhJN+js7fRN+cWyTO8X3+vPTLs5V8adWCWmeCYfSsdNcGCZKcx5KRDjDaqSVGd3uuq+quQHt8w5v33P35MvD6iKzcSv7cV98zE9AnAm5Q4ojSudQ7dKRBEv0vyYY9e/6vniZwJmoFsXAwhkJQjt5E9vZnE27O2LfcEmpSaj41PMqjoxBqN59xdFy3eq66bAb8a5BWLIymkb85MMU7qg0WV0ulOCYICcoeUY3t8YlYe49Pxc1KHxyK9VLxg1fIw/tGZgX6Bj7wwvxx9Fui/Zr2bZ4qTqfb8bjEvUpk9/lwbb4/hiA+oHEBvcdOszy5MK431Ffoawy9fVcYVnfhfNLCUpY0d2GFOIASC4YLiMYZ34hxgy0tfy+QTvOcGWAh6n+/62MH6dfP1297MzBuk43VcvJI37TdNz0K+r9V+vC73I9mnlkDFzAck274fKMckgHk0p9P9Nx246NmnZby4ceNYMUrlmfZmHTYmus2ZnT+dM2/aDjNL066s5aOOWmgmIy/jYv20/GOz+76fkl8R2/x3yb2VM9QJn8bvzSrQKJ/jqb44vipkre2f1fifPGvKy3meeNdNNfxItVNB9itYks0Wi94rzHGbVFLR4Kqmh3TpSd8lPY+SnS/65NLqVVHksE7OkLVLCP40uB/L3P9nFUm+Hk24604jW4qTsibmP7d5IPJnNRsvF684wjy1Bo5I/snpGN/1p0qz6oMsC+UTCLdnZCFn3y4odMe25xVvFn+TPwVdbsnfiGhVuILl+YbCYqcw9vDeiBiSFHo9m60vXNe5MYNL+1/Xj+rTevyy0JbM7Q/iqVKgRXo/vbpCmRVI9+Llv1R0nyiMWsJf69NVYWnl8EHoUzmTp6PF+UOhD6Y+8redc58VHF837Z1AjuKCOvRZIyQ81d5niWfJ1VKHkwcvJrbj/FceitjJ95QQhofjUH3Kq2kQtS1SJw9NsNoslFKK7v8y5qvTWfsxLT4cfVTC3HFLy97JUXss8IiH5q2CJa3CZsolTMHpgfvdJuGxKzmkfhoOWz6FK4MaX/NPv62iDxTGlBYzVtoUND8FE8L/HQ5yOhzEcnnhgnqLte0s/uhmehx17rpMiXrgfduIhz4P7SBPZOvxRC0TG9x0vi6nvWUHl0c8ccRw+Tq+vPjpgyW0aMMbpilWVJPm91I4W6YzwwwjL3JyzfjEJqCMrriO6j26EzuiBVO6DJrpior19+boKt0OJfnDwz9+47wYr4ojuOdnS65ufXAXV8ys+VzB5J66mc7vVzGJRZBLed0lO/KLQuvXWe2ddq1OoxdBh4VPj9hcyOp4g/Ga7RmhhHyRwRUenJUXdy1FB0RXTiJQW0DJdHdiz188eVlpZT47TAhISEK5dvj2gPFV7I0vKU5lYIe0t1SbRpnZwtKPw25YVp9bxiPXqeDch5zbRGM8Vv2cTTUp7fHozpMw3SMpvK546Ho1B0PDql+3nVMXy+GZkT9bSqMnTpkI06ELMONaY7sePNv82az4d+HCUkKM/jBTElH/U+UFcVcDqR++rXS6FPc7BrVJ2+vjK8jVTwxn6p4Z9s5aeXqHmPwO2F4t++ZzlssGpOvrD79h+MtPBcT08DRet8ZkkZJuek5+jMvn6qdOTFT3kQHbXY39qnEsu89EVR4ixM0dHD1+nYjPR7wUdZJ5wPe2w7/F8Q7liUfji7xZ7EYy7qYPSXFE58mn2N7zjbAnCZ6j3/emjj7oSj00dXWkFjgRkYVyxXKuzTtbzJ8PCfDn93Nsw4OSF9vK0a7aoo+Dnp90+Jv/JD+ZIRjnznNO74K7zHkzytL6mPYwTpIct6wn7+ZeUlhei6bZ/TioMdE/Rcn7esNk/HD9Iy5UGF8DT9K3LkymdZcfu86uKwnZNBS5l1KHR8ej7W0zlJ+yP9yaR8+Hp8ObQJHS4qXH+q6/M9M79o1HBnYYE8v80SMvC0CX1ofwi6CefTnWth0vU9d63J6Fu+n4WWYSOSNxzau50WlVSglEyWh0tv5YHLi4hjzKf5fpk+lUvhmAj3zO+lxrBBHV3ZLx9c3Utt9/OsyYh4w54IOa9PJr4o183yvpbm+lcbqmjQv5Yfxh8tjHiW2dNPUvBWQiVSMCVONCioh2TbE9NZlrnJpoP7XgR2oZ2sabCfAk7RY2qGjdqyhS7DXqmkW75vRgkVYaYX4oafHg9SqToG2o76pQ9r4p02FdkSRRWTOXfQsqbZpOp0W8EE6Y0Kmuv1RCm+EhGuhIKJdtlzr6/L+4xreehQwu2p9BttIfszXtZxSZT4uuMeeuYWqVAoZR5Q613O2b/VzDGdRgvle6+7hm+WtwFCe53NylCcvng10iLoIBVP2LLqYkWyMFZv9CgyyH0ZIc07Ez1rhr3XCW2k7B9vKsDw+dGGSiWHfzkjz1q2kWD9MdJY+gho3j5/mUbOH047+CJJ56OcC7PUccrfo/WiMu8oAUve3B4HK/t98jL8wJtn53CSNitV1Xl0SltHahAvPrH1THS7XHEDZ3aR33MGrIgrO742z3XA4vEw+uoY3HF+fxxVY0jyFGIy7F43qYfPub+Em34zmnAdIiyX9UWiGfHZyY41AkAsp0Jq7Oi/xgH71ldbtsYxDYTGc5eALRhDQnQ6PyQFo9UdyQ01a7G/ZRv8q3ZlJ2ntx541zQUpKhXBJnGtOZMqF45QhxLzFkpycS2InFXJuqGsgUqei7x4+jkVVmN1qWUnajvGlzStLuwxcmIy/cl3hXSgbMPfWth+Lvz99nxYTqyYZzd3dnFHfWwp5R24+LBVlH1aF5MoxKMUYbZlgYnEkpTOgdMaRgTR8Ix9q5iX2c5W8RAquyB66ycBqUZL3b+xy6t1kIkuOkIy/QLMcSStLn+DFANHEMzAwjLwcjLowQDIRyIy5qoxQ74FpV1OxD+WQchF5D0QkMFSnYGC+db/BKG+f8s5uncVfX+NdN3gWFxo/B4mv7+naBCeRajI5/BVEp9/j8pnhGsz10eV1gqInJEzLEIkoZ28qsMnaLwzuOmUzRaxVeXzd7FvKErcCDWzMwfVVo1/lPb5dtmx5f1Ut+9PQuF1ch0yMpspwVu+jph5Uqe6O7B7AYyEDAb/2H2Ei38/0/qLdxT49JATr8aTrOJD+I4xNHlP7Ng/aQ1X88WMOTszNUz6BQx+MQCJMQIAJHHY52oMy/b4wQvJ9CYjvk1JPKcoJJhvuR0IP7pFRFPwVzJAkXMebHnDzB3yk+rn8pKqQkzBm2sPW0HkF+FFQVUZVb5ZnoeonbUYqsnlLyiNhIOp3LNaVDIyncU0SvUVsECyFLyf7PixCQZ/3m+3WBoS03tXJFPof5OrXS3DVjFery0JQG+jtGj/OBRmG0K4uvtK5W0IIysZvOqEh2C18ZOKJAQKsPAcuRiSHLmp8WAaUF1ldYdPX6z9Vd4adPxkN3C2ezRKbhmqSQk6CSP6hueaELtcvO9m1sR+ZaL9bB7faf43Nt9JqqyPm+WOD9kHT5++bYzCpH7ZHlK9J2t5fNKZh9X4+zRbpO5NWZ9SMvDpcVNWo89Gj8iynrRdO2lXZprdftN9VbnYIqQXCZs/Sx3fOwj8/YRQExocJiYsgc0yssYlJGW59Obe7m/BrK0kmTqcMjLggjLv/Zh+Yav72Xydvw+su6eHkwkxU4RBvY+8fxan408+VfzaWtKWBkqTlVWQTr0/4nyXqsqDVw+6WC2P31ySgsSR6IPx56KfP89CJLyBx5c5Q8xxOBzIP4Yo9Xt4ufwpgPusiSA2gd3o+p9B0va9y5apMx0UmSlJMzfRqHKVXuXnV7ILp1buuXZF2QpLN3rdYxbK2aZmRqRJdR98SXvJcF9359t+mlO6XxS05nbgLjIy5RudhcX5yTgpc7kScTVU2Hh09A6Y60Np0+Eq86VJJutFZR2LcjGrGwijHy+d/5fC704TuVm+5s+sXRvgYSlmIFAlB3d+GqkCkPXV4T5p69OJNIVHp6Zz6GvXU2GTFUKiMvnKcJ8aispaV5v8RKEaVs4EjGQxfcNqEDBNMFzEIZIFSIDzERWJJDAhiIsrCMLEYoaz8d4+HPJop+eSoCDGQ8y8bMC1HrQmu8+pFYht2sMbK3r5rYhpVv4VDryS6IlW7iewHP1RO9rsEfpF3bC7aV3Ru8sr6VczW2cJ2xgps7m8hnGyxdjhPjfKV+vww2RQIkIy4zhOeHeOThyT6ft/TpgsP2o/Ba63tuObDog6RPkpKGZuxgM6zfdZhLrGDTjYcvzZyR0T5beEjeH2iMvSCh3Pzh0FqC/nBZ8lc024YXSsvlGLMyBoNtdESEpJ0DufZcGZOu4cozXTqc0PVmReSBCyMrTb+H8pdl3T6Mezy3hMN3bokbEBeZyJFqT9pbx6rJ2HxXR0X8jebzq4BBBNjbo+Tp28/NuMbCWUqSppupsnZYa66WHjcVXPuqCeVWyvR3WasLy7XmJCXYy9zuFXPNhOn8uK6dr/gzzZTNaoBPXUh4MtDyHu2rjz7rmrqlcaom/VZtivp99KE53BtlxtO9ael6mYhCXr5OdS6sL4Y4dvVH5PzOXnlK4wkaUT/1ez0fIe3fvTfKhHanT9UEn+T90njIjSKoJnt65zp46F4Zq+HOseyfkIhZz4G8/U651/NdNdKM762xZfP7dVifvERNtDXSlPxxIldWMj5FHP3pqDVoeSYuMy3DyVN6Z+osR67M6ugc30k6tvtXalJ4J448scfzI9OA33MZ5R1V7dJFe/POHLSsZVGV/fwm6cJv6NHK7ODpktvFMoIQR9c6icntTBbeSOOU50Zpmfs1Wt5aZ9GuciMuaDl7fE9wsdBrs1vp0hVqabKcV5yXoTCEdUrTq01Z7aQc+ZTdH433RB4WMmB4K1TFY8VM/H77Ne3alB3bxvlc8urwR5yPkz0Z2cTKJucq3PdruNcrmWJIrypK/5kM2NFblXFOZK3BZUK+r9rmjDM9fW9c6GFTGOyejsxsto8FuoNWyyubap3aquFVwl+6Uc8lU2qVd2rFrtMsDDP27j/KTtx8V908dswql31g8Vnzt4jGrzNvo9F1CR94h4eBwzp0Rqo7nVn8ezBAhlHlniN3DlO68Pcs5/Q1VJiMPk6S3z9EbtXnXG4l6dzbztS0pu7JicyZr+EIRoz0qDCcVXJPzYY40slrUW3FhsjF6QRO/bpiK75YWTwv1SMue/Pc8ka3qtxURliJEY5ViTr0DCOUbWB4CJRwc9W+9Wx6bbro48IPNP7ep3RHdA60Ws+6cKNh+bpF54OXTVNOgjddGrAfMxPN+gtrS4IZbj3kfWYfzURKSwu6SOultDF4Um2CZIgZDwwe2o/FMtFfv3EEF6YqSB/ilNQpjAeqU12HN/J+v5mk2Iev+0/Ua5gHvXj28TVAc1ekHIfx3EaWKuO/ev32NfaOxG2nk4Sduh3IpCwVqISVXZZLm6XpeiMvi9ySQkCbTj4c+nDzScSA7cOa+tmpSbzTb2OGUM8jL0tuyt647nEvdL6/HhjcVjtRs8+ObWKDcc6SbYoSTjskgdtR9GD4KHO5uRQwRqGJJI7dihmsKfXWehOLtiu1M8O2SG/1p5/boG4z+K41vQSjI9/TlczGVWjOksrCxZL30FHA+L2XZ2fk+sq1yL77t+bBVMkx3CD04mOk1VvW/krwFTcTbKe6sxrPh8vq0Y1q1laXXRke1M89EzBiKoFrNRKKnKhFBMfJ7PdYWsXJW80VlDs3YitPL7MbNNo10OQZjueGJUaypvNoZ/bg4yt1TJNZIuSk6jSSjdfQBbatepNPRc3tVUq64HY+dRt3DMHjpzkSJtYpzsOghOXOxHg7pJtTujvNOOhrIymw8l9QefXZaeall2lwba7jIN2H10lKYWWk8NXSbJcXjEwtoIEjL9yyp30Ckb0i9NZEybVtpJbl4cLvpli1lpoFfggQNy23entJs3h3XQIpuBJiLnkHhU2VMKsuHLq3vfYD8CvqN8d9VKMOVwxGYan2Uu4LD5ZWn4O2gSu1F+rCha8+Eobz8ZttTTu00sQSrSG7Vu5Y7c876p7o2XGVqHMjLixpYZz7/xe9OvAfGPtVTH4cEH2B0FNd+1ZpCxwqynO7nvsp0c90YNYZGnVyz0ctBWrmNIrZXG19AhlU/bhfqWomDwHV2slzlyEzwyKV4tBGRCagS68dIVcM+G1g4aWFq0145BVZSk5ld634UVeyqkLYGz8Mj51nO7Dap43kRdt0jxp0PId33umLcGfRPjSNOFwVKTYVZRKqwlGh/RGGWk38VyMudTYc/o2u+Uq9O6AlHLi9qS3zNSH1JkxvcnYjL6kmyW8yp1i3l5ASRbbp3cQ6DGebzNRGPmyquDyZW7EWmOxjU3VKjFI2yVC8x7c4y3FHUrlAZE6b8s/DxPzyz57fCN9w51HNA6DNN6zId3MqvsjPoYalvunbqOSJcfiNX4cF2mMC6n0W+cmIrcnsTlTpbyy7QYBORobwjOqlJKo3RHi1UVCT0HapSuC8wGJU8pTCqk6i7vs2IOluvtDbW/xVOvC3o8q74rqcL9Ls73UIneTobJvHMoLNb74uqrulIkUfVGhWISHgcKMT0COrdfTcu2nI0dmqj36tJpezSJ05NeGuDjbX0yJ+f4RB1U3R17KxHfW9QlnhlEsR28Lo3jyK5GePZKbyiuWTMlnj0FIXzGHdXYWcOs81706harziNCa1NqIrNeUqE3psOvVMu0zu0V33SDC85Y2cfWvx07bzz07ux9b9UNh4xisjLtXORltBg+VFcAv0rED72Jj7Fo6Sccgv08s8Xv6GG5NtjoefaGg3htzrDDowUQx6ennJ3YZqEAdO2eh14YjsIylf67vxx5Yo/dZDro7Kd0Wm+yY59MEdXDKLnJC+nZvP0og957/Lq5yzBkMh76Czi11utKVSY1qflOUUq9vcx5V3j17ujy4Exl/vrIHVQjuY4qJT/mGc/vs8zr69wyaC9nhx/JvFBJHm5V/ePSsUyKtVRK4nfnovob1pR6EBw1OzdCYoTfiXhbXwyNK6NeWVmZfjRyM31oLkyaNNm5gk24woX+F1Lca7XMolqhylHclD6trkFRRw1sCJJKBUfUccNchNfoIpgF3WheB+O0wjX7tVnv2yU/DfTevNjr5F+eHl2Y0t06TRbp0jLzGKuE1p2bXZzBikXZyK591ZIy7xcX5YX3ahHF+7WeeeUvlnIy7rqvoxxBxlfbU+WThvz5oOZ4bcdDlfDhSXRlS3VAT0FHLSTPqNDOxjqTFzSLL1fi/h0lJQOwu7jM2eO2SQx2clByu/LjdJXfxvnswcXQ497An+wpexFoQgfPVrw5lT2aNBjJhWPBQ0y57+ljGgrd+O3AwsqsY1ceFOFPN9FmqTu25NtGUMqtemkFsx6RsWNj0wTVJmjnRZZI6FKo1igEuX9PzbN35vk+Q+PyHx/Z5jkjrY6o/BJ/wkrPpEwrXBlN/8Xpp140H3FyPpIPtuQr3dcvSzeTrshsk5537ofuYQ83dkkkmVqZ2TrAvbSjAr6qKqKz0uKZh8faNOnj6Oi3BxYXGEr1tOcEl+j5bsG88pSFw283TAE6U+iw8OhziV6n2abyrXn8VhbPQ9Pd+5+zzYeHL9H5KvP6FPm2fxbG3c1h7LDyLujXg8gstG/UZjB+pY44rTkTBgVtjXXENI/qdr5b/wfSLFnecfVP9ZgmG83VL3SGBlydgGY2O4wwLIcGMpzNHnK68G/aJdnu/qweE9H9mXv/J3/WrwX7GD9IQjLvKzECVBgGGvqkDpwwbnH/T2DBMP8Rskk/yv99thNCMpAezmr8bqIA/rYp6kO1J6hTRYaR2DmHcIkiwv9r/Wahth5Dj/mZP+c5rLG378iR53JNI32EB/hg7FjMih/siBw+QjLzUDgMTGqam7YDIlfq4GIykxYMDFTBcbWkAyQ9nU8SOZz5JXss2p9Z4oImDTadp5MFXuxQb1JPd7ULM6kgyHiw/JIhqHYnZglpiNbKCPgf7PAdCKekd/a+ZB9L5KdR6Qe18foHoDzH4vt+IcH8F+R+d5KI8jnHyROqOUp/igBZPWHohiZnsHzkNguSoTaJgxg/HD/1g4nQ4qvHlnQNP8j9XPgCp8iHbbA6REefzfu6nkm5zT3g/YviO4L/NwFBP0ifxpzPZ/xeWzDnD2d+sqT0s9kfF/0VbCrv+by09RYMRmiQtWdwan0MGuhWn6l1o0x0EjLmsm5hFhrnOUSMJ1eGfvNmHWgOG4Bub8XBlQpCmfmyMvZqmp1M0do0Ff2/1n8fuoc/0qPx6TPEzrHZt/Rr6IH1fZKW0YO/Yfay8v2XcesIheEQRJUYaIoMfoDD82DuH6zaazMEBhnUqSkjtZ/o79xTuOkHB35F5UKCf9g0goEDO2QJvIwdj/IynPZ9hgJz7urya4yhMtAWIbMhUndmudQ4MJr2ADJD9CyUhoaWHbIy+b+xXikE8jLkM8wqporiqHx1uJv/vPoNLzeeKfh31h5E37sQUx4e+pVVp2VMIfAyL4H2T3oMQ8QPAJ1DeIBNtDEa4x3NG8AsZnAp7hLXaxbvGIedu0DsPJ5h+vwOiOpKJqgjkMIylzmgswJCDIY1gEdq7+8ex9JsC9A7RxTCMuwdJB9Z9briJMPiHjscE8F8DpxJrmOdjF2GMpw9phtkk6kDrrIy/THCt6J2n4QfqSFcgYgPz+32bZsEv5TMv6vl7Nvd7FoyfgZNoHq95kbh7LonXx7B2QMlHmVuwwUlIESK0IHH/URbbV/rYPhoBvyAIB/gXEGJYVhYhL8OJUmjHz/ywuj8lkrIbSJIh7WkLNsfM3w8rlh02NeAekpY/9eheuWfnOvI3kazusdJZ2YimKIEOpJe7g2mVM+MrP+/rxjfRWWX2sotPhaXVlhBSywpJ1p4anBi5MzJJDe1ef3+Sec9uJisbnE+ny+0D52Z9DR9xBsQ/SV/E32LARbrXefOdKA89tWbI0vSKDj5UcKlSVbtOXoTqunOwZAhAiQ4XITGmDp+XfORigpY2HxUPWzfhN7IhvIy4hVFEjp0+q4+13B2HcSZKsD21tMPScIdzh786kTJepwp/WvuO3weJ1HggYBx/bsZmIdn7HtXBOH7h7ce8wkIzInAhDEgWa/ccZidviCeqbhuM7zM/3WyMu5rUyXJyOghN1/xSkk52qkqp6iKd0nKFPguaU/K7mkk6JNvWWdJUYRWc3bukkkLDvmnfLEr+GzezUYbC+c4bDPswD8E2mmXc2Th/Fu0sybVkMugL28A8znOLFixY79dp46ddDVOZRy0DVJznPM1LGHZ5NQhoEyKBzo2N5/CnXHU3mPElJT9Z8p7l/KiFJR/nMivT3QAnI/e/4fPyB8z4Ho8srJ+dRJ83+xlxgllQwpdFH3G7j+w+0hlAjLh3bB8hypr6CmEYQ991xm+OdOr4di2LxtCJq7u6YhInD8pnZfVpWos/cA7SAoOmSWLJICD2f383n+38Riwi/K4wQHfpqGWLmRWRQapDQhE2Q/CztHyMu67k75xCayJYCGQjEP9oIeB+aU34zGv4MbG+CUppvUOQ3434jL4sCouB2QqYqwEvaHU/oNAfh3CPV1h/SI9r2HUZ9/ucTgvEkOIcjYebH5BTOP6f0/7PFDq/QH6O72EhJmJFjQnj6FOs7E/vcFTyG4Heh6DyOyOiLQ7AebbA2PbwD0huoboqbzs6SjQITYP0hU9hgOUinGjp3llg+jTMUNCMuVN8e6nHbJpozwiTlkRRkCamYUwsQQBwinfkYGHNTcvESzicTmi4d5uPkeD5esz6BweJdJfuH0e7eomKciiur9fnud3cQhHEjL9rS5G5gbNojLgMI+ji21q2mGm9QPUsyW5jghvYIkHbBLMUyGRwDaEIIGqEfE3uNpiadzH3SNsYsH6YD4P8jLhUh2EKHP4+Bp6/3nKGVKI37Mvo4jkC7QFciTdyySzSdf+b8OTWSaQ42ixt1zXfWc7xXGo9aGZpPE3rHFrI9xRmu9tNxGrvWV0ZW7HxSgbBj0yab4hDiTXFSrfEyqZhl1NDP5tFyaG0y6G7Y9mZomZDlailZRCKTpgQrseAtOFJ8SjdUXI92lrnKmLRlpNhCajGxf2sIlwM221Bx8eH2fiR88jZDSBQjKf7oX8/7DkBpHtOPCAGNRP7Gdv1sp7sGuF+nmzO31dUHY3dbUM/yt9fc/Zn6WaSY3M+o2NdIT984hvDuHBmv1sgqqqt0OkhJcg9BNglJJwdnNu/uY9bHd7GDJ2yyDE8wBaj9JHx9hqLXAZYd0F6iopU17OpD47s/hf6ZPz+tLjkBsf2K2eAU2uTaRRivGVorV3EdlOVX0Rf893k4xnBTzRL7XHHEXeD1dXd04CMu77yrvJ8p553Zw7QiJgcsxwJg5szaiCi43UWt7NxOrryy0qYusyUjNZl7b24BosOkTMITMfhlWG+b1Hqn0HRMYmzHQH4QcZxy80NzDFAhjLBwlfmPlX3+VAbMqEQ33L8CudDcySOJSklDIZih+G3b4aPD8UB993HDzN3t5ZnoZNcYfFWTKnVj+U2QwxzbdrgDC8hCDzD5cmRfeHxgIazbGMkqXLgc6fTfcf8mpvznqBo0JR8hjPsDs+O/qNP1kzL5TkURR1ybEO2By5EPc903KcWHDOAhjUkk6JCFk48ZLhCYSAGctCMpfULOIy5JCGh+H2Oeulh9AZDg19Y33gMEefQjLtaYxD6On0Gk0iTMcSUcgrhL5kkT3LB/gkN5ifaBg7wjLqXZqoWA2fcD0lQD0Da+yiOe4fQ/LEO3AXDkg8z/DIbgP5iR/H1dugH4e78ukQLhMgQwy8oe3cekESMuxkvtJHuHNSIPPic8c5/A+3pyzEgZCLvTVu+h2wTMeROyF6npVAhrWiDsb0iAafqwRHCVRNjqEPiYPmPz9xoOD+pg6UN0/U3oJ+dLxYuzmNpbuGcbIEGjxrCNImGJSWVh/b4hQfxvb0fI6z9Hcnse0/wYTM41Qb9n1N6a/OK16iBhrv2wR8zB2F13Bj4zFgMhtIetGfUiekkHE3R7IynufZ7BBLe4rh1DfEHKBAyZmZm6MtWx8+QYnM2bYM8xmg5zpK7tA9jAVJsgNPFcMx2hJ1+4yOgavQItheyeps2OQYhoPKmigSMvKGKoj6HkL05Gn0Kf5j0LsgR7FV+ZwMETq9+jzoexPM+79fI7Hu8jKTiGsGfgPpvNMSMkDz4vfH0/IeChmT+kB0S17T3U3lQDtX5QcPcEpJCEyPo9L+kZN1pVWd8SZmkmO0OAfDKTb7dnpTDefkc/klWnqZis4hu9Z29QfmOamcRfrU60XZkjLzn8GIq+wXZUT4Acj6lDv/o1zQNbGPBU5OkcIymGEDHT9/0jKd8YIBLzcSMpbmETbnLwlaW8jWd48vH1633ULgY1HPW1rpnJOTmKk2eJHfIeg3QDQW1F6Oipg5DMIylw9fZgw1hMmzNU/sOp0nmGTv/INTPe+uxX+dR9Z2ox0QRP12SUJNQjLgGkIZm7DINdSB2saqgzOx4WkBoIcavIa/gHvzpN9QOM4yTVWEaSJbKOg8JuQIqk6SMi9K9OY8Ed/omKmGufTB2WwsnNcTQfqVROOeMjLlFDFKArPT098hmICZhmepRBjIhFUTEhg65xkuPK8SMmGcs5qyMuZ3SEoOYeU8DXvDlPhDft6GUJkGBO5G/hPZ43Hd3ZEPu8AwSkKM+rufE9LGDCRKGCwP2dh2mInxiNVtUu1VZVlF1tc12YzdCY6G79L7DqGG5AcSoDzUbgHWzNM3YYrSqHtCMp9R1B6ejHs/aneexgeKPcThmWGjl6fO2bfYMHbQj56u7WzqsI5SEjKfJikpMzJpOkvmt/P7JP8zCLJVP+W7uMT/fuXVh/qcYYLIcgwxrNONmpE0zRCJHleRIvVxCYaZVPU4hQzw7MOKxNMLeXn17N66TeltXPE/iPFzcJsp4IHIMfwxOevJ+oIhfDFzPp5Zma4rNNBN5Exz/cMXdrYM2JYck13cnAY7QHGoCfnB3EdfUdX3/kOs6lTxo9RU0jLkRQ4tkrhB94nafmA2Pz7ovBkDq2T0HoxTzH5QXNW0jMrEI0DlhYQQTJt5ZGyRkcOl/tk3tuq95R+ZsgZuI0DCZzlYYGYmzIPIae+YQRE5IjyMMDB7XIj81WM+sEQwtNBQO5rTH6bNl/yDEUG+T8Iy5mljFB2HLZEJppc6SZOOMI5lAPRGYUdujCQUExCTQmkPWjjWGmg4/WLFdatIMctHzcRi49Q/oTSGMG0BoXdgJx/HHy0GzALzJaOLLpZCuYbLGDtAlK++QDeaJEhUdpQk4h0EE4nvQ/f4IoHcCEPJOgCLGdRLSb5hcDtieervYORWJoao48pv+vmlQqY4hgD3RLEpIMdirimEL1MaU8McpDBvD4B+jCpx6G8hqJ+WxuXCgqd4vkIynhDCYTfP+Ib6NZp6fjxdHYhT2h4BqiJu7MGuNwiaKpS3+hejRkPtsRONcMTBiMkkVkymZjL4d5V8PXazu1cteduNqrmBQI0ZiTFAEqZhrVgDaMMkykaaTY/yMp5k2kOn1dfrrlyZbu3ygeAaAjLkgVGCTT6qw727Dp9CBQFB1k54DUxMhD9YoDaH4CBQUYY7elsRhFjFoIoFYG2ew91bMUa+TB9AM6r0OtdQHDMKKaUoYkDBcjKeSxGhBVTx22bCMuJDGevQ5DBpZzD8kijNUzHIG5pOCQbX4aAuxGrQJc9MdVNtWkZsWHZCD+VFxeIeA9Y5Q8XTs3o7H+G/RhgFm+SBluIy8jLqtLaxoGYLjEBGocbSMpRZaPpNyYHvARmyMutJnNV1j75aWWwoN7MxhpDIC42DoSoVsk2Inuvf6fXMIeAnn52a1AKYdcEa+01jhGw6TyRL5ZtWitozWOVNVIQgWqx5Ds/4gPi4HamBLmcWxehNnM45N1wxRB9gMCHs5wxsXP9fBp+fq+SVaEFGHodCMuQaEjLqZhJBwjJJKOWjbZRe7PeZqT7/wg0GpvvREQRhKnTxkziQMhdQyGbmUwGQQoxkvCKlFBoQkP2hy6n26UUB+QMicRnhR36SMuxoGo66aBoTOvh/dDtYoInYEnHiESTJGkQ6b5IiQ/MCifgfIDx2+Xz/lJ+naeJhciL1PTrRzkneeZ6ExAZJny4+CDF3BlH7I9YVEfv4fkCP4bieSvy7v7YuvHYcU9roCM7k+nUJJnDn3R1TT22kkiXEzJORy2xJt9C4wBm8hSa9Z74/CeNvtCVTBP5GBv3/HP6MhoyCgY2Jup/D9+dmGByf4fI+fAh50zOpt5XeJVGMXeAoEEA8gRERETUYww8jtw605AhywXihPNOD/g/TzfKG+owz88Pe3t9G5rRGElDsYgYSMEMkrF9rITJWpKzchpy6VQv6kL+oGhLQv2D9bw9EHyPT94Yew9Y+09RyNH3o8QeJ4jL7gqYsLSJ4i7jI74H7Ae07Q3dj2cw7U2HzHmFOKe9V5D+384Hq0HO/LHj2eR2idoQr5HYp5B+l3NwElHQh6vr/NoNlIRTcQYq0sjLs+wyJsxpDrurG1MzaQ1Be3BBihW6UhQLCEwH9VyQyQHcDx4Azos9dlSeGDnYcsGGdalCV14AZe3rPEOwrrEUVYYMxgmhoDubHh5Gfl0usO/4uiepejU7yMvIy/lJLvy0MaNIymTOmQM2PZwPu5b6FCyyVkjLvByehMV1M9qD1qkqR+KR1ofVoX6cITvHaMjL5NivF6/hztIwaNsdHdEs2WkUfj+eKqhAncTto0WQZohCXSYRaY1cwx+eJl1Tm2jWcyd1/riP72UbLJ9cO7awiKd+xDnTVzPCUPKU42Zpql2ps4fayVlj1Hw9h3uy/MXFPaHkdXo0eY6Hi+g+xKReou9fxnZMg4EkJQcQV4tUcg8Iyn6dg6TW116lCbhn0MD1ntfR3vUq/CQoHqA33jzVAfFL9eOoQflU/3NdKVXPYcYCQ5yFcLIMoOwewPA7F5fv9Ntd2rijz6BD4I8VQh/GSj0A4nkvgdrsOKxxqJEG7izaQHUBAhDsMOaDCTj4n0IXUBybMZtyCMuwPmaA/DMMzNApKrJdMlhVmQ5T1eXQ6ds89zxm0GSG2jjsDag+Y6mLSlsw5MwHa1jA5u2Mc1W3r7kTjHaeSf3rF9yELPxGyMuzATu+02NB4RMjx96NZSKXLuB8EgvtxMTY56gvJGAPkY9/qFv6ujlwmfyGZjWM1GLW8Cl3b/UqGZ6huVuLMRX2LqrP7ZXIJny1YEjKfZ+25/olOrysbNewnr4JuZWfBr9gVPzqVD3/frcwaaNrBGCZzRf7PvyfkjvKdjnfSbNBF8WvFU9cv5rLzjqpX3lU6THxC0cztRbswN2QAQmKQGGjqiBrlof9DHXp+dTha6ea6rIv6gQwO+tc5KMQLgsYxVk0VxUQELTmRGnbnR+jc2wx4/WIy5MECOoM4cu6GIffumrmT3O48hjSGgIPM+gRTE/JPkbGtI9R4lsH5kOigz+aAKHh2QgETMJEn9/xRD1h5gjLoAjKfSHUPcvgvQ/H4I4+JBcgUWhGwK0kBA6fVew9d6UIy94P5fpvLJ8epLh7ybnZNMZnNk9NeyYGdhCQxIz/n6nvH+BDwnEv+VFbzygfb5BgA5RkxAhkBIdZZkDtyWWEtDsA+c7JmBOpMiCe44gaDSGRfh9XyPZ9Na22EW+hqGmJpQTNvamhChbvNW33L1Xl7N6+kFXaRSEOydwPmpehnLkIUED5vNhnEw3AS3tY2mr/lRZDjgi6c8dOTeN2y75xlfV7g/g/D2dpxn87Kfp1hlThXNPhOfLj01soHB8MEkV0cuVoO5XYlaaoKghomg9sXuoFIsowxuyxVED8UgY5mHbX28ekNaOlHMJ4ghm6pOzHVX3fXCEHgEytm7QWDiJsqBEfkTQQPT7UPRER8j8HvO8GVojKV3kQmVrNt7oIynELzwYa7yMOQH29DnV7OgZPUwYlGePw27R6HqhOhfYEBpGjNf9i+8+//Sdd51F5lXYjH40JOqURnZi7YKswU0Q07WBhWRE9/3unM0gfx3PhDTEf6rwZwyQNMRvCMC5W7v+TauPbE9vjP7yIykpMF0ONd/36n9DDiseElCSZhIjLq2jTmZFUO+YbTjJJ1Ym4sr/JSZiRWGg1n8pZdQzatOp3d3fcAEmY7vmmOMB5iYn1NCff+6uV1sj86kDweWdWyq8ashxnGQ2Jzl52l/OszHz5yS/A4wgH9KTY7/D9bVFPCpAH7EwfsDfPq80H4PyfsQ4gEMnh27zeffQsoyP8kUyPW29hmg4lMxt2fdboUloeX4bTR2Ds9TDIymRXxMjjgh+z2X0P6da+1ur/H1/UdkQjcxUk6H3zx9H0D6TJcvbo0lO2OGQ5OQZEcA+6DHZxezW6bOGQYPkaMXs9po0w0UiSaIOhpDyMNLtviCe9FH+nOf+fzgY6OgtgmIEzX+TXtzFrpYJNWDWHvPf7/fvcJjIR4vvpdw18AK2NdjykhcMMQGZPmfMDxwfUh1loTAhlCMpxnGKYbBh6Na3vlIUH07bU2rQez2EmPXJag9p+5vej+vm71Jn/vFAVcqeuj+LIy+vorHaaf7HDo/v7YxDp/RKYRgwmSEzoyysJmFiIy5mtA4JUUBo0Zpk3ilf6SQ3hoTYwwNzikxRnDDgSmpEXkrEpINoKwEZMVSEFajEBWm0BlCAEYxkFIhBRoSWMVLEBqKTUxA00LkD9CATNRjpzAM0/7EDan+EM+UjLozchCv/pH8TjSQtmt8CengO2Ym6m5sbGyUpQX74fm4I8dt2mnSFC/49GqpK0DEPK35rEBmYO2utIy4wxd7dwJw4lZgkMNyEiDJJAzGB4iMu77ooBB7kWjmXJqZUH+o0isRycYFVRMHCTXwBFeSrKDsQnTfGOy+m40fQOH425eQlLZqdj5pA0xEPOKHQIuv6cPqb8xk37f3Y/sXIUdcQkebwoZIED+cme5qnbCWBBMNM19f9PGdJll3/LelGv3foga2Z8XRjO7GwnfjQqjFRwR9aBm+P5hAhKKYaopC0JbAUNOTU7O3sshh2BMlbF5qb+z9qQk9cyoHSTM78OZrNVKGofCB/XSFHIiMpiZkqpBF2UPyfVk73Gas0ZRsVKnatsUXInOXaoaGRxM5jyBPFR+XPpS0r1x7z4R5CbEWKD9DK0qlQgc/fmPn6kyam8hp+7xo88pN5DvdvW4dEMzL4ygcIE5w6nvhyVDJEDJ8fsL4dfXSQw75kQC5BUkRz/PsbbCxazOnxmze3z1RoZHmkOVj8/KVhR6HsHIEIRBr5uCCxuR5aM2nbvr/yucKEgVtuVoSlm1ZplsRQF2IcmjTosmKo0BDaMA/H7nZg4ilWciAdjYdg92x2v7x0+gxXEUj8QxQk3dOgX0x0kmXDY7mCJaAr1dePSSMjbe8jLl5OI0Or74xajUFMXYmKp1xU8gcPchv47qmv6fTJyypm0HwFghkgpCrpEgikRQTqQtEspAE3QpyWFOIj6TiDlBjBBE2Eb1D85G3ep0LGUIJsXGBct4760NY8Fta8IOomaVpyIPpL2U4PT/BQv9M01/Tu/zRz3p/5ct+mHCHfGVwj5cO2lHlkqdrn2zHjOPJFHT5mjvGbvpnGfJy0w4Rkgmv7TlvXh3zZFLbpzZguoTID2iNmd0fL5rfLXPRL2LZBXPMFY1PkpZL/T/CWgJ0raNfqhmaTIZumbs3xCGMPq9Ua/RsaBmr/Xy3uOT5TNiNSTudggLKfLDa1z8JZKR1q9ktgnMNnnSxPGISSKGorJ0JCow+YzZ2s2CbnEW3+lsYr4c3WEahbA5kw7XRuk7jvD9pGWmo/Lib1Z3mxtDKIaavb7qop0ZuxtqttIy5oDCzXAziZqq6xMivyTLJ+qCECOfjQj8ubt/r1HA5fCf+Ki284Sw6b4uaro0zppfsjKUXnObEWW4sxuePQ2PLWvMob9MrDSe/t8D5ZI804FZ0w3BJfxKpr4aS+A1Fv1W7uUqI+ez6owwimgrzILMy3KX2JpfmWvIzweT+K68dgrHjpSDXVWTK/2OmuiO+WSaIHDscb3O3rgnSo1GdSj+a6z23WF12218/ny13WFCSqaY5KDNNgjRm5uWUqounZhpJ7EV/hLx44a7ZStLYPmhjDZZDZIMpvgtoPL0dvM6P25wiLWhvKNcdMd8ax5+Ocd8dJlxkIHhoyW2muu7jo4mWhrzuvIy43ozL1UsEBJMZTBhHdD4+ED+b9zz1ONGv2ZbSpZt16DtQhQaIZ0q2QCT8lNcb7IkmlnU0HBwe8wjKTV2PT8Kc9NVqG0aq5bJ1Jq7TGITYTnEr5NsRhMczT5PujVnIlG04vlHl5UxFeWd7um4dxLyEwO2RDu6vmZXCZ1XSIOXOFUhuHRzHr2MbeechnWDU8x/tQmcHrOR48rZOHvziWvKevQYMkIUzTUqKmaNBqUlTUlRt990uaTzTj057HN1XurghcFBdipr2dSwmIja4cfe+Vg4raoaPzuM8bLpNLZuHDQrNG4ea113f5OFg1TJinOfo/Wej5j8C/p+Wz57+TSoQ0IvNPl1vIgnwlz73iPvim0N0XFTW71dM75Vz0HTjZL77uvO2+/CT41WYHnrhaRRrnN78nbZGOzabuj8dtNvRv9MVp9TvjU/l0cpqy7ojHIy8JK/y9O0PrJrP3nHN5uuMYzGBYqRdVjPZjZNvzu95vqNV+DGGT1oQEO5SJDlkpinpcIQsZjyUhiKDsXKzNwDHzu1NfCNXwsDGc25LHNFD41pYFJyZSxD9jJjau5DLJ6VzS+Vdevp3V114Gmp5pwTiyaetgaDFsSIwo8fhRfcM/18AO//mvcPsb7vvDr7qYeMegOUi4n8e67bzYkdmokLDo5Yo8ETW79EP6Sq3eC6aHJ+qBmK9rszCQajpeQEuj9kHWUpeyQM1q3GD7xxYsj2KZ6VVP4O9kx2Y78ByGC5DDJBWEWdGD9s4WfNWFiC3F+nHpTbbSQePhIRTeXzxZ3mzSI3toOfhMCzE8t+iYXaFsI6lRXSsyRlMnlMgxWE3HTTnEM6XLeQ5RvIHPtPnoEOyFF4kgxCAYHmQR4QfJpNNGetCeNixIwIJHIx/fQFMJCbDshIc2dGZKqZTWHQLvp/moCa4aIy5itCl1LQtCkO12jJyZNPIqEKCLyLlXUOXEO0hccdUROcHHyPlgw4NNIymd2AXBiGKTM60JmYOcLQnh7WV8835/bnT+RphYsmQ0t+z8HM3m/TMtvR03acDUmjhyOUtFsmrznznfb8vTO0THNyMvBgnucnRszslLKGcaEVfK9MR2dkfhQONGs/lvG/kvpvwHRbx3GjDTHl8CUqj8Jkvz9Rw5I6uBpg6A/dFdeLWghMrB2Z+X+XaxFS/tvP+rRAbGiHWhYZjGAuW/9eOMompZmG0SP1ezn+wxsrK0lmCA+r+TswHrJqaZ/f3xralBDITAUZOCDkQzr5rvs3zP3/ibnb6v1fkbmGkw34BByYq6GPyIal8x+h3d4rb9wSZiZNvxfyBBBcNe4H8rWuYvTGgfDEW4oFYXaj8gF142gsKxKOgaevk/3sNnfc7jtMQrBCYGRiJxB/Jsz9NpIbIjLvasGtEbGcdrqCHg2IE9ZYZHXTCQYG4FyGhg326VZrwVeQdR9Uh4QKBv3oqArJAi8xE42LamfMlbTxdwijDUIy7h1MX4XhkxEZjvwZz+00NQI4sjLsW2GANoC5hvDtx09eKD1IeAEKPWKikUZFBW4JchoGxZj9Dkdxv/uGwGhhVVFVUQedU3JJCVU8Q4DxNhzF6nPK5AwHECm+3z9jIsnM0sXg7GZ9p9Wv2w0e0/GwRIkENCdmAkS5FaCdrxPB6o6elopg+Rs9r3eYfiBAewTtIWj0fbu/qOx8vngN9WE/GFhmb2Rba+wz5RTuoRNVOUZljxnR7+Oj+uF4A7pGkwRiMRA3UBhrKww0EVUgYjKcMGGhrGGiMuQCBaVMhyaCBeyTHZRTOOthBxFTIjKeD60yMukMGnrVzsLv5pc5IuGbji2AhhtWA1i6ux6zbMhmElKCDQC0XxXe0Bbjs2Sk32o725uYb1K53XmTslx9f559PDXJJ92/xe2taNXy9uFW9v3zpP3arNdZrOX11/bLx9t55NSu8eDI+QgDPY7qJo/OdjgHq2clek5mOoOBxkzdKL/ml1sbhqoyMu9aNSkoRGFOFkQSDyFaSWZr9QksNKB/EZ+YxQSUjFGxNVISMv6v1l/A9W9TNZSwWl+p3MnQNKMGBOZRWGBuZhoTE+n++8n5uK/BTtD2VUVVmtataPkI953BuIs4r5BmGgkar6tzKjM0h0UabF36MSkL5YC+/fRBEVHjuaR/rnZ2FnoHWYVCWTrJUmpZyhfb/K3Dstrg6nQOlQljbETBFYdFkJHIeq9mK21YkvXikjL3kUND6+5kKDGL02DDieRtJykSMuNag0ks5ij3GpJR1NyJoLYf8VfrjAkxVZhJ4YTbJzeBMhUVnGO3fWJse8TDN7cyMpIshJoog/caPsOBYH0GmmIy4/T3++SbD3/Xskcc+vaWXsBcsoKSscmgHbq23wBc/A4XG20itwQR+fCDFoPbzwlIQeh0hgeBGju5dN+ZhnpvDyAegpuo7Hw76/0ZEmSXM6+1jOBI0UBj8REiTdRDBJrfxDmsQjLiGAzLTJtLEjXkzTVqUjLq/T3e5bk4k29ex4GZs8GVV4Iy4qoU0jL7G1sXFTbmRrMbBApF4MW18jL9J3cfmcN0nbliWvdlB2PqjusijjxnRpTZ06dK86M5cmN3beO1Y8JHHF4Ejx61xdRykTistnTczOCJZEYpp1TN/mNuEiF9zRKbK9jJ042LqxMHUicZ6SXcv3TuDd7N5DgadiMULTNWtt/tnmHngEzMS+B+uwqAWShH0JZqNsh2DikyG0EmqPIymthmPzqBy3d3d9pVrwByxxbWY1lGIjL4OaTMzAtZzIFZjsy0Vb+Nd9uA7jOTuIZNVDZInaqqhfLrx7vDk6bum304Be9zecTDTQaWobclcvFw5PFdQ2b8UDxIfsCM7qe65SCSYYVAvGuc1p1NlQSN07AeXEhoOeAnBNL6O+egTotyPb7eQfZ/P2eiJUJDXcDu3Q6dGTUNPsEZmndyuHI70jLzFoSoCjaH37o1DgwruNyXN9lHIibI9oQOKFoeGZ0Nr5yOkC0ubUIYcBMzG8tAwQtDCw1Lfo67lzMgZQXpptIy6MGB9Qwz2iw1OLRgakHwSRy3q3qHPrykn0g5cmlRsHi7hK4sYQOU3473RiUF4jL4amJDle0ZDiMS/YupHjuxZLHDIM955EzDKR2PNDiAlqHCmu0NyZDn0gdI7XxhCet4Sd/AEDYLh3nqRTMIWznoLY58G6jG25lh2iwtwSY8IyF9s6SxwcBEVKEOxGoIhiaG7N6gefvPn7l1Ne0xhal3a8JwMHL044avbmCznCHIvFOT4b8fLbfbDw8rNtHZYChMUlBkqeIy4BvNyPkHGV8861qmlTblMtLrdIntkJhEvEPU+ztGSL1Juh1KcC8wFK0hElFIzoPKLih1nV6hxyXqMjIjDaah2MOzivZHtO5oxDjvDPTROGB1oUPUYPm6jqNOdsdBKchycMiiYGosojL5iScvk8becaK7udy+eHPgV28mN2lgOgI2JmRoJ8/bmpmCUREyMuLmZceZmTLmZmZY3MzFitzMboY8zL4JctzT55tVM92dIjL0Dihm76MuchMQisFhBYICHfVKBeDG8jL7oZg2TRV8Dvx4eoeFM85ExyOZYBCMnl7D8MsuLj3+XUhb151z575F066SxGDGCt0ViirxRZOPKlGHGXWH9+Krp1tpFwuvO+IrVs3eHPRM6wTC7TOtDYEa1qZWIDxipZYTJBTOR0W8PnY+OlZ7tMuLtLMwQF+Rg0QZmSUDsObyMvVTNEx22Dvb6Pyuu7MpiScd0oLp3OmSDF2C5iW8/ht39WZ2HYB4MTv4YjLtLxtekhx0YDEmpGbGYgWBzA2h0t6rS1neJL3CMvzoUpt8+2+VVG0VSxplgQbVIWmPCtTibw2ndDAS4GqIwXprOygsS/88kgUE6zrOWqKiryLGdSvITlsQhxqiAm4oIOrCRVu/tlvLQLRgLB0uDXIy4hjWOw6BYETEuFOQwQYmPDE4wxIZgMPfz+LgL0l4fAnXs3frwZ8k/vWDRPb6pxgwhYOQVszzR8SzPuJ+H4j4KNt6uJCTbH3JsJbaOmArPolSMpuZ1JjRvhGON6Y6hp0gSZunQHdvADUXkvJRLyXdiYA0YC6jRz0scVkssjL2WerY2ET3TVjh7xRD2m5SE0OCjSlEV0VOrRF7orZ4ILm3HY6oKSddLZgykIWuFGUhBnP9v7DoHmB69BxEVQ4xNYTj33WHTpIhaCpiMv3WDuVTO0MGifL5LwJk6nV0wbinKXLGSWG5wjLg9x6R6BlENDaRFDJ3gUQ2kxko5Bi8JRHtaKLsX4kGYVruksORePUEaG9DJjYNLGZ7e4LY1iKv59Iy8Yi6CzLFlIybkSIynGTcd085JOodgem84Y7TjnNXWBmCkUlM0y2Mac8z7fXp3M9BDGstpizYmAZwfhkwOQYNbwKRDPsEcFeKMj9APQGdGCY5baMQFAiJA1xtrixpDGMmRMUSsinaloQNXaOtxssJbBcslNVgTOMqKDeKMBlxefJNjug8FYbcKZuZS5TYGEUizIZnT2thDwuKatqUS9zU17LGs+b0B2K3KkiVO2SQNy+7JgZFNwNx4EEGnvMQ+B4jucal3zOxlbgDGbGvWVHcaX0Ds/WO/UmWZaZ1AGAmQjKds+RqHshwLDggU5S9BiJ8Bj98Bbb7B3CHKcxAJgspk1h3mvApaC4Yny2A+PxqHPKDpf0KhSnzzOOOJG+ZLJZG26e1WttttVVr8/cdnLgKFlI9s6Gfb503RnoMqBeTNEXXaUJLnt9mLbTidWlDGHHI7Vtsd4eS3bGdqcr4h4cGkCATIu2sAxPcFQWm+xb0FBYXC4JVdF0G8CjPfiNAU7U8kz0Mks0PCSQPZxNZ2vLQUUPnwjL/TzKkp2SaJC2QxVHvdrNtzGjOSQ0z9xDkJoyLDknA+5n9rtKiMv6c/SaOmnb66dtIXStzPH69RYupAq0dREyDL8gpBAurTVbMlroxVXZdsj+SP3oLSuwR0JDvDg2u99K6V49mbc8E/5ZIwxqVpal/kM//OxtYl5dSMpxalMOFd42oZnBwZ2HG3crQmVmfRJvv8iOHwYfMwMwyMvJiYiMpIgKNNJJmkPbiHj1J7lUTIzr/3ruKD12YYWDl2gK4CguIWCSgaAQPhynjwT395fLEHR5OUoCUw/vR/kf62X+i/zIeD/p/6bgoK0so+B0eQjLlkiMP2K+d93wUVvc25IYzBEkQSGIP+OBC0+r1e/kPknlildX6vg4HsPrMdiA+R5gTHl5g/GfAIIiGlhSaVqDE287oTWUmylFrfPbrw50nBLuqG+gXAaRgMQEmrEUaY/j9nva9c1tFsaikQcuAIUHn6XUhb67LO3s5c4ATsYQwecVGoPwF347Zh7NKn8n6BP7ak2ZRTBySMpcFFPLqwjKRDieA9r518sPDSB4r6X16M2j/YC88KSJ6Hah57z2StIe8X8/gQsQTs4A0OoXwUjLtEB+7ie8hIiVpOL9I0QH3wEypignEVA6lPQHgbo+SAn1WKHQYAIIIkjKfbzqoC5/i1FAyMpyUzLh+Zy0qUakCRLWhGKX515sMxbMRSKi81e+7bxWooiE127aR4Z8jjDBsnAZ2OAf8jpRCTBbt5GSOSehRzjTwgmWIYCwwuQlrtzZJjvMwOqH8ZoxwsvP7DENQkkr3gMq8DwLBf0Y/Dg45fM8cNRwRXXr5xo+oHoPKgqrtgjKbRMuAIGe1keuNLMBGWGNwbD8iMpN7mAB58Q3d0R8oEYQhH2c9uy4PaCkEgDQNAEJEMBCSMp/CMuw6ztEA9Eqr/flEGJQYkEWJUZgEcIeBIqwASj3HD7g2BPd3ovwvnfOwbqYEtcHuuFRG2lqURQKfaAwrK21w8UlsTrUBg1hrCmkYQxIy7CQdiA9CMprxMTTuXKj/QH+nr06I7d2vUi8bw0ok0W9ddvHpW5eoepc5Jrmuked1crj9neea87rpu64xuaSs3dYuU+M68dMyKsOCMpxCMuPEomLXiCODwGQmr49+PfKTMkbCgVJia8tKH0fSMpjsbCyKfXbobCcf8jLougDOrxY/5UVYio9A+XE8IhPS1/H2z/LkOz61yaKKYQ204FSHglIy4ytA6njZuHaPDPYhQxLTA/OSWw1ThiLV0jVUmlDAW4HfqUjTXo1aTp2XXGg1mB8okYjsA47pyRMrac7fEsiSMu44KsMG64R3CREChU4wiUdqBs6mZJmhSU3w4/dxO85YB4fXz7RNedVD3gYK/1iQex91ieH0Hq/XZh5CXy2S34mirq0hspwMpHlKOQJDZJTk0jKa6oGSKkg21YsYmLtHHrwB7HYnosYmAYG4FXvZMMBUUHLam0ocLzLytJmJBl5qb2I1o/ASKBEhNNn2KsOP04JYZzUyb4jhCau9msFfy/iWxsY7D1dKY+IIGjgWsjMYDtcIeA3tiSiYFbCIHrIy69JeHbj4fxOL969HkD+KUFPXv5etOLGCz0OQnxeP9Z4fTIt01EPprtJkwwaqTMr3ZK6sXFXolIH3n87BB+P3fkQaYyEZCOER7fT3dgd3kth6AE6J8MTli+0NkRiWIRH2gRyFH51I/eDOm4o0CG2OKj8FTu71jjZJ3zhrMop7SPTtKvd19zqwQjL0TC5P8jS6rFgNe5+U/HS5dpmbkuawQjLjQzBhywpg94cK/J3bT90NDMndMOJDjuykR7YLsD2F6ElMkf1RpA+ZRKhW22NtoxS1RkVKJNbFUjLpa1mSMvbZKmtjWTZSpYIy8jL4JlhVhFJER+B3JXdfiu/X5IyvCO7og+0A7IBpBGiRBpBpBDx+ahgo7hJAbB6hP1ctGtPyM6aIvZRoWsYaRGnPxvR4ZSowdb2DW+zy2WNsiVy4Dw9agedUWxB16oJCMu4CTSMjU30JtrqYOyYnpmppPjZQio+BRYwDB4xHDGOPKehRxYamhpKRjuEgbkm7pcCJVfcLHG4HrzfkBJxVfl+bsdAo9qoqvUISK/KFOpWHYzjw6UzpvSMHOlWoMi2lS6cBZiDBghZAv4YZ6MR9/0R8xhmhcwICEEkAuYC68EwIBGhvbiASBjITdd7GYZoLRoxWaVmVX0ZzWNkpkjKeS5JEGSGJBMtJElKnshMkpUNQYQJ04P5n32bcKl46eBucVDsQ72RWGoQoATiKvsEF5qeJK3U3RsGiL+o4ds4zdnZzBQkf5k2nIExh4MMza/PzNCfW+eE8M+B7lfZohIhT96DqH3n3RCEPmdaR2/6cNnu9H2/b0f3f33XIAY50MdK0ScSGYD4iIkhfd5F+DbhMDKTLCm1isLZJvAeE5Ip5bYIy8QyfjeakhhjBkxAShkntqibnv5XV8zzO/v7bNZwYBvNpQRMucCKUL+8UXT9XK0gD+R/u/1aPxaxPPAoB/FO554q23dDNXZMpDohj6UE7G+6oef0vp+h3qb1fuxUetg4wh1wpkoBx7uZ9vmNQmDly0kh7T1w7pfqEqd4aBwwi4SZzQ2/mZ2jsdrAobC0KSTk2ZAespYjGqYKB6mTiDJGYm81l5OXfOyHf9fA7vzo8hgceZUnFmydYBpIncPaTtLIy6o337C389KmU/ySSMu6iMvkPwattfUduIe1BmcQRuZv6thW0jQ3S42uJueEmsn2zOp4FYjLxp8nD4vDhW89PtkcyUIFbw4QmD+mYgEEoRIf4pvkEwntPnTfhMlY5t4TNEb8OaZolrgKGmpmBuzTzknJ00wahkS62Bm/nIp08/mJaQ4oeEpSHUcwPs11ivUG4bYUy+h4tUGBIaaoDGsUbVZBuL9BxUVIy65i28OPPJre0RyQRtnLxgpCBVIm0Ixplzh6xjw0FKDP6D+u6455zOB2AWFlWIWTdsZlqKYc1VrSW1EKlHDN5WNDEJmqKdu8BJZ7Ej5tIbVYgSAgV+wxMlQ+L7A9mH41UPU/QJJtqH1oPmwk49/b3VqQn4+f9/95Qw9cmEXB/sjZ/i/Iy5uBxYRrsNRyQitpUxpjTr+P7O3uPSB5+4oIlo8gzDEhxgiVoYhoKXz/H98d0FTiKHCWAE6cUC+Fu0OY3S056VMcKVO0Aml0MxLMBmEWoQgPfWL7aKQjYsPpyqXg4hwCzd4mTviB9QXmb94PxRwxVWA8y0JxkOCsgcvEGm7FCMv2t2dDv3P8OuUIMg4LhOV+iJk29u57JeGV67rg6YrEOQiUHLL4WT3eOiTaN4HH9ojL9HBD/r0acb20vhXkmU3yehyS+bTybOtEKy0viZCGLQjUHJB49+e3pkkrLuVG48Xe/lccY0aMo5xjjyf1KEwWtjTykSxmWS0JhX4pgvg0zsqHRpe+TXZxkr9Oukdc7DWnJ631DwInV9G8DcC3kKIEYQJNndTTVfjfgFLrZYPNVvjdiVvQxWKir6FmzpnkWsjLLRhdunirJtWYYSitEEjLjIMBNw1TbCmV5nPPEe2uyA0atDi+7bP7oHnWm4I63TGdW9mflxMJcPWgVhLOV7K3riuVXDXr3qe8dKs0VjoSNjMi0yCztHeI9b8YgxWGNNhulPPhFcq4GI8snx+OM2HL88O7vshrxiY5eZjZGqY1oIad26u8zsfdrerbUxYmMarvJIcFoytW4bYdq6EI7DrO3mQ7fErMvergSMu0XFzRdWXJrVbfj7LyW3XqbY7ulq6bJhCea5cmbckxSMp52b3mfPZotyAEpygKxGs8hDZ5ZLpraugPaOw8LkYcDyEkeF5bGzbBrPRcWJ+5hy3vJcw5FzXPvEVtcZABaMF4aTgV6bLUGQIJJm4+nDXvxYrJOBnNkzLDpyCYNcbWQwFR1Q4zv3PGz9v2fBPMywHOzTI4G7dW6tgPRwvcyfk0hzySxJ0AkaZKBEsze2gXoHu2CGXfswY3Yv1aBhrmlNNWi5CskdUOEjZU2YaRrGa8ILhpvgGZoESJCMvQO1WOkwaMTcOJINLOEzm9and1jWZjjomJiTcO/v9K9fLYI2wzmV99eKMEGJqlUpQVhfb7/d9dPX6KwEGezbfIYMiIMGDMMEx6pJ60CMufHPueyuENzFDwjBR3395MMkhk7CzkdTJsT8M108PIKHGzWOaIy6c12ZoGh3BCGg7bS4jLgzrtNtXSV1VNfSCBefuEQNSMhRTkFK06pkPuaD3qqzgnb9Inca9CxaG058Dbnx1R5dJLvwjS7fOTYMx714d/Tk2ZxN130r1B1He0H831fj7FCUSYLOWdNl5NMhkM3I2IEtfbtezMwGGLWHZt/yiD1F6Q3SHo6hgVtcwEVpJoBVBzGlkZSk2NXTXZO63UmSiLMBDEJEzPKGycMwwTU5OEUhWQmow1i0hG51dvoNjcXdMdjS8Dz2troNaS4FUl3MD4HhqoqSAFSMvVlF0BydkenacIKkIoiiVJkJAwCTYcqX5BtYbIPkk0tDFJPOG12PLwxLwOvHoBcXwjh2vG5u7y3M25xM4ONuIggQJkhmAWT2V0splZVfVXXY+x3ROZnr1mlMWUxTEmsH1h5ztQSiQ9cdn7Dc9eH37hpODzV5SHYj/kqApRS+BcJOVw4sIQJMOhqhu7yegXRBfqhrQD60q3dlhzWikY4KJzQtDRhQhbsWSu37VYrN+HPpJXzgEqVJuE1NCIB0BvTN8CbNbRhsOcScQxU20Hi06KtNed5ytGN7Ep4IX37nmB6ebH4YXAiQyKlnHAwYq5bty3W7V2t3W8il5cXcmNpQDMcVZVdCYiOgY0/Wc7IznQpSZhNe8h2HzoBs75iMpvgQhUwHadxMhSUOSgGEiUD5tk+yDeQTlXRpC0S4YQSMvhMQj86McH3D1rAXLu48q+q/A7fF9eKqwtuz6Kfsbqq9ex581K9mleeiEP6DGzxOqYglXnhh5ZpflkHma8CV5ZJCAlKRMkzajayMpbWTDMG6eYPgbhEjMfbsHNeOstdt441EEEB37vfpXSFQEkAn7s28VCUZxtSMWIMJIHTFSOx4jLpo0E9N1gzBITDex/bYVsK1SpJ3ZfGcXKHp8enkbt7cmPKmZmHDYRrtVzv1nOBKozLfokE0FvXrjmKWOEpK1RRIyHGihUD1HlolHJGjPGpiSMfeHNUmuUAjnsl2Mb8cZ16BaHZkGT4jfIy+apSX+HMyoSSc5uKaNIV9TlNh7ew+CcgzzrfsOJXEJFN0jL2QpIy8+C1Kc8Thxz1cmm3wRQPnzOXcucC4HTtMY2fdykCNHiYpGoJBx24qDNwnbvgYx94fo/jPPqnsWx0P1cMBDXiqqk9oe7h2shjjMVqMjKRdWebbSUrhoKTaXcNlF68KDNJbCahBpNBsrumyHCV3CUmKN3iEPEPkHAyDoDzojLyz8O8s1cgZuUBhA25oook4FSUI8pAlkDInF5c73ZSv2Z8aLM9jcdNvtx0Z7U4aRKXzqpkIBkIuQ4B08xnFUE6CeJC6hrJhLIUwhHiMpyCQZlCMv42wxkdkDBQgZfMxZiZ5MO7WbUbIcVlVGWUgUIy834HFTV0nQmqFlG242HFwWJMS9oaSbKSrGq3ilhpNoY2Vt8NZMGCMveM4tQ9sEXZ+7tenp214voMk+qD7cEvc0X+EBceg22ReBk4gnBtcbgsF2OPP0gFGLfBF82VHTzqEEaXZhnS3hfadGlNrMTkpDJg+QYMRGA8vM+5gsZ9J6y2SYQNipVDGFMXoau1CeB0nzMHZ6jGrhw6l0UUV2SFthxORw1D0D6zQOEizxRiiOJrhnFiJW6DwnNmgJkEtBSO3jx9W5husZps3HNtpWZDZwG7MSwOI5rI7qmECKh3ZQqKBkDj+PTmTrtN6ETmWycyigVRCiiElL0vj6z+xISohKII5qeYBPMpn0+H6ebhK502JhX6SJPNOobNvJ20TMzBCS6uBXaNrc5YzuVKfVcGcmqClGIiIotF263aiRYtVgliYofjRgcFMTIy7D01HG53+H64/NgigsxHuk0DMgUJ54ORrJ3sGQ/ddGXCKwcWODD8RKcVNchiXFYMhEwGgWVA8jLz1iUakyBMgd3pZ5RVNkGHGzW/luBtAcoDGROpJ5Hd3ni56vRGkl7BMJAiMpwsck+vBNnoIR4ixUZnJP285g2ggw9u9widIgdQ+9ppD/Wt90NMS4MIaRuqlA+I0e3Qt1BuccVnzW6dEHmIYnfFe42EGgJTznd3Yak5iIg6Scw2N2AVrDOYUipxGYEr2aAYRbJgb6Up7NhN1jvX0jn8UMt8DcYLOnt00W2BPnDC0XAyeERG2igDI0jZ4y4EIw5sssohRDuCcp+4NPQ+WCeLA9QkyCmjIJle5j+g/8jEHwaPVPllZObdkjL3Zg0mx1qGpHLLpk1IwbJNWM6FOhLgaGNojOFP0cYsZo1DBlVgUiihZQ+7PN0Wk31UBqe6bS5RVSQQhxk3bkiBppx2qvREIEUYTpmRqtIy+wrA/mZGSQIy6y1pNiZaVopRkoYIJGaYJp6ZQ9h2nqH4ZgDAgqHOqAyhgqohlY9FXZjbTQsDwZA1IHUdaS85E+uucBknEmEuj/ycO1I8MWb4ndwqxPtA9v5N1djCiR3Ey9ZMilN0fwSnNxx+ptGZshuL+tPKlQaB0rd2IXO8ZjK2dXdEYEhLbvAnRw7wGuDP9rP8zMY5yCcdYjLmLDfnUjKcMJYJAnQBwcZKCmyQkGMYaRCe8kZ7HK4SMuwo40EqIgGDaQzY9sWFeXjKAmg0MaoWSGA6m3NwZAQ7OFBrtnRINQUJtBsSPOA4SJQuiYGC0jLgRgtbCCkqkiGjtG2y9Ca0xG2MyTRFpjAfA401RoiGbhEMg02jUU7EqaITjBva5YrhNIUHBMbjtgl+vp7iUOzT+Vp1+pO3fGcYzrzAvEdFxiI1Rm6CFVxUZgxZClMXjk1Equm4lGu0NTaiT+YKQ0jQgcwumh7zY5OJzHpLOfOi3ol4dwhhDAS3p7y5DBxCiTh8dcm2yztwuqYbIUyLieOnT00oOYcywxgt/Mtw58MFHzkCaWEpA9ciGoHq4nsNCciU5Sd8OoTbnnylTqO7B26zqdAnMJIy6FxVVWmMlAY4kMCNDjf1zauuqHSm8Q48aIDtyHOxChqk5hRpNuXVpMYgsVXTco4WgYlAtNihUHoEwS22NMWfYyFYcjLv7IbbKWyOPHvow8sVYPfSXYTwcVk4t2wd2/ZOaVu2EapjaCCTT4ElLMFS6KD7gegnSbmKpsIfE4lBhngTicx3AmwDgYjb/a5sgpaJDc6/hzNsPeJprRXaSghLMyTDIHWB5nHw6NQuAjLs95ZFtxBczjgJAJEEgck0DAfENI8FojKcTP0eyFkFr3qByqdDZhpYQSHS7LOKjyNmaOe2ZmWbKObybgwK6ECE0bvdz2HRwjKfk7dF0G5FyRWEESQGjHPbJk30IwqzUgLFKBkElSE5hsI7m4IO4vX4dI2DgH4EGBJWA9dCQ3iVg0MHVSzsbVIynuGJr6kzkpupy25xZfwJ5oKSAgyI6aniX1gFfdvN/DTxTkbTVHu2ZJvJbHhvL3U3MHJP8p7JIQmS6L74YjLoy0Vp2lc9qNA+FYvNX4up/j7IgnckBGAxCgmx6r0aALscL3YHpUfxTVDFM0li1fU3ja8SZRNaK2wgalpHIjKUpVIkVaFFSkf6wlENSi6gRKQcIWMDF6z7+E8w93qoyE8BiwQ+dfmeGLUk2rQ9gksrdEsG908x9Z26EjKd8LKECpA7Z8vGGlTuPa+1fcvn0m22+vJSFGGSCUyUGm1IZkmZLMUm2LSZUCkyVtKGSKNppUISU0RmBJUZKzJGvm7dMTJWk0bNKUqyzTEyjJGZFGgFqYmk0Ivj3aILGzQpEkUkksojajJKDUaJslJYIpTFGYoTFWUrZCZZQZNIyWRs1GYkMoNCRsBQUBFixFmcvE7EDXbpR0OoHulGiJesHZmCE10VTBMg5PhZES2k67mY59vtroViP8Iy8Q49EO3gSyikahSiZLr8TlWcGdh1JDMrrWs4cypoC6T68JqlmLFDRjeksP6ydzEgFMSTFlRnsLQ3YhJtLOOmPiTdLdDhLMwwFhOQOYRxMjKW6iomzLRYzC0RXLBm2SL7YQnKhrRyokf2u5EPETlgjx9NLNo0l/cFM/R+oG+znn+oMqJjslTaBtsMcMDCoxvRgjKWwcIyngeHRfiAHBXwE9UwNSsZSUipbSWzTSWNGmWiZqYSRMTNTe69r6O+H07vie3EzGKNIDcTidl/kWLfHuNeo1OLda6I0LevgIaWnw0WXgTD7ducwYMROCJpKkPnt8MLainpemLSdRBsAY0tq8wwmGTIFn4I4OIy4DHBlruOrYx5ulsGZfEw5y0c1w4hEChhOxqdyiansMZ8g0HGv7n44swEeCN+7Be5U9IkCKaPuYHbZ+SzqJfDk6hBj+FCMvmHWQFFEEFGFCiZORSSG/kTHo7R8/5/lpyQhb/kdey22KcXpi88dj0MngqQhy167MJ2lHd5QZxYabG6FfVIsSxxd7HJoe1VsGF9G5dbDoC9MmbOmRNr3MM8EYwoSW1784XRG/zZBo9EdVtOI8kzYS7P9eJj6Ct7n2oH8TNcWb+2nvpv155RS9ekuRrAHHQ43JB262Ga3DDnje4OaaIy6QT9r0azJgupJhECZQL7pg5xvufG7XZ6eNS4z56LviQ8jDGOEzh89OYblqe812XHkl2aDySTcibZleRvuUZTV1dnYXWpUVT7XI7zuhx6W3es0VLROenapgl0AUnugWc53c99ZOIxjCSEu9TymTQYzMo71Oi6tNso/onW4Oz9cyUpk3O692QAxcw3ObjWwG6kxmD5etZQMzH0WaLH578nOEgXDUM2kudhMwCNGHkFuHj0WNYMdb9W8yIy6bYPf1MMNA3OCy5JP7PUOahCsRrCGpTFr0LBhnYPbAAx0VAxrN1npwPNgXk/W57NLjeQFf4DMFYmgWqBgjLqMasKqnfndpU5BqBK39hS/Tx9L+TTNyq2ElJlCk+TSDbPISxo6cnUZOm7bj3bmiEy2DAr/byQYjKcEnMIoSE2OGZ2miNzXcm2neM4zkbHqfI+RoanQnD246or6+gSMuGCknQ52khWwT5V/fIy7c+FxAb+307EISTN3u8REHFSMvGd2lBygHhDoeT6DRGsGacJJCVjaeqO1ojheKpYQwg3wM1qT7MjvF41hN8WLeaGzJk1VHjdF7Vnq5xmsjUo3c4w6uBcKhul5fqhVml1zNzDUvMuXQ80yjHBhC0pbFLkuvy1K9KUxmjHscZvHspiwc69MzRHSUoIUukv4USYl6TSETnjh5LwGIW5G1HCwzMwYMy0wsvgiZ3Ori/zhQ9YlydS+cGJmLhc1OB1gUzqM5MohMFJ0zSJngXSnpauMRPKJRuaT/xIdoniDWC9W1y78zMmJdZdiY6RUvAjULUYWDi8YzZO52XQNTFBphgJZSmGZzVxtMZp1LD9qdVvct1ipN/wFs4MuNwjlUSPOIM28VCYhHYQGVofOhieHZzSfLD7zzDNw3bpD4MtDFnAWy6jtVcaI2pyRq5hoRON3udUIJi4c8zeIxV0zIV97Uag4yYTImotTJ3UHB14bnM6mTtnFZzsgdPi6vN83aCD+71duy3tknODGdRxGcBl6XfMq+mYN9XBjaE9RSZCvs5NYBAm7XztsVDv+Tjw4FAogh9ux5GoYooinDmu8WINrQcKU+JInnZotspMUY/LvGIWIO3p/0Tqc4fPG9waW3HDg6Z1ch5C8+N1O4knjtxxkp3m5zL3gu7z4fpjR0FoBJJtph1DrexIiEcbJm56E3jGIFpyNM/I5UOLvwnSyQ8VdTeXaDOrnUwdL7G5twQhzOe/MnJbY6hDxuCUd0xu926Oejd17cTDu+Adudk7fgd9nBbttBm7yyeyjGHlDvVSnRumzi4tOBiip0Y4pp4x0zDGqliAmKXBE0zSgsZMQIQiyh5Wlq7XFXFqLwHbjFQxEYA+6Qb3EkLHCFsTMCAxnINRC1qrY5MkS9nnBDZ1YsN8UqaCj0NIjVDlkOabviq1B6amvPkpiI5m4ODkqgM7uamEho7vW5q3XJNYR1itJi9OGIbKYSBCEXrDaJIy2mfEdu+zMXU5Wu0Vuo+U8suhS8alQ04334fRLsSFxoZm4QEGdXl36IT5pNzOamL64C6EyboueJgd7psMiSmS6I43ZWzbwc4MqVy74HHOiOiHXQRzTnJs1TyxxMMXORupuyzizLgXMsFinLZjaCFWhI6DscV1DQkOxPIy/3Vxp3LVJWiIbw6dN73mzWoMfZeFBWSYaHH4wa6Ki8cOdI3Fi5laJAjUcImbBEJt7eeVvAqmeLdsyBpp1RQcPlpcFhsbdKXro0cZes5RstLVFpppuMZypY2TgjhDkGkBoIUyKGQYtM8u1QuRzhIy+wSKcp+um5ecIY6CoRG9DtqacdJCSZPxD3W7KZlWxVlKshAwO2+7vWm+dzN2s/TvJcOHxwYtmcOfqMlwkZCHjxq6jGHEKOwjN6gX7MYiyh07u5c4U/wBOTT8uSETeJpIQq424scs+u7W1darOjIy4Yw4ugkkwo+dc54PtmnXpkTa54g3go4Zjg+clHjWgZLKxUYai1YakMYeFhesC74V4eDy4ZsutMpjfphNIfSTjJQm7XHB3hu0cejIPoQrHYo+7JqPj2UD6dPS+V275PHj5g+m7u5rDKW6sTO3L2XW4ahH3JA+Ej4vUBKE76du0zGHi3SMRhotEFec3VIEhLKjJjVjGZku/DA2good98Y6Bhm9F1jkwIixuDJb5kjG4PRY2mcMXHGDupumVmWNtvhw7MNOpkIBlkZLrmUfYyvRjcdu8l3MdNaK7N2ZM0zHWQuWtEyEo2yRhGUHcxZvtvbRpZYWijM1q22hKZk7aSssODBZkc+ouoDKEIE24ILadAK0TxbnVsDsVb0gz48do2Qmzb6vA0TvFpaeRhpLeCgESmiGDNPeGF1Odx1FJ2yNmXI9qLfNXJlELOG5axGaOom8wFStbuGdtrDsYbRJQ2Qm7LW0xRJNS5OFgaAZpqMF0jLkmAkaoEDvBMzgiojdQSmMItMQJGTCIm3pyXRKolCR6qdE04i4WNEmJxTM+RZ/Yxea4h0bbm1a23znnJMCZBt9JtIDqCXB2EsQSoQowJ3R6MOnRm+Ta4ASMu1AIWQJTB52Ajd1ZId86+7G/f0muA6BydIy88cYAjJFdOoMXeGg4gIiYkLvqeIy4GNcJyENF7Yojw4NlGlEdYQHD1wk5iQa3GOo+G54s6ruInPIkJG0OPBzI58Zt3CTeTkVK+iHv2MyV3JpEcYrYo+1iMHyMVYa4IgpDXpkGmwQQMsk7OZU0EMjqwp5MjLxTesOHQacjAWBskyDFhbhNDhULSGWHPWBeFENqsbFGdJAMjLk01hiMuErQzVUhsmULeSUkjLhmSrGwL2o2STVXRwkpgsU0Q1Tw0rImbohyZbN0tkw5Zi6LZsyZQN2ZxRyeKasimDB6qOOwY7NQVhmXQ1AR0dIGfOpjoP1gwpEaoXWVLweBdmQdEN0Yhe7VJqVUSTgXYOuR1dQZHC+e0cDDY4NjezSbToTJqbGvWccB0MpEmHMISh1wh4fK3BqFrONDw3EKGwxiK5fIGX8V1jotIc0O6i2kdXRF3Q5DDmRnFmCBjmIbQZBzSabQ7rEZomBVpQhng2bo1jmzaadW2eXimG2RDBDIIchhIEOJoSEhRcS+0xMlmnl5xKORD+OgStepQhU1sJAJIJtNzcAjQFwgHWaquOSh56oUM4uw+ic4sCRqHyIQILygIGg4Dd8e/YoL8X07BHzoSg0sdYGSvKQNoEyKQNiQ0RAb9I7ZDuhyeXfuGu06cxZ7GHY6YePBctqCYo6I7eVvi9w5keYjLaRKOH/OUSnaKIbYOOwkOvdqFyHHnWwgTGKjMdCYjLo5kQ1GKIxAyhDqKHnQ2MRpIgHCk4HuoqDc6cuS0huGC950i5E1lju8dcmI3NCEjLlH1YL0sXaEpVEQ6hzlHTAGshm3rrNK9A6l7XkG+D19hidocTkt1xJ1GWGCRp0nLDxOBiEQrplII2VOM4zU6UZ69ZyCLAcEojiYYZjkLrnpNNM4zIy6JvOMJqMQQnE1G4c4YKEwSjZJambbBYTqhx0kzs2RwahvQrulWQtgdu7R3sTjZY4OgEFDcIy6g5oGppbYyNsaRFykkc8vjEd++2+M8yTYJLwOy2xdcFF2OQ4DEzwEd1tLDnClY0LA608Ekg2dUWGl4YBipEESpCAf1sJiCfxdZgH/BFLQonOATkL2FqQOoE6GKbwP1piKMiKZ/w8/7nvV/P7A+3z8jKRTonlRtfVdVzTNaMjIjLzbK2ZKOwPyv9G4cBlL0IIPoMEHhKHegJ4phzNklMz+JIy7IwhIJA5SWBLNEwFHDZ4Au6uybaQeoRdGFrgWl/bF7vmHw6lxRpkZPPh84zMYTlom1Ojg1zuJyOdXn+45PK5b6voXPR64T6HaHe6m0IsqBnqqNMRNu8LgWFmxyC04umZM4tK1TmHYh1PR2dl3QNh6K5NMSGk2KIHuL2L9piGAUZVYkPDXoQigIdHMxdZtZmYK8pAHK0vILATDfamDNsBC/DnQ0JUHGYkoSZ7gPA/1deKiK7DjhYNcf8WybQzAPlEQgkTuwRIgEqOjmoBoF8PhCYO4i+YkjLtZeoTbHf0+lNxGB0PdxEcQQUqLVVGPDl69RIGrTbpOEfT6ewDgpwQ9i/dPwgdhNn0qv4BAIAr0/X0DlDiQL+yTUOjVEZEk2NJXXdmc3RLFt0v2K81PxKbMUCcpcg/WdD6oPSqHiPaX36pBdP8x7Hq6ICdiodYh2D2n8W4Ij3oSO8E8Dh3ncHgPxJO7uxeychfE2EdpftJH+RPAnBVzMCcg+SaVhJvl/SVDA0mGb7Go3qaAbq91D/T9PofDuqx6E8NTUJK0eG2dhhp3TeY2uCxkQgJkh0Rkrqyc5WtLEUg5WzyCWULwPfCCDNwWivX9mzE12ZDYMYwLqgi7YlEaMeiMgVO8bBR4a0Nrk7ps6M54nLEHibLspuqk+PoI/iG8Ovik0t8jFBMjoOPkftZOKLzD7s+n74aMtdQgmA7WjhzPgfZh98HnJFSUpiCtsbZKNpStGtY0SVFLTM1EVJjbRZlfG99tQBiKOewfonZ9Zx4cQQ/P6UQTXmU+3q83kvBNA0k6GITy4kkP3cjh5yQ+b4wSmfld7YKTjUyUGCalUNGlLfWQa5gYO0IagM1Icm9Rh7J49MzcEgwRTj6zxndRa+t2k/2LvvMCDO52lB4k9iNGEKEFD9EpBKVeJuYuqS+pVDw5IHdzWjfq7OWmrINhWLDIRrOuqi6CIrJDQ67AWunDSBSpvKmxCG0Jyk1AlrKQGDFJqpbeftICOIy9EkPib7RH4nAlGKB8Q0BuSPTfBzMyDlBtUMkifZfx2yGmriDmXO/OMYHsdi46TIJvhqrefNNY1HqnYTb8c81gbTZTEQwhWnRyEjXL6Ebt1I0zk2IsjKbJrKpWw2dXPLJcMJKxSleSMa8V5NwjUVxKvHqvjQDTFtwYs2RLbSkmHmRV1MYxNyEG2yMhCC/uvYcQMNwXIx8Q42uOMovHJkdpWldpThKGoNO4L05bfh7/o+wPV7x90OHs95jsYbJEgFMTqXNGLOjEYgMi+9ciGMWJbMSi/nGlagAjBVtKr9NIdciBxUUGGUXkdw2idP0ZJ7twfv2OdN0alGV9Ot5MFnDVUliuoSflYFbGhrTCflEuVw4I30hyMMzVvA9YdiEOgymz9nKNu34o26dNKHBOaW4xpbRNTEc9DbGNdj7otjJjtrG6wNjK0NiYdJGloe2uWccLGjRpaxrFiiwLyImf69BTUdDOkM85VM5OmhBDj05EjvouK7zxmNl1zMFIRGsq0PGw8NYYG5p1UgIEZd3U4fpGAVun6NNMUgqv5xNUjUfn2yZ2jY53dZdxzbcPYguGtmpFSCwLkmaBkO15Dpwg6PiMuRcKEEyJi6BYccwG1IymUA5TQnJnOmciS2C5CUHNPTpqNFklEbi6dn7YZypGwgQI4y3diwoKYyiDtSjDZ0M6AmQx49CMunc3V5McTkJG4HB5CpocjKTuDYKbCnOBAY4LyXkYDwA4htzTICJFAopKMBWjsiTAbbPeQx2Bv03ORgsP86BmwpBv9kEyL3ChJ4dfaGl5/V5fVql/k+vWa+jrbfYsMnMWBdqgYPUf6j88zf6qEP1ywqLh9xzDhopn9/ozgGSMvBNwDvl55Q2f7CTlHRCMpSLCUGpz+moxrHvrumMSDNEPNH2+ZIoDBMwzMzMjMgx7Udf2Yo0KlAhEiJQIEQKPvBgkCj5PsA4ofmBOJ9rn6m4d4SWKHt5D7pyMvEPP64FqipzUE3+o/uwHGMUj7c3G7h04rFiuf8QzcTJS12Q7x2Wji10GxVWJXKgycOWddOGOHB31JlbqZktNqnSklhaunfFYpsw7YTD5TgtxqpgeBCE3YEJJGIy7kwDw0wGBDFMVMZU5e04qGQZSkQRDGcDFJTVcwtwTuN8YDlNOpaUQpiHq6ih2vjrd66DmyTFNOsXniRyMvqjapIy4w5djszWEOxSEjRg5ky9RDRF5lGLGdarQakY+nUfOmGI4RvjC9E5SsnDnHRyMuIy6L/W5AhHR+E25wywIkTwPdPFBtHBVOOLCaxSnzFW4029sUhm61rmSpWIczqpeZ0+4iMQEDJkrwx1gdJKnsQXhKBzOSj5m30ylOJY73ZK4nzouEkyIYuJlJHF012YlAd022Do6DJHo4ycHiuC4jLgaWEWew3+xMq/FaDu8jKdDQkzLzHrNtCd4F2c9VowwSikXGGFhyExhmRDgkjhunzTj8zRrWpZSEYeKQ1G5iowaFg48ypNiAtIaKN1uVtdZqlCli2vhXPANI4AYjLxvESI/SN5DLT3uBto9rXpk1/S1N6D23aoRyKAxjSAXLa2yOXbWWF3cl264zWc7Xqc650zudh3THXcZV5RmrpUFdau0lYNyu67d3aQted0qiZCxLZyMuGhdSEVCZI5K4kBQsSVS6cw/z8uCkk7u4GGOp1uK9rXaNq3jYymzTKTImzWxWamima6lq6VpZqEkiBgJlkVpI9/u7Dq7w34RIGtM1AaNSGtWkqNbKSCMvAYnwNvn8Do8Hzg8wH1W2xLgnJB9TIy+B503Oqa4B7NJodBiIGSd54RGplGIjLoRQDygEHzHFDq0nbDNpQQIZuk4ndAFJLqEb211nzsh2ZG7OwYIkNiMuvocf2aTs3kk8gCMuzy5FUNUUxV84r8WQwiMvQwmkzgZeEEOCGO325mFkzmaIYVk0fbZ1Sak2KKoEK8dNscc0xVO0m2jYVSMuhATZ7UriY7Ad43sPf8JAwG1MTEzDW2A7soGoHYGXHX8GkCMuSbQYSkbmAuRvI5IGS5hgpkUD06o7ML4vU3HswHGKkipmc+6srxsgj21NWIIL5wedMHDfyqQjLwEppFLaW6pppFhvUqOi810mCW+dNVjvG5F6EPNEIaE3RMcnDDRZbj2H3MrtFbWt6hHF05mFxjlmV2hY8nTQwwI/PhdP4rs/RL8X+E0r1vA0eHsjLmCEMOjEotacMHiG/z7lp3Yi7ypVhjQke9pAxImG4Ycz/UFDr+LaDgQd5wZ8A/BQu1R0MDILriMvyGRycAGGskBmyQzJL/EiB2GHG0epo6kmjehtPKTt/BnTpu8MdLHGwLddXd60P0A/yqMqhIDIkEqns+X4EZ5z6fo83SjaVOyfw4Z7ttwXeUEMkE/dbb8qOHu/sNT+jMsVNCyoKoAF+eQIFpFHp2RTWNqMEY1pLMolSeuu2wSSN41tc0RlKEqaHRiqYkLNEkKRLKSMSmWSymTTUZRG1hhJTLCWrLMWakmRUxJqKK2y1qWLzuKIJAIMzCQYouiOCYhtiY0FVKIxlJVqYlU02orYqWTFTbfhrW6r4uSKo0k2QWsak1i1q2SCVTVW9yuqbRoapJqGrHnnXlmkyy0soybNWFayohd7BUZVopaa1DhQkBLrq6ed0aVUxCuVdrNUm8F1mstJia2hKtxNcYhNIQMGKhnX97cXbRxPpm4iaS5TXf5+LqA+seuGGapANlhUebzeVn12ai2sxGdK4tdyjkmm7NTFJZJhNu8fTdFuI2bIfr9nT8PuixlaGQlmK+UDqrs4YYDbxtBvIy40RCOt8OEoI8AUqiMurCYoSUiiaaWVplojFtKS2zfNaI/0ezFPTCPCIymKiikUN4VHCHtjGBkjTg4OQHTMA0whhAUolJkFIylQKmHbgC6QgDqDzqCcsNIP13YQo8EJAeakJkABFjVpbNRKbSUlq9WnDE0hAsEqCSskwLEjKcimilSWxUyNFFEtsrYm0JKUwlCQ2lKUhKkzZTMsQpjbJRJUibRqTUlSbWDSa0ppRZoJZKamKUaiS1LNI2WsVkZKImkjLrLMSlgqK2UGylSSUJRlkpMpMxGSZk0Us2qWxiqJmtBkKpJqU1Ztla1LMmpZCSCYkILdASVcGAWkUCkVgYBJSJJU6oBTCAghIymCURDeQ0sgUAaZAaEEoWCVp5wjKWSKBEKgSZmtk5k6NkP+B0lfE1TENxqbp6oYW29PZ2G98X4jLnFyqDdddPjYwCMu9TOM0m1i32s2bVGczAeAOhAieTs6jXdwxLK94ewOZ5MjKXtipKI/Hse727etEW4dAUfnJ7+xVD3/p48Q+Udt0R6ISKg926hoJaDFfs8vs2vDZ144YsCAzbWaDMvuyM9V0Km/AhBuQO4h1o6OWR4hvtubizT1NuvtCP3VBRB1zjRI0Rmxi4kvMVCZJaGlA0bE0s5hw2yNwTvAwpQ1wO8qpqqNGXtAPFvAA9w2fyGtBfWgRpcIBvBmYOstbItwRqge4L0wT9VVNDPoD0cRQPUoin8PuNwBMq9/LqXwh3j8k7ECLjNB+75B703WCRbqB4oYxKkod3bajyt/eZM0EdS+lXR+Iy6Yid0FU9YjyPLpp95TwyMu5OqHMHqkpXtda8hAmSFie07RNnI239VREK2du9xdw2KK8sT7qnQ0SX1YcI1WX3whRgJ7OJv3zmsG8kCwSRemEPgsQnaywxg5Nj6B0x7p0hJmd/VDkMAbg6OcSTLeR8tjGSMuEbKo4UZF2Z0ih2+03Thctt7psTgbmLqfA61CSyMp6DIGQDyBIX6bpfF7vVt7dtLgIqKkAQgeXcAjKSMuUWqLbYwBtvkq7rq3HqcFb62tVd88rENAMdQJgB9mocCzMzEQxnfm9DI1FdcpePPNGaCSIL7Lytu/wPehoRZlaTkdCNnp2CDo4lI4HQ8lphnUzXd8xwROffxKwr85UYIC8Yc/Lruv72ZmYDtrDMk2PM3LixYZef4r1FJ9juevPQHtiZDY9Ib9nzDkHmJRWdGb26IhtS7UCWSYBpDfxP4BwHHkA7yDGTPEUbRF+BOJ+te17djXpYiykV5O3dGLXIe116X6duXL2htDD9+BFtgmQ2VUYDGtMbIZAgMTbYQkLJsyJVDJJpoo6NgMYJjHy6xBWomPIpUoq0aP4yMuGomVytEaIy5I5CNb6aqXI1pwYOEkhGavWkDNVDaCJgRpVirNGE65Iy5HE201jRa4q0WwTaBuIy8/OxiMwgVxJNWTIy9wMXHNYeDSt+ugMojBrqAGx0vw7U2PbIAP2IQMlIidJ52lnI+WhAP9PrCGs5s9sDr1qiMuxkoTLXAdKlUwzcqx5BBxkcEjKRgzCG8EIy5fFNsQce64pWTWPYsmI9hMmslHc++GtyGoOSTYRusyO9QOxojNy2w91tLsTGkBDIRqTZFdceKHl4GPXyMp/d6SS0Mpwj7W1QT7BPzlwGR7jvGAbngkdhbgLDNBrhpYsClr8/oDYemt6qMOkmI5aP35p1Efb4R94I3veu7fFZSvcVcU3jWsV3zfC1GDx/N1vF0w0LhYiAeLWuqGljiNq4KsXZojLyMua9/gsrbwt2UYzn2HzYW334vZa9Nw2hMGsEI4be1Tm47m5zKLInDquwuaA/NWI7/yFypMw6/a7ASgUOFoakNpvRIR/ZRoMIt8pNr/PTHqWCGTKkmHVJOrFJKQTc6U/tmJOKYEfgwvesW6lamDI1GpCKDQnCEyWOiqYm0CdIImBVWoOLABYMZZRxKh4GagWJWm3qoqHZEq0MwiXtMw4W4uZ0OD3c9PfOqS4Q+CLoxHViwGlcKhVDIZYMKDyORXOuFHmEBRdWRpurzi8+IuWtGTpus5KxkqWtOreo7DnBlFLDcaRNUrXnWTXCmlaHapuUehGKqDOhvKU5ZLQ1IsFJG8ah11DCMuTow7vh727fUmfUgd0SwssKyHE4GGZGXYcANMlqo6byzVUtTJmlnEVMUUEV7V6fz9+6D5n6fp2qkfNKIbPfPHzIvGyeAeholMgezSgAjEqTSbPYewjGkqJpRx60WDdckXs4xUZiiDRPdnjhC87Dbw061SBz35rWosYadhO+irGzpNFEdKJIYRj2fDL01F2XcUXh+ritdU3UR0cu3JAuhlyr7sMe6DMLbaZ/zxtkbDrO1dKocSdwNwh83o7xevsqavhhlTwnpxqTxmiVJg03FJPI9fecs6TjK1ZuqXGrzCx5bnQOWx4HWdwUjY0hhEKQKSApEE10OCL3LtCDQ/LoTMSNjA8YRM7K4HYC/N487kzmICHc6NfHjwn71B7u2hDzi94J1L3HWYiD37GUuJGCId4yOBJ29RoyGkWkqmma8SOVl53vcbF3XHutORhNPdXcjAwzmirrMZhYOcUiMu5o9MytZoFIopBAK9zHUvq74zxq9lzQvh2XAek6gqksgMbhO+kzayImGqL8Lt1edp3IxFx66PHV0Frkym6XTUbrmfaXmQl671vN3NIy4jKeR2xEo3KlIomNNM7Qgh7gaZWjSb7Ith0Uff800klM0ap9F5nmj7QPSvI9fHltHhWsNz2gj8CFPX0R6a349a+SDy3yvRhVwWevPXuezBmtza50AMJ9JgCQwMZsBB5ls6M32xShV4YW4XkHTFqmKarWFqnWKbdYmj+f7vQm8L9fIPexXhhj4IvBO/plpB3QJNkdFA8krWAYfVyqNbC5NsYC8GZg8esqctFE4+ITEgcy8oJnMJYDFZBiMp69jDyikjLoQoodZklQSyTORxN/DoztbiwElJUEvniWIhskw4qYW+ZINJEqFviBRmYYnbiZMQasqq1rDZQ2DCcUEreRdmKFoVC2mNjM3jTasLMDElyHDfVKEjL4ipSNFdIMBiabA69PhOppaQ0PqFA+s0p3+fj1L07nvuI+/8fXxO5VBkXf7vqQm5vgX1+M59Wdypcaa4wOZ07gU7GrqRe715eJNedyXpwNKYFNM+3DiwZuixhRt/yObkhsgFGj/ksR4sIy4xTvPXpeBBxI2De9O+KrShqAkY2oNVa5RY2bZYUpuuLm0TO66U2jV75ktrmt9TmsRixJVeS1y1e1KNrdvvoNFBCBqDIV/d/lzUAxIjKcASipBtERhE2uJoN9kwreA75N492R6UG1n71m8jKdPjm0eoJaGuBrGIbAMDKGQYDhOJjTXXXSLJPshoAxBCogenr0SMF1a+etcjKSNxkFoZBVxCLCHSbieZqT6JZsScDsGfsPzNw0Jk4BxEQ6T5sbCglz2GhwOs7QPotFJtIAf5wQ68IykoIy8jLnlRSIIbsANth9fbdn66pSLvUzIPa48dLkcSOUCe46hHpxdx5/GNxP4+rLGVpCSTMMApCakjL0iEoSMvQsVBxVDr+wvePALtu0x0IKY4RhniatEu6Hhhi+UZ4vx7iF6tJCyIx4yHIOOlQ1+H3bdp9hdfUXbhkgnhzFSh/IOOJKHm0aNY+AcE/b1dwPdJwPZt+joCGwi9DjdU9CMu03JdRugoXy+86bbKphuirkgIYf1SZyQ3Vw6vNp+WvVaOfceHOKI0HPuoIFeqIy9KVT8PUjyAGPT33lwgBiotSLwZpdVZc1PvqOdjz2r2emvOUj90nE1fkDwiVgMz7k29M2KOuptJSRHdhaR+6LbN9G0dhcCG8G7jYaCQ3ut8w9BM77veViI2t+3m9iO0cHZ2LwyAqLCzGQxKCT5GGt6pG+gLchu3YFRnWzFurJiNVJJrFL7usP65adAbQYqQk3mBGsQGgawvYKs0OzuO0CG1fA6RthByZm867A7D8puuwD6vrXUB6yVAYiMppBPIkUCGDITBkAXCBVpSMHBHJREoUjiL2g6NMiMpbQGQIUBQ4SYLQvFVWx34T69eIYxrWtGuE/pSC8HAjYzCHHLHeE2CIIILiIcSHJHZLWNQLCMvG81Maj1wdTd7MWG74y/ReDHdDwix/KeLEnYnxfm4c3zheD3nQfDTwM4f5RO7zHsjLzzZVBSBQK+PieIahDzG03vg0SMuGpMiqqQfgd/2wHnzI0GB8D8HmwyILInvZaxpstJ8+nRgjkUdlEMyGHvbI6SBB+hs+JwXktDsOWjj6EMtY76151r8WH48x9ST5cbb0dx8k/YsxIeXhYKB6eARIy9EmyMpze4OTfLjpDDtxCMuZptJqGDc3fpOrlej9X1H1/d0eS9e3bEJUGYuv5NaTeXI33MyycpAkDKjYQsQLT6MMopFTSv+Yz+SGHUREJ8CyNMpkmSAc5DKMOYcIy6Xq3ykK4SZ/KYplqzWPTWC7RVNG5nLTkq5AuEhabpCmb7Vl0RZlCkgboUkjOhEYPTQ2KHDis0mOpFKoxi0ZDyWkvXjqxV5zdy9nqR4iKzMRDJShblhhBxgMgiEKU2kNNJbeNLOIGMMTS1SmsQa6RY0HRpDkCcIDKlKchiThK6IC4YHHapAywyrdP9tl7VJIHAdmFiaAi5DUcjrrTBlGrIgIzo8Y3kyN9HmEBtkVTRWLGuWBKm9UBvWRO5RyBGKvF552z15eeCMXTnItjlqIy6Tbu7bc2rlMr16709GT1KAuGJjSiMuYY4EZuQbM5kFpnDVp1iVaN4QRLqDIu3+fWYaZYSMGjiQDgQyMLM4uHCily8SMtC0mU0YcWs6N1qJ6QYVOKA4UNLCvbAmvA8soxjUVNqIUkBSQWxMu1884n/JIy69R8ADVj0JgeaaRA4cP3jqxPefhmjqr34bnJeg9icyNH6F9tHtnKJvzwY1SskzCBVIUzErRTqwVM1mJoxkxMcYdhZNf1/wpg7BuJ/XPjtnWfaeH0e+PdxeKvYjKaPgGXMMwL6w8Ot/nH8f6sHC1QRAE5uoL+UGUgGP+p1P4iBEsMpHYTJaWYk2izW82qK86uRk2hWMKxi5W26lRViQAZOKMSyQEnAMISFcV1KidEJA0ggwNAiwep/BNwNjowmqAQhRaKQuHfyOZ+ueHYWTf+xgCCNioYmV+dNuY19m+kWDs5Ivano6ixjqqGLA5WswhwkIlVwzFX+mIy5BIprDFIxSdmw5IymFDA5BtuuTCZsFrjnp+f58dVovOtL5z4H1/l657T3G8IcEPyecQ/YhogXiimKC60errq3irmuXveRZWKoteYmSQuQFwx1K7SHbImgjewShNZNjWs2ZbYulY2K6rsAoU48ThvsTRvg4y0gciEcSXbzd0aKTIy9JpTapNtqTIy7KR4csdqIU41AHCULWIhmWuOUahCwH5cO4wYOpqH+ci1tGCNNGI22HjKtI37NBrEiyA2UhT4zwQINyEpTdYHch3S0SbkA7wLToh6VDqUoQ1y4lQWWfdpY0gJxQJXMwHOD+lR1EaaDBjKmBdoP6Q1zDtjhzY2w6ljtWTEPsX51KB0DiA7DaNxYcd7tHB6xm01U9B6cxMJnm1Sd3R2VFsClr+Xu6afDSkRh95KBJsUfs8ydLarsZlHQxLig6rfXjQVUguDYeG/Xie4D7mL3tJEaEj+zdM2QIB94fifs7mHObdGX1C9JvTFDE08OYh1AesEPgoEfRNPoM9xCassDFzCko2ZqZipSbWjbKaWaNNWmlZTyV0lpKBLKSIKKISozT6YKA9vp06c4QoI+SHky3WfhOVSAUUGCrCX2anz9y7z59b1d5QjdH6Efx8rD9561jNuJiX22U+RH0YYbJHxzKoTGapAIumaGtGnnG7P3yrwmXnnjRdb5SgLiashtrtvplR6bVe5IgjBKKoLosVElBOrWLokiHeNKZxcuhKobOg5qoXAJrm7Q1kOgjLjI8B8l7PogJ6/g+r1AjB6CkquQCD/DLhu7vy+rp28PafV89fPsgY33dyaVfb1n59AZOkULNBDmwiwEVISbMhkn+39eJJJ7ORvtudRn8LPI25BNuy767wNPqqdBT+bOCiNC0js0lkiKL6MbXSD9ESRKNr++cVoejVOlmzUBOkA7cle5rw0WZVPxZiAbQqGU0YbMMxJmIoYN3ArSUe4CSfltw/s07H69xu/HaTJETaaQjLibDYdWhgeDrVmhpuW/5ogFUB+KqiJ1UZ2X2fRWTSWGxxDgcmRMeqaT2aYWTvvGT8hzEGHS/ii1ktesG9DHYMwHa3gxZWNpfK0oDHXqPNa7JGd2832ca0BUi2ItIwlC1JpJEyNqlWlqTajWjIxma/OTdiTQlRUs/RK1zbZmVTZSW0VFFMCQiphCaRmiVJUYWUammtJtRNitG2hrNaGlrSKZrLTZrWxWIpUqYG5n9z5xA6YxJ/qfwfyaTw7eAddrhzSJOaJuAPCMpf5iUDvwMpUyEKEUxjJVHJWjJQoQjLwcZQKRTIHGUwah/gAgWE7Ak9A+Y9fn7OIvYopHSFKQpoKYk9iE7Iy/54pP3mF6Qv7jYxuzv0r9fXgRQUvEwLAciNfFxg9mGPt+/YuAO5V9O1MQ80LsYdfUbOgldjHj8VVfLdA9/r/zvI7whHugaIynIHJR+UAeTyOfYp9ad6af6CJJOPyX9BRvgmZlhYAe6QyQRMlyA/VDsQobaxTZQ78V+oL2htp47SJJp8XuPptwv7eJZ1nYdXTgY7aVQsdwF8r1RRXp1gHSqlyeFyRlTmSYcrgIJvuW5MnsP58tcBCa/pJQDIy6NpIXA8T8dMfb5BIfEk9KQOfA3CH3A+J6EwnO46zxszHQcWG0PqcTAdJCE6nh5AazoJOYgDFGtYHBCwxhB2CMvu3afLzksazkTg4gSHcRCoDsUBwPpIy7Q1T+blHniwsuXahRmIrSQwaJBxmJQ/vrPBs0dHIQhcEk0CBcGyPo8NsNzJgc7WD4vlJAHuTUrq8llGlQCCOldBfs4+2Kftk+3oaDx0foMtqNhNPcjg4CidR/RiSwL1bRlkSRDB1xbGMfx5bqmSSMpoyQL3/1teHHPG7/Sj5HNp50Qkh7YTlPXOfJrhV06/1nJF65T5SG8nrtezHUGbW1qKVtoBiIjipQWlJ781GMhks+PgaX3bHF+XPeefluuQcEoKPCMpIomYkEmSZjWIelR2WRWg9s4KnOQY0MVQZrQ3/6RBDrgaXeGOXhhjazRo0IsUFFK7RlUbPKRjRwQWraSMiaaKmWIhBs0Te7HbyytZlJRdeJ55NEoU1vtaQldBps90mQCMBFQ0gIsaZDsMDEIQxGPTCMEZvdwk59hEb7xLRzu3zWLkHUGIykl249qxGDGkJDUD+IWiE/ltUID50HD/Lu3CQ5aFSQ0Q6ibiIMbE0WAkb5gC9Ekg53jyJtyFfk8Okn6V0om8OiAccKZHzUEkG5zI3pqxoEdrOBKjynKnJxly0dDW2wIm4zk2ljNsk4gQRVJSM00EWZDwLDSHZSRlUUV7NO15iXl1nq70cIZB8xC8ggYBIDTEYEmHgY6TSwQkrIRghjAoWJ53CMuO5gjKR7j6zx79HqRPYnlIIfVt7cTQJ1qjwHrE/X6TiMvBw9CH1PYe2b22VFLR7QsR3MyQwM7724nin76cfYCcfN2IylhzOQYMu4bafQJ4B+Ar5AsPPt6ceKQnbqbGtAeWQnlIyn3E0hpphls9NKi0iIUWvUqXdcmapKjelydOAJnCxoINE8928m19nB8dg+oQ9UL3SBQVSxCwd7ggFFLSPn0ms6U0AymxGWUKpTd0CHe0Ig4payxmPSYkkSFenwWL7dEAsUPc1to+IJmFyMvLYt2yiMvg2mwjel2yZVjOdKm7hqdC7WtjY2k4nEXcxaCOFuEkJAZKSUbCbph+jS0zeutFvMZ2PeeHo6jXW5LHu7v8bwe8PcrVCNn1iZ0oMQ1zQfHAlQ1jKHHdkNAxNLNGQMxjkCKcEzGldiurlynkAYf7mYHcY+A9Kv7abqv2cDiqHEcJvcTT3tY36cHsqa9LpfolbDzwHEkmCOO/cAS4bZItuvIbJbRlIDUOgSIwdG1yVVTIy8LFW6qllCK33vPELZ9pvEjNt/dQkNlPLavwDHIJgbmRNgLViKQ61YjLg7w0RdCeGuUE42jReNJAeAzT0csqDngH+gkQb0lLEp+/OnVRiQYaWydXddZLSVl6nF8N72Y24clQtOjVH89KYRObttdNj5emuTmEO/FXLDnrlXJVLOmY7kYlef8X8E+xh7fX68dQMgaDqNdSBBQLC6cOyMug2RczEWSIy8E2ZwwkiJVpUrREJHgilFRIYM9TWgjL4Fj8PIwPZzxp+hI6JB5ij1dv13o/OAi+B29fQdj7gTN0MlG3kYwmJEMiz8Ctl1+O5y3U8HDxYBNzs83xdgVP8koBSRAKdR3R6JHs7oEzgaR7u2icBAbllHQ7LLdAoTmSaiXIG5+LJr79YZvQ6nOfw8kA+E+d3D2KvxPR1Zon9RCVpwUDDGXVBUSQNCWOFgjL5YjLkVqbRK4kRJt2IRiIRCqFCLDGaMCIyVcI0CVKiqijGUICIBRM/H93vPeeZCBdG1/ngju+iYvvaFpCSohdkd4rCRySNAJGZ+cj2bZfz56WDRCTC75gnA85mpygGEtkCmZqVGDu47zBYvhwq1rOVx1lYx3WEtuEuAgjTG2F6QUaYwzLzLeSyWry53KTXwRR6VXp6ac3awyTbAkiTrjUYlNiGORjdBSJhk3om1wmWJHZMZSs+ckgaYM5FWbiWXggWrozpkGNPIS7hTq9IbyBMht1tWCImo022ZOAwIsDhrEL+3atAjQ2GGkG+NzYNYIpFVELAYBs80xd+jIcHSO6qRxnl1qe+BP8fcJ6TqQ05QCHpDcFFiM4pAMdoOvLy+5fp8v2veOA/5YaYkv8v5tkxOv5T53bT+18KqcjIJOD2ZdOGaKo/xcGMdTiaJ0PkHqIykv1+oiIA8INqIWJX0SoYCQRKzIEEBQTATIpSMpQSh64PbCPqRK662ndq5Y1zW6aNcrmkUYA/q8IekQ6f08yM/ITvZZ6YLkowcu+W6mcfIGd7MwAwzI5t8QzwwOjtVgmbLWZ9+eJ6jD48/s5cvBVeBie+TON0w9Af1BBTH3IymISBVsJCxMEQI4jG8PTiCfPpcXm3wRnH/P6LDrnHKG221kgeKkDEi6uXsn1VWSbb9Nbb5RARCtSQTJmZzIzgY4SPmpQSgZMI3nUW1aBUnh0DhZNusaoE02yAIZBG2kLoB6CSMpRCyRoQjzAwZU3SHCGXnDztNPSc24QvTn+8DlyzFCx0VG+uEFxxlLGVMk6B28TBd+aYnWct+DzNFM786b+DzpmZraKZaJAlM1B4j0lR8n1TSj6bP7i9L8jXFN2/EjZ3o4HPBDT73YZPKMYeR8NDCCAjv9+dejDOwiJwMEoXy9+FmjQyVbvpO44AFXSwwc5xYjKRvVMHLESGctbs2QHbD5pMTfzTZgeXpQ34YDRZs5oaLTnHAeo9pEnWPdjB82QmRR6jcJkGyeHbTmzRGNjRYjjCZczl97BZPhSsxqau3HZ9Rn1JqMMetDSSwiLKqb1azotzQjLitG5D8BDipzmk74ZAzVoj3pTyYMKyMplMk+SSF7UI0dW1/z8+/DPiMvhuhtEqQz2b5OMrJY6PESDoss1HstaMTxkFo68ylKWlNoByo64XUGHXZEODQRBCd3HBQ39xEjEGPx+7pnr4dEAg8jKciFfkuwuq1Ovt/QVLcf977UN+lloXVSxEgqcrWF1JYkQHHbIy+UBiQOIy662yAnYoRyDmAQipEq/awhJAbEARhhBbwMEYlZ5JPpJHE2GRlPkdLGQ1CZpNTVthAzM4cPo/RJpLek44J3ecdkiUnxZmgfJm7BmY7fGjCYPHO7PV0U0mCsaUlJtRvfJj3lRuTiead4kwVSpCxZRCAjxn9SFJlrOeldGyJzyTOHQo0w8R0GKNOKFxcDY8tVsRfr82j16L6wSsc+HhwEF4InnR2+g/h3HJG955fL8XWlKjbfVpjyEg4h2P1ndlFihChYWRxsSlTRVvrSakMBCHMUMMhmlwcGVJIBgiMpIgSYhIG2ZVt1Wxo3SlLxck11WOJATNKqQgjQIy+eOx5u9mO289A74Hj9H3NDT9ELqVJhw4SmYjYjmpbASOfjUUC2TVKBAUDPpg+5oSaiRki6/fbmpPafbK2tz5jAYzTMJB8fr2eYucvibE2iMzyt26NSGjV1JSIwk0kyy/6+GkrRJxhyrMxHffBNEc1k2g5TkGrDQeZwHn1WrOhiRSyFlKDGNPkjLlVxMNnzYN1McEMMNO5ss4xFfeOUL62akt4YBIHT07n2B2KcGzgr9gOnAe4+u7fnnpOvp7UBZMMMH4OuOkoF7Eml09jNBRpzZxtLdlrGnXzv5fJBaSZgLmZhs36TfaV2vueMXT94n7+MfSVzSZMgbYWKd1OeIsbZWfzXrtLg0YDeTpYmwwIZmGP4JiyxJPWxG8ceylsu1kZEvfF3/Z/ufu/w/g/8LWuP6JixWiZ84jWiUYRkdMlA00MkAbUI/Z8IlY2QDuIXG+SYCxdiMSMuRDIMVrbEw4uCpIM/aat7QCMuFFn7Avab3DWspSvJG29gG5BQZwGZU1DVA4mDzjUXA9AXU+edmVa8SqI7H6keKq7ngSJgrvpaT9HZ3Z3ccUH6LA98aaY5OtEzrZyGRKY19YwMVgZAgO7mT+IU1Pe1aSYJYCt64dL9p0jdyHkzZCgFZ2hjItOeNcJRgP2GDmF3TNDN7ou2+VSAqeYQ8MjAOuxDQquHD0LDRtgqzAgssPMR+8/uHYs1yzI5I44hzH82IwiMPAPCDPDuooWqoSrqW3295nGKWF92R1ywbx4Bk+/OdaVZB9K3D89WwptqZqB6y4+UJcitHIQyEGcCBhIBF4+BqofRkf9yYUI7KZnnPQ6+WQPLj2JCXAZae4qcF/PbMHQvCMoOSI/Nbp9JG4joUNHH8H2BlM2JYRsg5NMM5rPJxE7+LBZtMfCgIy9IaSMuiW5l0F2MPfRt/BgtEwJ8afdxkD1cDgxnZYVvdbdJoZSkaux908QU953SW0nm9/U/Dl3e5d5fyEEEA+aAAyoiN30vg9g7IAGt/Nz2A3U7oAatYoGSGXdDSoGpVUpWhFpQIy8VmUSIRTVkiBSpkqJzLhbPbjxNeB6v19tdihkjL6Fk2/lkmYWVVEnM4zAggm5rmMdexlkMWiGBmkQ206wccaAjLoP3FiMpGzUjLyR5lb4c0CMuh/Mdu/WbiPH8+HV13oVrr+MsuikIOhPxIynKxpYnQFQXarplSFbWOamC43ngbyMu0O3SkE/prXB3DE/TzD6h4yBrdDynH/m/g/hfmAJZOSMpYYdR8Vfr7eYfEAToc8WBJZJ0Iy8OYZUGB3BQlHgCWeZRNwKMGBO8Q/iaCbMjL/2FENUjLr+NENWENswfHi4zE4MMmZ/udz+J0RjHw2w56CMZh5ZUVwKSwd/rIynMFvMxVZVITMhjin4QJSKUhPxTV23aUW/bte22mCUJv+o02hETl2Q+J1+sIymz0N5re0rQwz5skLSFockjL7FJ6NyRuB9Q+jf0+dsZ9VPPFsMiEaQ0iOWJkjqQyDzSv4WpNRzSA5wLwwQ5aITEAUkex40H/EbIYq0giEEDElCdSdTpOBDWGz936gewJsQ2RBW6sUTvssgXdlSMLKkagGvFPt7fB15o9u3L0leXeZpJ/mZXAwbAzMXDKMxjlwGUKpgiYgHlCNIe313u06M1IRyytV4Q/M0YeTxNtt6iz7TjPLOg+Pnw0xunaWcxP2/zu3Q0OVVHqw5xDCMuPUM8k+cT9Pq1mvb34qQYIPs+6gXsGoIuoSRI9BNpMHYptvcjL8/s5/Z3szezyASlaeFl+9gcog58lzY6ifaeAzmHdcWzBtnZsaypu2tpDvuTRDjOkmJpEzZW0JsVYRuEbTSSD9usuyMvRLVgU4+KWjT2trbe2SDibSMuEhliHXGQWWqAdRjojDY2HQRoWYiFM6u2SNtMmbRSZUXXdRAQn8j2YliFoymXDAxjAe3E1qioaiYoZtrDZ3LHTS5vvoLZyCDCINMGk2yOQeraNyahRDKNaKqMXQTiGYFmOJGGOb4JiH0wyUhGxZCMbF7bsEsnmn/CWyMpgH8v9/kjL2gmBSlAoxBhL1EGihlBmAx0i866nbustMpZNLd3ZdC0S8rbaWEmkpKCq1adBkdWOEBoMxaBJIKq3lRwbTrF0CMuTZTKYozUlprTS2UkoyY2kqhQk2ZbNilqMTDVSlpe3cep2sp1JIBGNJtDUIoxsUYjLo9QrC2VRtJkFQMrUwa3wd7ffGCpoYEgreqJdLclMGStDGMMOcXMtNblMDB0bRGnR7NXIy4hNBogQaCyKlLhZU5AkjI1uqk44VNvQ0y7UKMjLgw0H2xR1hItxiu2MTNxXWYJNPCIGGe+i30EtFDcU3Baa4seQybDpiylmFREUe0qVCizUyTBcgLAETFqS9trhSMuvXdKzTzO6m3DRK3B6DDTmawioq2k27LrLG6KPKYwt4Q0SO5BDEb47jGBGkK2uGiEyAlNAyMumSMv0MJUQtERBJpqWLIpWDEuqhaFikYDgSmlYwLaXVg0FNFpLStIG0kDldTmjTYxoYBYokxoYzMdtYwzfsy5shqhhcExBC8JSiWVhLRdUMiF4cjG1aoQmk0q0DG7mGeyl+57sNM/Q69vdgaGTYRVhT0cRHgjLjcmDxTIeEXX8GTNbCVp4ZlEyezFiWMxnj4zGGeEQVsFyuFVYZcjLkPDYvBlprxzBc8RIy+9JoM0ZaxEa0MS0jfhpIxi0Gi0+DEehtiEl6iQ3h+83uQ0NFpK391wxbIGTCejJIHifu6hzNC8b1oQ4Mkhi8TcTh4VzcGJQZzVSvCokUt8akKEXcQwlCAtMSmaFcJKGmShmyGKoyMvViXLaE8wRUaDB1i2mkGqxKjGVm+mgpret6ITSJvJ7otCGHTOUVkIuNLMGVYXIWOFh2cH6Cga60yQiy7Yswxaby9/R8okv3yBWI1BYglSX9mRCDAcQLtDXUggbWtQTqMHbgWMoMtRaUjGx68gfbC24S7CPEw0JpZWINaNDgQEQJIb6QyUoDCQZdGGggIjLoFkImIMUTYyjSZEIqKgSpi4RpFIq3Q2f74Qneqnq7e7z/EPPdR0RTPlfgfaYo6u8X5YQ+f65uvrYD3uaxGrDhH3GLDyanukNn4yNHCaI0x4fb9y3vRrjznP6/VuehLSNyHKP2SYTEqRC+89hlqMQo0SEQ7IdxZ+3btKqmifSoXpQWrJpYd6uHd2j1xFSnFCHKeSE6swgclHftDXiXyLBibfNZmopKKXCHB4eAlLE1NNVPBkTmaZvXvsfBDvRtVs1/IuFswlxCgjHnEkiE9xGXnDk6jhvSiu+enBvlhNjY7RyEQXOixEbjEjpZes8tmlgUTSwgyLMcHCQ4yNcsDjTUbJ5nplyuWXq/SXtp768fA6kRBs57C6KOpRR3zcIp2+6tw2gbjBv+Jyyn7cFxn5HMNbw8zyKrk9UYnNfTszg69kdOeSIV5cMDh8MZqUksS9farsj4Jk96Iz4s3HmZU220EcEIoiwp6ddSm+5VUefGQ2EkJGYhnSe2GsfTNja53cjp22hkDiRvmAbvqG1fbThlaCPS8ccDvGTlx/GI/UHxCAfj+XpnH4tuPrU7x+IHSB2lKKUpWogCHoPzUjL0QbdmMJ0LibKaTSh+ECDzdKEn3YIy+6QO2TgjyturOaaDK3Iy42VE2UJJGtOrSGrCSIWYF1UCZNAZKu8cmxajby6ktdtU7cjM3deKorq5pZZo2kWZCxs2a5wqd1WitJVKqRDITLclwlQiNEg4hhGtLkpSK6kCwwXYNQeRGWG2JqD2T7+ItDTdHplI1DzHaqU1zPfhDrhDnJyqPKQCBGN1UjKogESMAHGQGA1pUvjULEbA7BiECHdOljoYBnAoakLTYZAybqaJkohYVNAhgYYCHxuznscY4tSZAZYCE4DvCBQpQOocCZWi/1u1Qyi2xWAUzKbFsa0Ri0zUbRUVRW2ZaKIy5GiopmjWSsykkwtmjRtSaSoUbbTUAIo8DKExAwOt+3t0KH4uBwT0fc0jXQEE2NipIkUqJqiIB0v0PNdL1r28Zb+ZtTRzvJzrJNI/juvJOSDgxVXbOlF2bTE0qAgkAPtgJJRIgmEK9NlqCWShX2QPplVyiRTUphB985iJWaeXXSarupNrt2kpCmMBSilMQMQOY4kwIkqsG0qhgpCRAUUgGKS44Y/66O8e4699H4Nw4gH4zDn7Mq9yYqhwHiw8IjKXUk1QgFHYYhyh5r17oppWKAsAgIa0TrLoD9aczy7+svhCoZoOwz17480B7IWAiQOJs+k9NjHgxtKnCS0ZPpvKfqTWezpXt39mCj8uGmX50tIwyiegmg/HFFioHeffal0cSTz6wnLY1jrbMxYsYxyFbw++yqSDYxqvAMYx6Y2QlQGhpCmYDVqzKoPbK6EiSaYYNkp/Ky9eK5GTpbuHymrCD25y6TMFhmS395xy9T2+ucjTGw6HJK0dAygl3YiI9u+lumfreY5aWZsZnVKOBjmXQYd2FJvGWDMJWfQ7F2GzkZs51XXCg24abzfomrieuykYgsiU6XRGq6pzvOZomydSyiL2poJaKwwyFWPbocLzZQZEsltMu62eLwTQH+cO24qCrEfkTp6ODdmKPHifLY80zrInfKhm7JhMm89OcbgBGfvMbh/rHjQ/pWPwMFQOSKCMTx7CMuJiMveTJvOhY7CDY2uPcfJeio/kvsQfkkvvDk2hPCRX6QMSMvjShQIy5ELyCPNKh8CTRBQUP9xBwlAYjjIymcYWJ3zCMvAoEGkCMvIynJETQYXxrGJ6hhp1/hDoHPX0zRgih9kJAMiBJeOtzAfSMp+SeFfTOAzkxc+4ZIYjJLEIiCSYfaaMk4SiMuIykYQDtBogQfNhAawZBpEGjRqHHMAewdpSCP077m24kD+0OAbipIbKjmyCPbVSABMETRTSqulaHns0CazHIo5SrYFAiiklUF2VSTvcYS7kKAkwaSYdtQr3ZWPeilY1XhQBRiIy4zBjaUy0Zq0lGyIK24h6sDWEQYzBgxyJKJQGFFUkRFihUOBmoDYJe4k08ipCSNhDWOg/TiURZgIykmEXBRIDkxAXjSPqH77xi3MQlJNBLEye0eowUDfrv28PJxJSeAEa5m90Q/edsjewmnRk1CUnOs7QtiEp6a+JGTgyxJx47nF95yIy4JoxjF48f4HHmZgHo7wMEjKUO4lVR9RoiiYokHZCMubSYGYmkgA+GtuNVPf5W5A7jdjB7Hdk0z4tnyG5W0/qgLEdyK16WnyaGsQL9zMzB3iE12Iy4/cgLEyMp0mPxdyBxzDt474MeCfyT5p2wY/XI0omfV/PyW0tWVnJ6PPNVr8EbvRvpnalxj/NxzElssrOkkjEVThx42c3zCqJoOGFx7N+TZNL5NvzTEzUpXRJmELBIGGKJ5GlMXPyD1SORa6r3VI74+2n0wNH4WIPCQWCNUUtTSWx5yQCC2jshh5GCxiVBoZgFCerWliV0PB0e38Som8/qCFbEzMVNUPz26VvXBG3s2iUR5orHQ7xLwm7dcPIk/vhDmhG2WjhvZoyMpD4kWKSUPal+YBRf2P2gHx5cVUPMmkPMQUmYYWOEIZAJI4ISEB4ohmgUdAf27HrwMVyTIT1nknEATV3/xch9uw4doAdUmZRAQFYCOVMpYwjhE3yDTpR7T976+xqmljaODkGazWtJNkrlSRhnnm8yoU5q685hqZUYlsZTVeNbrS1i0UEljRsFvBXTWk2judXm8naOl1h3XFzbu7dIrpeLeNq8Ucokk0aMEyyFmShiMK0C4KJRq15qtNTutqNais01O11SZKsaNp513GS67rd2V11uiys7rtuauoc7NisRWQgUuJKGQAR/diCB2ukFNgVfrT64DYOo3TqBhBfT1/V2i/HSHCfmGvUFA6OOH83vwHih61P83rSMuSgMx5pfZESMvt9iAmBsCoetlIy6RFdzx/Oo+8RU8U9PER9/7J60FPIdpQdAH1Yg7Ip7YKRhYBO/0+b689WY57p2z5Gvq36zr74lMsQ7vWzeREr2A6quTDC9jjAOHyeGDHyb21p1npD3OkReyJVKRmaqlQKIJmSOpIy6MlBH1QiZcawQTEDWGx/xmxpP8sopMAnK8/29+kETcqGJRiAEIhKiEp4TwJPrPZG0v1KoQPHIxpapYMsALDDDMCSQoWcwTJXCI9GnRUVEQvoM312ZjmsTjC7S/IkBOMcJQLWKbVUgmMRQWLar5vft1y1ebW0G+gODtglAxCzTAUmo20GALRSqEISEjLs50luRAsg4SDFIRATSg2Mgng/fz5yMujUKIfYkIVtQv+fwMX1+4qEEECALCQzkoAlpQyRAoLMn1P9n+13PlWQ5QIy67w3CcyAEXthVoCFSAYZJUZJEIWlUgGGEjtCMupXh0/GbJo85CiJzE4oPIVlYgZCMvWKCQiYlaQEJUIy98fce1gPggJ2idSqHZfhfNveWilKTSVTBTSmUqH9lIhQSJUKBARsbB2iov+mHfjdWsb788LnB0Q+uELHjAmiBOItQ/b5UzI4h2DOhIjyhYUO3w2StYLm2mGvs6fHLDH+DcB/Gv6imU4IQcAgy/lCNttvuv3a8jLqFI5LxQD3oMsOMIP5s7hwgYMHBsgI4mkgtgX9fNDrqG8iMpEZsrISEPHd1VKGsQfB2HB9bA2kQ0tmtM4YG0AhAzOJsP+aNejC1kR/gUjSFhuDAGrJGFcZJrMFRMRgmYUIIkUAW5BDYa4Os04SLTjkYqkQWnE1IagMGIjAx1pJtKmjdBY7MkKhlG1AQTCLHixFhAaaBsdrgjLiMvtsQ21Hiq5YvFXKNvVmrVytojL8YY0RCl9hulY2zOcycPRxo+T23NXV2rHdyqwcB/OFFskJDCTSDMNhAwW0uvIx4U3gEBlkkjLmv5RVGjTVFo09VMCawCmLU0ZJmkYORo22MmRRhaQCIRaVAdlRzAwyCTJiTQIKYtMDaM7KuwY7DAaHY555YuCQIZM4hj5AvyZhMc1rD7lQzwbx8ooeSHOlRBJyIUGlpoIEYSgxQUBwVIxBJ2GXQGyG2jj6PLDox1ohwFE/UUzFQodo90j49IbEcgQgIFSSCiA7/rgVT8QSHGFT74UMhaSDkJEYbCWoEyATFJAjmyUCuIXNEfA8wfjvfFJ5w4h7zxd9wjKVPiU/4CiJtePI+TE/ZV7gsM7FijaSQtgHxgtJUWk1Shx8pT6M0mmctcjkgVCOSQjGMjQBERNoY22WSyYaCiivpVMYYEwRBGTLgaVwysYWyQipX/q4XTgGmUZhiUVafJ/Sdn/QVSkHxtofPIOiVaLeTetucjrse3/Pcw2rJS9Rg2obU2btdSyYxtIy/GOdhhAzHpBMcjptD1nwgSlylIH9WSH5O8JiAe5KQDd/SqDlCD2Hh2IgnYqUi/skEjKaMSIykC+zBwhAWZUSUaFa8jKfWGNPZNpfUJ5mj84qHuX87ELV/vr2tIYxK3vDjXLzj2/5un6W9D4h+RgiJKGkiKSqQgiogvuUKfxEKMXY6O+QTtFELA8rDMzFgR84dOaFw9Gtu4Xt7SbU+J3GTN5qiufiU0NGpAhp4XG7lDF+z7kqbGHK+/N+AWwdGY040SoCh6XjUFIY6HXX9JBOmLVN1klKlXvgmEMdKJlhdBqRA+qcxm/PnVcvjWrM04zH6pcW67NchPoho1si0enGFGExt50CsfI0lEgAmloOOFDwGFf4wypg+LgMzNeYbcGk2jiB7P4MPHE7GA8gIkxJpIMSbh0IZmpekwcMN5U53oQrnbvykw7ur5WxLvHksdYvxj2vnNwbnKqqMH2kc5yyi4xQ+CXsiod5pyD+XUMfz2H0TEIy74iNZ7VspnQt1ZPINvLAI/v8kcYa0jKdDYMBoJEpODLCMuE61p1Flm0pqWNAzUypotuOHYG1FN62jG0tMGaTUBlIZ9H1JJIicRY75stmR+zMOJOjROeJTcONaXneeA2MQSh6uPTlnNdLj1Iy9/bL0IhwhgsXFSuk7lgvtDEc9HPRaZvm7MWmR9aI7bdkdB94441ylreyMvcpqBp4kaqavTrzHl3O8p37LapIpM/dMq9vaQIf6+c6eBsLGSLAmwdunGzJxJHUzMXdokcEBlISMvHpksIcivsrnx5jw9vR5/z2QVLv01FevQ5dsbqUWOOhJvMohhAxQ4HCHoVPuVFVWgwFamHiNAVFPEIy78fQ62G2nQcBOZTHHd+MJO5D6ZxV7LZe1TiuB4pY+OkZn0Nx269d9LwE68CG0oTM2lgkQ0xB6SYpGI3S5xHqiXUbzS3OXMbGGrQGyx2cMR2xSTJGdokhR/EaUzXF8ziBs9qYRpPUnUHf93RUSEpiTDUCBCBZkriD7pjdNbNeOcY/HmMYPTDNxgk7FG2EdpaYysQ2CbomEkICMusdT1HPfsHk3abEFA2jI9cVk7G1eTawf0a+GM6fRnqE1RUcNDH1oTT11pGVVWUVVGLa9ftzoDD8BmqRGCqLPq2x75atyNG1XkqTaw7tXImEaQ1uO5mh6UIy5SF9rOg56PymGduIbwcyV+Iy57lvDWzN1276U5OiyyDkib/1odPOae2lIZFsevTv4tSc92LsjhG32MEyTtVS2M8TjU4c65abFwoUERLaXQ3o8puLrbyKDXPU2wwiIjKRlhCSMvRSd4XKIzsOiZYcNOLqd8RuscD4p362YD9V2kMscptl0EHdNuSfHL0pEw7rSg66PtBm36ZdWXELAnVknffjr3Do8lVIZJxOeeOMQwPMMUXUtgfuZsx4omHsy1OTKsUENPRmD4N+ORIVV3PV0rYE5evjgEZ5dOXiYumUvHBek7BKqqkZipLLrYYD77Qyvx1833+PwrB5rW69ScBF4dn6F2YZJKAdQjVKh71P5kn7wfENv2x+QV/xCMOz5EqClA0MQpRA4PX1ms2VDqAfp7tjtpvzn68fg/BNxo62DFjWgYvfESZMmNAWHceufqO5japMDN/M82oxa0jkHKppmIIynMVHea9AwUtw8rtr3HtKwjE28l8h+b+HE7/eHKRXfSOj7Z6clXNNua651hrM6YOWweeXhNP225JV1Y0U96dQfEBQfJkk8jKU9yKSMuNv7q+3RK68uZn19D70kGIy53OdNxkzMjLpud0M1vZW+S3RFw8G/eblpNFHr9ATy7iHI0KyBterB9ehQyEv7Vr2bgRSMpEpUGIiT1yLAMhiMj0DwJkiCC/GvB257pNjsEBljhXn+EMxMMmHH0O9LQrEx6eVDkyEH0RGFWX9H+P7FOjPgOd1T9CzCFm9QjKabZIy8fgkp2cJNDuh9eXV7g4AiDioZlIylyCFXQpzTuB7YkQMkeDgTNmxBuEGj6zAnaXROAhQuZ3hxJJ/d0vun4QUFTM/eoJniWzAtWfHT/AUuYSMjlqehUqOAZx4lCuhs7IViFoHrSFDRfmBlHqZlOsexALyMphZxLoh4P1CPcV84jLgj/m6Iq1K9hVSg0MfzNNEw2CG2IGvrcIynWFGsG7VvmuTXtS4m6l0laTPWp+X0VPgwYIy5ANdbtJN3zazuTG/rf4WcjL1KEnEO6ZfnKpFWm3G4o+UJHMiPpq6xKY7k+z+Y49guhyhRqmTpxME8870M0VFa3qLulHAnIGr8jLg6FTBflmviH9DR4FCSROzkaLfZQP1nLUbT7N8ut4zS9OiUpRSzU2dxRB66/VgsECQNiBMNQETm1AWIFwU99QkYxfll0cy6GfO1hSI7IIjpxAfT5cOIWwtSCUlVI0o36iECIKRpoEZUgkhJCWhlQEFCAyPdy4XDlOlQDHKB1NAM+ev19wU/ih5MBAqiLIT2Y/D7cppoL+HoVLVVUGbMzIy0kFhBpSUIpsMNSFYZKNMmI2WaMzJliWaJQSmUSEEBJFQRVVIfkXt6XUAJ+KSpAaUhIOwR1JmOxNnqc6uuk9hhE1IkWtc1cu3G1tQ6HOG1zxFFM4K0jLnOuDhBaIymMYxNNe0HOoIQ7+p4sv7i+xMMrKnHd7WMPjLMDFJPfHQWpjYCPWQd5eIMCsvEOWiC4gguKFGMz5TkPzPYZTtpNnoziiuxNIy/pA2LVZdCt0KIWaQNi6h1D2BCEMMOCFDnAUIP2FBQFIy5FIy6BpGcookYkZqME8uZ8ySHciHf1Ia6sOElicJjhRWvxIgGDyxjDHZqpDtWkvI8D9ySzrwx1/I/T4U1QpRcG2o08+v5hmNfwk4Zj3qLWoHBZvCLnCMYf0SIdfP+KdtdKydahiLLY0kgpP3qIjIYWq20VZBkY3GCGmRog4EaTYGAMK2KoaBsQiGUmcaARfXbK51Fq5aV122St2clzcGAYxGbmGaKhSJAMLE3NSEGKMFlqmEQVhhKmIym0gBaCwkaSO+ESQPCaGBChD3VEQjuZSptE3J1+TNoQKoUZlCZDUuREiODjQ5BQYgSUDORxn0zSFyaW/BkMxaY9I+EwBEa0MEFYuWlBPdXDNMfoVWtyQtXhVBrIM4cYVlP8jdK/b7jWBkhH3dYdsfMDMOquipQa0aO4eDH4RK/cXiMvjpCA3yw2xajbRSjyDhGMUE6NkoeNGcgsjjJYGEITtZxNTSMuJrRnBkDJSiMuSJswhwhc3YDF2SkUuunXT1bdyyjt1XjAeBbZlDmjg6KWU0aNaRJJnGiDIQPcSFaAiIbojSY2sHCBkVAjLI1FJFDmKLCNjwIIzNWNsbGGJuEbYwZpDiyBAYykcwdZVEyuFVadLHmQZMrMG5G8BCRGbiIWLBONVIrKNORAqR2t1hHVRxtKsbIbgG3rLSjNSGOjcUSg0SkYNChB1V8jLr085tbTubNvWtZvKJ5q7ze7SZjuNBlCYm2TbKbwUy6WXS1PGhHA5U2epsgYBWJSZHVtW7qUlVE2Rxg+clbwaCtVOOYQWBJkHCPDIUsMwK1GQHrEb6APbU1hjMlqTu2+WlTUyXsMDCQTeiGwmlyFCI1GbYZkE6zpVAcYoDV1Q3SGtTIyVxZGDjQ83aGSAaNUxjZ11qzE3FHSRb2zRBrAYDIYNw5uEdGi5y6HcjAkeaqOSrGkkrhsIy9Gs5BwYZEWo0nGqMDQyANFFuhc0oNbM0RiuOBwMN4aHrY4XG2g4NHGHEETXy/OQCeepNdC9cRLSG9SgdqtAiwGyqQFgbucGLIjLlQsYGXVkMsBXVuk8N8HeESl2kDIMlmQMkyQTMLKY0iCYOwCDIMCD21WJPu2HCZCfcXEI290N8DHk0a1FWcgI25WxskVRtY6XgiyMQYQGDKaIkQBpYUr1VeB49tKB0h9WGsjLgcji8ObWNNM2+m8Iy+qkR+thmyLGa9KY81MiFgw3CMHYLhnAZYgWZswqTTFMsbjW6ToYEYMZtnnY9MFzxAw5tNFzhBRl4DWmv0QgPNkFqvAx4N8QIgsrT25MyMuSjQBsmxG4iqkJ5yiGzzw4dcbh5pe4OgdNQ5GaUW1bbpYhOI4Hte5tiYwPF00biMGLYI4xVJFEBshGxNnUgtmkRCNJaMY3wKkDCMp0lxAY0IUKG0qIRiooIpFS4MjKZOAw4QbarS7QNAcEXcDHDkn5xcV7O0fCyyp/gjJNP68yDIdG21mnUKhINsYTIfyukiagx4VqEIwxqs1OczoHmEooKpUKAWkqEJaISZaJiFOij/IVOgTqVA/Wnz9YBsbKH95eS9/ER2U4PRPd+7t15xaVHqIIBHfgYL5g2GHw0CS6H839pxvMwhGCbvJuwE7HF0uDlp6BCHHKgwJgGAHMmZYhQKBoVJhTDmCp2krsaDqOZto+ZBEPzMIwcITmHsM+ASPAewuPD6aOpdrKmgjYlMUv2Y/edyRg5W3InOMUS4UIYnKoBKPE0LtKoosf5M3j07ZzrYgrdXV0tre246lWZjoIUI8XMNQeTOJsGDvp3W0kSeuvPJRsWxfIy7xUHLnazlY/oUs8pAOzsokuG5qbstwyMEYbN4DdEI4gNpTrmHHm/4fVaC3S9/W6WBveRSYtjXCXIjm9cNdT6XEtL8MDEPpneVjhthBhiMuEiW5syNL9fIIkFr9zXVow0xfQtAo5z2xjYQZJkX8Qvp2zBD4ECDxOp4yAa/skgT+1Brv3EYJrNZ1LzDoYcF4KGGjFhDvZiMuJqLWv1PIJOcDeGWUfwP0rw5Tz2A9V2n1wDMGWsMDrX3fjFPuPSP8fb7uzEvx/FLEBVbs+DDettU97DDZY9DVsmGGg2USxOazgCMvpsD1a+VlxUXgjoExJz2jwWTXCWQhsSjMxZBUNG1rC+09hDMxI4nPfPa7in4iVBpIhFhXf+qHkSMuA12ClqATyqjyK6Z6JgMaqv8QAd25sj8by8z02curbE8ZIynJV7GDnXDkcPlqHQvqVCA+na/qCwnnlZJW6xgCnc8pbw6zxO1jYwieVDjuslRKEVUH0lPdC7BwNVRHgz7pN0sfle8/R1cVHVmrctKqESJwYsNNsBhBQC0jL2GzICkRgaVRNnjhm9hvzicToA4muM6b/u0pgFJSQnMZbJojL6n9VUGUqqXtwN5NNGsyV4azU1hg41SkW0ZBS72SOpDcgHeRdmiDa1FJjbV45q5aLG8VyrxtWKOiBVZA4SMvagNS6kApBwkjLmsXIYL/kWEouoRGLSC0qAUzCBmRYxEaRBoMYSMuwOh6NFTC2B4Hdg/VIn0jKdkDj3PxTl9Ye84DtpHDhiMpaaQgIyl4yCntJXUjKeKq5tgP1v9G48CVNnEmTs8uv05nf+3intOePc9tgr+SQ8UT5ymCB9yJx/YoH85ABunMD6X+SQxM0fiU86Ibp2QUtIFGN1evNPVkGUI4yQmZQuGWU4yNhQnl6zYM9mAurYQhA9gJpDgc0Ro3JRUoEKVVIy8BcRCiVDIhqkJE6CapNOlYUMTcHZ0nebw9ckKieBKMFQNRIgPj7A/ICIGuQonMPNif9tVD4KodF8JPHvI/bsbA+8hNxT4GGEHuM+EHo7kDzSMui94jLyB/PIgnIHy4tx94oh5eo6kzb0obr+B4HB833mFCeOL4n19QcWX1yPukROEe4QJQPOs1UmalG0UbZTZSiiKNNJCoxE0jLpm0yxMplICVitDKtRttoQQJSVpWQKAIAaBoWJA2hiPcH02TUtggmLMgVsgEGA5MYiNlciTYT7MjL1wTBpjUHlDLCOKNKNNjpBZkBoWFYawjuCEBK0QGSQUeMWN0iJMhRQsjKWwbNURiasSzIy8zNNpFxjBtEDvG7Bujg4SEpQUIZCpAuEKKzKgwi56N0IMjLrgjL6mQYJIX4/4eOtkQd/LAdBagIwTIYzCCiiIH7mERkCMGII0gUATMNRCtZ6gO7YFDV1wWKj5cF7G+fB4+mpPTl7vM6/D1G/lnIy4+jhFRllV3AfWKsxJKAe0Mm/uyZQhc62m+5IThLCiDrLi1ZpNjlz7HR5co2wJCkmAzZU1lSyhBGu06SOt17TEexoNDNY54UmJIG8gtzCoeMaELstW1DsfBOpPMh6FTvCmYiNJFZmatEaIcp0JGQEzM7YfZGtxHJGlBoWkVXJVwlTNjQlO6GzsSHrdjDv/NDwkOM/0VKYTpTxr9ucFjWtdqa4zaxSAozNUih7v3a45mZuUjKZNtIy7aIy5A59F9YB+Wdz7O513cyj+nDhMvKAftrMEkO5B/N0iZM+OKvq4ncSOyDtb6mv8vHp6+ubyP1Tb26T10RM9ehnFQemlnO0G+Z0Ttdp9II4qL7O5vp1ujkPOwdAmnGlzoHEriEi2lkJhBESMuFxM0nS7E63xvsjwRXCEaNdc5p+x2or0OhTTyRYLvwfYmxyMvyMED3ocnmp0ZzBJ8WacqOx6h0EMMJ1IDomnWoGEGKSgQ/WHjG4iPX0doy7na5Duil3XdM+H4RKAdYuCulN+xGBmajpnsiaYjL4awz5yc9MGTOzjGLZudNTj93zuuF0ZmbgHThCVP21RkzXt4nOiVzKeeF5KO5QM/iYXgc44frlq2hjRA4nG6O2hE9GRTIE21rov8Xubmu7g4vE+bc6OESnQ3jTtRIGup0rzfIy52sYwx8FotzoOPb+EbqvPl7kvo3LUCEJj09Lk6gqfnIS/LlnffuffvIP0aFjEp1mHZ8+eI114JUufl83LAaEcgw8vDi/OEF7fC0UZEwSR9JFJAO4wY2mYjKdpmS3TswdUwM8rPW4kn19v8de1MUj2R0oq3leR6u20JJ/PZOlijyF1mFCMvckEo6VCx/i7h4wLQIO7+MmufbpuaPjwPhTu2MJSc+PRiSnYmu3zv0IVhWX4PmpKlB86SXFsyzoxKX4wPrYJ+bo+Pke0MZVOOi0zwjMdyMT3VSd3HWLiHfygdd/ajib5UdTGb8KKislSX3uYXmOd/l17dJrp3f030SEZRCIyJZJkBwhnpVE9YljsSd4fVnLB21oDxl2Dk2MnGam48XfUvcc5zGCXB65e4ff0wjOrpmcEwkmOUA0bQ30nVSbKCtBeTrL+OnNiq1xxCFk2MYK+bwIdOPKIEh050lYCDrU7OZnC2GDny5pRIdW4FzkpDwiXCvKTqau2YtnDDd+nHEmwpOGc0iWGLtGNFYXIjpUNJmrovNOq2CMDXR3T4aIG1jqeSkTdrOCdaM4AtGI50eU0jLqt3woNwdyOeRy+uf9r2raB7jUm+vB2lPJLzJKxXcvW9qdHzxM15cavr04uMgvFodXomlgyFcxlnrT4E3mLBAVDjQNcL3Ftb/IfPgidZIgvk+BaI9991Rsc8QeDk56k3633wae+0u3c8vbZzRXd296bpu/1XviTBJ4l+ju5I8fDtRHsqvJB2l12Q/iiLd+6x6DN0lxSPT98YIyqTTsfsm4G52FTnI/o2OI2KbZ8Cj0yQozyjyeRaTeIMSofU9aVXYi33wykzyHQ69G1fLY24ukx4TXWvf/YBuFaPJBlBAu2XZoK6T+t5SPF+R3ojL90z6QT1qmUstuWzXO8HsDfbIy6kQwmIcaIjLiYvIpKQoo4rXSRyKEbdchIxuR2TatbaaG8aIwijMinvOmawmBge/M8jA6nJcb6jt7Cz0BwJBRsHkOSPRqpjiiIYaGpYweVHYkSccQgdGIlTIkrnfTFgx6O5jkOTpdfM7JLd7kPan84fHUFNRFEg20UF2SMvhfJJDxZAiYCQ5PbrGzTR2OElzzs6MZwh+y8FODjPLEHpHhS8s1RPXzowSyMu5PjgKY9+l7GJKRiw4iVuyuBwuKJdCMiI5pRXRhGVw7+aQzSfmaiXl1UE4gsuTcDCwL7dQwQDu0CbOsGJRCY+fz4IQtYkguxdg46jQ0RCoduw0d/CdHLFwHty21jVuvJhHpJLLowgGwujBIw3ljl6GbL7a7vcSlsDaSDltoTJlLB2slherU0HYriYnowMeIq5bGhEoEQiIymhgSMpZ4GKoWMMqmjRk+2V+2lVc2Z2zQNhYbRwIy8bnZoSiSyQHthN+wzr0RXv8TcjKdCQOHCAFkdkgAxAMHts23vpy1laJIC+Oz6oGDMDA0Mg5wU2Tum407PoR/JD1phvSZgnCHzShlwIInqnmqhB1p8+fQfFhdPelncG7Brt9atEtMGpFFMcbOSkkEpMnHJccPdD/cOkdk1kuJZ+ERG21zhbbBjMPG8xnTio8o84cl35x1J5ruiEu3GZ6o0oPcH4dzGUJ+9s6iXiGTOuJ5fJYe2THjjxxFUGEOg7J/DnPyuGwjPeaJ0mKks0TLdL8xpQdGNicgs8t3tzqcfTQdej9MJY5nSYcj7OVfSM9qalA+KDyQxLL5ljuuOH5rsBxx6dPNouEZPEGiV0u1NcwTunejvGYZFRqRzznKSW+x0uljVvAhRgIy8kjNEjKXTv0lL24Z+MIfpwU8Tmmlp5dnYL271F8oE1Dt2CF6zXScbmNOjtH23e2TniHDIjLkaVNd7roRcJ0e+eT7qRvOm7VwTmKyOWFjRi9IUtFLJLNrYLTbp2XVZVYIasKZY6bL3Wkz1p2MNqpddM9WyZO6bWG74cOFsss4NEQuahsFbn3nDqCDi/3YNYMbPKuKPLT9UeUPnr2iXdg1J6rdFJqyCCUJR7pELVmnqzPWLRdrgTzjZlKt5Ony5F+qhbY5xYRZJm8GG2HSMjLqD6JF9RWzCMXueGT3GbEHlo976M8V4y5GoMk1OQr5mLWRI0wQT9OPppPSWauZxkWtFWGHxxP2dOQjpaUZRKMElJYxNDGYM4TiMvqcdwwhxAmUg9V6nqabK0VjD6Ee12yt17HjwaPXoeUzqGZLSVYFbyulIkZZwFGbk7MUZAvCwnyrebh8UOAWB6eOhQScSduofAwSeklRNupgsJUSy5kkvU59V8YGkfOaT1TjZDv3NtkNjDm9bnRDYIxYmerk0F0Iu4wgznpLhoa7KOV9uJjMOOQ7qaKSqpMhsPQRPQgbuvEMTmaSMujqAwU7RfMmYJ1HczCSwwStk2gMg3mI1oZhcMCAyG2yMupTMWzoSEznHsJZW6K4rldnDDWQMwXMwTPIFnp9GHSm8nlER5meIg/DDOpJvlfFFKTHqPEYx5ZpjkZ2pqo7/zlYbo5kKchp+NBppx5jGl1U8HiXqNwox7NMM0Xzt8iY3MbfsnZpStaaCSNTBx7Q7WbcRM0MFR3hAyHK6uwDUBXrYtGY6ENYGwuG1blsdf4j55jyhhlaCtSGQfJg+Q6ERtMMwzVoMweDVQzSMujDTNDjSlG6LSVZIxhGnHGwIQTiiUyBViq29NaKDWNc3E5tc2x6XWFqCgNAO0gtNAPskclGZpqatt6a4WxqjatdXQj4NAB6gbRWkUPoIqhhgFCKiKKogQ5DM4wHozB6c3mYxXyMc6bRLM4B2LY2dU4t0yxu22X+TXWhgRYh4ag3UjL0Y7Za1DqAwhyKy0jDCkqqHwlCkRKEVcZAU32czCzc9++naUykYVcK3Z98M19t1jxy2SLhpSh1NIYQf8Ydgs68deVGLB8twINNyEHYj8MmHD/u/lMGzhbJFZ0TKffNCq5JAaO+Y0VCjJSRNjGCMucAzytdNjUClLz42vJoJSIy84SKkjIo1XAbTKoEYLl8uNPUjuGXix7aIwIMJkQ8qE8MV26D1IVwwaTRGk2mwVaCQwpWopEc0ZxIiCVTm5RtMaYwSx4OyaJq5ddapjihVXYzvW+syVzrbWo73CxbQOjBtIG0qIOGlyKCMuBqpYYjMllqHI2AxlZj0O7er1pOJk4pjGwbLEZhHIVysDCQtx5eDeLOZGIwaQeLjqOXyswbOVzaGsGoiByzgyLHWNrjWGtToZm8SbkTc3u0yRttRNopStWJtqQsJZdy3WrmcGXqSMYCp1dp1moXTtVicHVIapBGFIIwlOm4JpYSMpaiMuQYQBtjG0xcSZI2YGpCMuMNTS7VJGVIIagwYurwYmDpwDrNcGriWLOgM1ccDDJdmtjeQhMupUmzG2BohAG9PmK1zQpEnbUrbCN3bV223hpm+0qCMuKcE2Ug5DgYJjFrSNyDvUBQ6sIy8QILMjKYeEyLQ4kJUlA1MpVFRUKsMM3iDSaYNjIy/GNvNRZcKQkbl54ulo4YXciMZGDMYuBkoVnEMVaTUwdW0jLjdJDIDCLcY5pu4VswloctlINMMYjsB2BDONaz/pOTCy/ALDcTkXOmHYhrZA6gQaf2YsebUjLhqqUazLFqsFcIwmM5XcQZwu4uA3Zl0C6alIrnF0MtBKUZVLjiNGNsg1C2FChWhtRh1MlYFEkyMuoYckzeTljKKpqYK55xag1m7c0qvLMjh0Io0nrkel10aHWyDVpR1pRwHKqqm1QKHIzIJ/kqixxAtlbKvLm4qA6PhMIViJGBHuRa72quMenCnTaVXfvFwMDJwQH1JbjlpyPGIP1ua260Phrb0sLZlKYHDNOpsIXwTbRhcB92FasyBKRpnZ3CTp3Sm1mmU3GhoLTKTRgZIxEQLM7oqwxMUbxl2Qr08a0iLSHyCoYKjXXVq30cKUI5wMOMYRwlD5ZNuH2F2IjiIMSaKNSztqjDhuPL0kAh5mPr831w/MRVVBgjBZFiMvFL2S5d0bBgxtfmG3vP7gyVKGqAInHH4F8AfqEiJTI7UxxMgyqhPx87mHgC+e9lh7ccA/Qbwnehj2Kp41O41rLgGmYqUxlt2focigwkVVVGSjJD3eoqe5JX3Gga8GwTmXpj9rpwVla2XTnGYccTMPoP0gHg/iQJA2/d6g5IvqQSJwbSGWBgQ3nyez3BP17CHoB7OmIHFucWGy3jfqW3izCZF+iUKwdrGhDv8fooezfJCzicFiIrKmq4PHW28JGNoakGOSRsRVFaqYbx6tcY0rs0aMKi4EpaqVGCKqNZ5BmebEWzte3jOvSZYdewPYnuRE+IHb5RA06HDnUoSchkKCII4TazLZTVQSPzn7cST9h37+gmpuedcBXzJ49FPaP3pkhqT3qoeIIy/svmUnaTKliVGQIGWEQoiNErkgBk6lQNQFBSMpPinPs/kt0+CL4kp++ez0eyw53w/UmMxUBqyo2aSraK0o1CGLQo2Sykwq1MowyhEoQy0IjSwwROxJUmLKTJjSzVFKU0moWaVKRTFQUoy0FolSUbGmyUpos2lSlQVI2TLEwsxVUkyVEUxII00Cj/Obeg9pnxU2GBs5na2Qay8agzdqGjJw79C2stGB7lgzNYp1bHITy7FR/I948zknZ6xF4dSPD43EmPuuxXUnsS3wNIeW2K1SPHJPtITXHDFx6EoBYsuE9feafKDDE4hxTXbBlDLDbXbcL99GMgaX3eaggEgoyRfwLDmcSntO7fwh2ZYYYEJoXJ7ecOpYqJkk6m5DhjHsPn7vTaQCfPh4HQPE3TyGC5GFQrktHWDK/D+besGYvn1NFNaJt2MvOIQOK/0fUSB8xIjS0pQJEiUFd8IJkKxrIy9MIxFWTLfWnaGgIWIUmQG0j8U0hoAbY+0jLtD4mMSY2aQjL38mIiMn0gNVg/spcHk39C4akTUTIiNwWTH8Iy7oc+/Lo0Vg1EzllZzFRlHRlovo7HKTESNmxvBx0ixihd5uiZdkmAYTCGWBDDADg2xZtrQu0gakeCMuI0FVPtsd8zgumvXdQpZ9PezXvleqTSMuT27kwGNY+aRLX2QwaMYnrRKqsdTVFWWne9JSoWNIMaRCjiSIJkZFYIpFkncccY8D7ehrTsfKsoLCcWH9DCZYt4xDlG0MTiidmwmG0bdMxtZQBQGpHGaYmaIMgco0E+WhOLs7av9iLlZAe3oDjPBl1I0RtwcZFfZDaDelA7ZE2aJidh2HvTqdCEQJyNszKfZJUaA07jsmllNjdVLiHAXga+AkSVVTuiKH19fd6a8UO9VDlyDcJxTDESkVvq9BoH3wfA/NnCP2HDq/A2PZwDw9qG9azOnjr0tWfezHVAc7uG5MJE/fOXc0psgQg6n4/BQh5ZueL9y+nCgcxw49MNzYOdRw2efKCE9+FA5Vhho2WTf1YrrThb0BV1BzgN5WwytHqLxAIwZgjARZKQa+vTiv3vGVXm3G6lFKii3VvDGS6z8vHxfHXXQ1KqildtXQHx7LjKTpPuLgcNOYFBCzMZMEdEd5xstv5GI9A4QvUE+eWjg+h+mnhjPxncsVPoc3JXSvHGyxjHqZVFwa54wwXOhiFSuUBhswIGd/gvPPar4au8OHLUS/X9R8tBzk83Z9UPQHpn4J+JO/WxOHL3/dYrlINPbk0eM8xRSDCCw9Iy7Km+eXxH132ea1nn7VezPcxczMeil/SEmu4s4MhJBebyrIb9hVYp5YNRx7LgUg92PC/VxK3MwEIy+Gsfl3hJ5ks0NPfVjviNBvhRAZ2CND/T85iG7sGDujprcoUbww9TDSY7EwzMUTHDSePdrQAhoJFICiKMiKDG8/SPUvbVKLRo9fQy+f7Jg2JppckiMpfE4pGrIX91418vwojecJfyIVPpmvizFs5OkjKbD8ldNFhihjAkQkiSvWTAZHJGCfs0UZIy5C2zwO8MWODujn9Z6iSQPb+CGPaCVVT709tYp/Bi4rW8JnTK8YhvwuGVWool2SQpSON0GSrlQmhBOHCFg2o1pzpFGjbgyv2LxgYNtcW/zya7dVjoqRHo8qqdKmXAUcKRVULNlxUcOPxOKxxM7QJ06HV4mdEhC2LTQxxAghuAk2IE6K2DIJoSJEzmzTU/pLSsFoYRH+UiSVRUaaBTnIuGRccpj108d6NhpeyN902ZZCQhCeydyKNIhC9EJpQYdHGD4UgdYoxK9IbhrnNDABrUiYZ2ZdHAMGpa+MQMBnXrZwQbtmGSGMIZimUsS5WnG306FEt25EPhHVTtxIp0ZhziMp3vpdHFgIOuzQEtUWZSoIPEw6z2H6jd2CaCMuhIwlmN8wiBdyHKNO0j08WjmrWwSI2JLdiVcamRDEYB0SidASEdN1x395sdNsomIrIkW5Rtw3MmDTFBnGxZLEyJIjL0ybaiMp2cbWazVYNpLrabSSDxhs5Z06Tiv73p5PrnayGd9b6VwunQkESsNBTSrFUPalkIzd0UGVSVqcat31Hn/ndir8ICq6byMpsXktikbhciwCbtl27Dwdu8GKt8X89cB05KZiXtPUN3nSFEhw3CCnbFQh7QZZgO0E1TnNjNWhGw42LijRRwERJJiCeRyh6bCTSkGsDNkjLsNJQPRkHGDlIylvM1pWLZuZlSEq5VOpcdJXPnVFYdPh1MeeTUx7uyMuKapc43o9N7syuO2DGMcnW8symYJl2vaYHGOzSxSMQDo2hq3bG8MjKehjTUIaMqQhxz3RXXZgwYzrh7YiYWljJlRQ9QzM6DMPabSoQ1IjKTs5c5p0QpEYFqZIYZ1lsBpiBnyPRXJFYtOxrGWaDrTolTsukQVRMOlKoyTAp4czqTL3a6YfhkyfQZIWeu7OIy5pGRPlbNOU9wHNlEM2BM0J6d2EWNyPpk3XoPtBnVuKpNmYZ0QI2Io2QCVqJSt4Vs8oculVVO7lRjVNGQNuuEjaP188FWPXnJV0IaMWMpV1ImXx1zG1k7vhVl6E6ZK6NuQpZyhYVwO5Iy5G7E65a7W3XKW77kxg3mqUGyIF7D3mnq51VpS7iSqINvphU0t4UYzDdEluk5tDjs5FP2IxBQsMJmnTmFPVy4nFak3rYFfLiXjpsLIrkqBmQCHSmfWZOIXU8B9GuIWijyw7LFlC+hM48r5NdNcncGzY6HI2Os0hNCzT4FTKNxwzEhwmwdA5p2vpZwfIl2tZZmhQ4us6xyiBCxg6QPdHbNWnk6c86Ya2bS4EI4JUDLLIT/jDtFi2/vJJSysZ33FyLaAaBsPRPyQMQ+NmkYQjGxYGyGdNNoAOdoTVYikoQqIjKdofBMnDU5/TFsYtzigwhYB0zGYkjeHcdEPJA5UpFHh5t0Ho8OPFHV7l0GeDoS5Q7lHKAxiGpYkjLjSomCxWTzOx3/Jc7zoc0/AxILjrXIdaZzuJ2DBTQzMmhjNUUVXaQkmyio5w2yDkvLEIaiXNlIAYXIV1OzBlHCLPzv+b8GmLbOUzZFDlNYml4n4YPkavHuxv8jw0IymUhBCAwkwHJk6s1XwO7mYsRZO4QzmpiGrUwzKUlrSmPghGZJO6vtGtsvyht+5rh7T1zNjfaBXmKxMsIgzh2ay4QcFid7CKaj55biWaW53elJ01w8oiMHtPQ+9J9edUYuWQaI0iA2xcRKUhyMxOkH4aSw+0ZjW9xaG2renqG96Ik3NFYtF2u/stWgnhOWjfLKfIsBDvfA8oJ4uGlqvxRhrsmNww4zIDYkKEwjCByCLJSk1OS9XQ34Gpw5tYXsxZjZ03pUNm90c0in2TB0DLRFNYOqrcbNsbxO0EMOHXXBW1zOZfGsrIpnTqYCxI9ed9MGrMmtSWwRm/IrXWJLuaNnGY69tNndy5A32tIy4l0JAk1TnULnBvSpyFR40rpwiOyGKJB8KStCMucVabPaCgvEoxA1hvoA4Xs0qOqbfBMBpfo9XkYrdOJvEGbH1pqUatIghQyHmhi6poRedBRhpIIriqUN3Ump5s2fpBxeIdh16ILR3CtekmgMhtHCMuKC45dSA9HY8Y0yvA2OHUjhCvIIYhINjQl3Nu+h3xJQRIYZqBiTE3M7oxYkVUYxNRAapkyS9VIbnIMiMumJopA6pepZdSy11aTxG3Q2IqSIRsiGlrr7AzDEzDoCXajKNCgLSinZBo60Ow+BmxNHUIg5PUiQYjHMYBkSMuwTl1lJSVVIlVU1N4YB4wHEepMSAYTY6AYycDmbL1uGZJkJxSh4HQjZZ2JA5m6Yy8g2xSpYEO9VNnY6jHgjlnY6EXDBEZBpLrOiqY1wjcxNBpgDY06TopQdIiCzEPtHy9fa/Lb3aMreJIzDGKgm9fC5dajzTr4/D0V8h0HHf7e8lUI9IcwBYkihToiqZAK+JK/o7f7fj1a3VQ956Dxtp9knmHtZfe+NhrjF+/4kzEuV+HTG10Hbax/kUU4DFySm8prKfAgelnbFKkbJ4jLrvK6mkSbsV4xdjZJqrEzlMbndDE2zRSoj1t7fGVpQVMM6FtW0PV+Ly9CKOnl2bWWT8jWEH7iA75o47KofMkXxpOJ9maE82GNCUJ2Scx7mcEOhroXD9XjuaYOwujhdBdSmOyrKlAm/EsmBNUnATQaRVaoPyssv0E0aX36OEHYd2Qh5c9uCMuKLQsktloA66Fieafua0rqR3cMeBUp40tHhNaBhLKhFoH98FhNZiKX25LliGlkl7qVXEsvKHvMJp9YTtd5myIqbusM2ZjSdcMGj3iFP8Yy/Yv2e1ABNCr88OHefiPxgnid2/ZSaV2nbjfizzgfVJCFyD+9kKJOZmZ7j7a6B3hcGAD7lCUOUeBEZiNHmjQGsSWOCgxskIMkGQQhh19p3ApsZqk5ybwxmNGLMKWRY0lUsAhlG4MYmhiKYiQwTWaojTmNS7WBq0xRiGNjyEISxkoxkeFIylKIBkIZDoJtOCGLGMiuh3cIymw5B/Q7GBhkx82PiMuaNpLKDSHXW3KqL4rGIo22yMuy4nBdxg3OByB3VLXEySlYSMU3PsDbuY7t/IF4KnE4WXgyYPQAzbEMzGYwQ93kfJpjP3GaiJXOBp/LOiVVHAJiVKRS3MxjLUUVaC6IQaBymV58Aes2M6FTi5+STiaTPP3iYHaYJ8fMF1CeJ4dwpA6RhxCdQbe2eaLzPUVFWjrjnOgiym6RJ3fbJmI8+uYe4lpBCoEuGkeYzh4hAegeQZnOIm3onTXTrInPO2YId/dZesF+7RpszvlNMhkb289TvrxjifQjHZeXW7YvOHmehU9EzPVXmwEE8FBNeHTY9iG8ciUlNBITx4wmxNzpQYx9Wofh9qyYNOWpUxNttK/hGz643gswpyKqGX1nJ47Ty3Dj0Nw0a2Q7oR8PGev5QjR+DQB+pglQSBm1WUjL1lVKW+3TWStSbRFwhMhKQHgQpEiahTfccAUIy5AG5JtYSEEBvrhoVyaIynSQpszELwZFJJF6wF8pAexVBddGuoMG5ydQv7aMMzN4MAwX2ivo3Gt+Rr0udzr4flN8m2LSzJoiNUUJkOOuPt83ifFTiojLvTG7vMb8QH+EUggQGhBKQXp9+/2mdvr8MDhw7HwNRdf3i9a+7zptfPu7j8BZhMXnIvcFJQmSErmSAZMGa14IVCabRQcpEIrLmUjLwIoxUd80zjos7pVdt42rmirpLghQZpEYwkGY0wmMIWgwVhFkB6Ad503wSaaOQUjLspnIy70IagjKWAMEMDsBdIoQyBq3pD+5mBjr0m06cm0tsbSihiDo/nkfD9p99DpqDqUVMQ4QGGqQStYV0aHypYkQJY2bYCDp7B7ebQx7tpm4GCRgxlEMTEjKerjy77DsMu+BK0Oxh99jo99RTz4GyHQYoMhViLhgCaGIy4zGAQeusKw0F65PHh0h2QTMzfHFm0LA0LAKHgJ7nITEjKE+v8u/hndWrlhIy7RaOT0uvJ0k9eTkJm8hWeRAYTNN9+SsIUEbLcRza1jXXOQjAiSvwci1naLN1WDMFpUYDpG9RzXv5azT8MqkIKAsrnEWo9TtYyG5IrE209Hap8yRUOhzkQPtNEibTgSaccJIy9QzrzRHfmOLPuEwLjpLPy18IfrPhIEPVPu7EJkfqQEeAe3XCJICBSZSG1MpplozBBUJQyqtmM1DKho2bUjX3WxrW6W6UmrXGdN0xc2u1NrpsQtXIMu8zKAWb7GZsGZgMTm0pcTEvOYcta5mOlrmAOR5+0ZMkjPYU27QCMpr6hhE2zw1zbzvQIc0gsBZANgfzGXIy4PBh6d3kHjwJjoBgN4zHJmO8PHxmDMAahmQUEwGbX67hts9h7vr4+fEX3dL9TgJml9fyMucNb1WXSKrkhjDxXJB+pyvbGAsm0LPzH5lijCEYSOluRxtLeoYndBFBNNEYrCzVjpzqIoNFeLId+Ily0tC5mmkXiVo68Q6pYG0EqCaJhLd86ueEPgHYcuW85JNmDvUp3SUywb3TeI6FjWcZa5hw+5kaabdInYTiY25O+iXDfOm+lSRYSQWRSDbuWSHMm5uWSj/X4z5c4E6Hh6E+Aw+1VAFYMjKUfNAxpccEFsahQgO0zWFNHGpUbgN5xl0WYMmkNS6BC321X8BN3JSVDLJSFPxKVBymcD0M3bUGz2e7zQRESQvce5a9SWejxAxBNIBmvyKCbIIyk/wiMvsMNpqz1edZS7hHLTsyYqaxKs1qczWCCpih2sYsx7SFAgkCCEE3FUUhV6/RHn75seQ4uVsePQOzDM+wzMdTBCB0446QGYSHIHsPYJEryEaiMvff5e5Hp64JMTG7COTExCeHp4bD31G8ULOFYpUp/VXIdhB411+VDg1pDEQBNmllKF7z3jmDFod/f6N9/XoiytTCGc87MpiLJ9vxmpn8hx6i4QhO/kx/ojBviS1dHs4tG3Iynt27pqfWToBD3gaCJDaGs/TCi4ixo19D+3Fw63ivvM/WZke0HbET74OokBPIekCGInaL/dAejQbOgk9Pf0QFg0dbLGQkJGJFY1kMiKiiMvt1SChzumXFUhd1LQ/EZdGtBrbWllMSihalgCpCMukxxAPNGTaNqKZGNzXZqlSYFMYlP4EMBjIfUIH8aSnUCAZif+Ir7vR4l6OXMkhkAhu0wDxDmCbeQgj9wewXchMh8Df88bIGanjAnh5B5HlFkUWgZFihgWEKNlT3nsQSMu/SS0SpUmRLFSaslmmELJEQh6/qKWjtAOn5WigpCgYpUWxpNtNK1fXrfxt3lAo4G0n5ZUDIE5forFz0fMbkOwRsD8CXQh2SMp9mNUHcTF8op4mwmGYZbImxk1E2s2xiqlpkhIqqLbWtIBEIEJLBKD6cADUCEvapj/lkNeIgnT/X8TkHn9Zfc/H8P5ybW0ElyZm5gQxba2LfMcRuz1XHrrKxKBF4A36erZjUhD8A4Bt5Kp7CgJI9Qc9h7keF4jKaceNvwUpPrBdx/FthZ/Fma0SDkLFUnJp+8YfQsjL/XRgz4ZmAcME1sLYkYwG5P47UHEnU3PuLlCcmQUhR5c8nq104znWHwfOA9oMHHgKH1mhTgInmT5rhKAxC/NEDEVTE5Joq68TFhSTVwuTVUq0bKbNaapxZwccCCkENjo66+4txVFN/7CVeYSiYKwOg+HQyMuyzHD2xQCUkfXgzgd9pThrLzX3uMkbIqZDC2UW6KbiCcDym8G2mPB2B/VQtnVm5aUjYnP1UI+EL8SBN0vSEWCw4O57BxcBrltL40ENeDDSyMvMzfinx4s+j6XSLDFy2bN7i0JBB4MwDeJ0/kB/3KoYHvA5ke3KyMvaoZkoakZTRY1JQbGrGTao1n2O1vzLV4mwoqwVoClT6YI3qCsHR8VjRoH8Qdu5zgWYgzKcAFk4M4e/DHC5d/t6aI0qhgdDr6gH4eu/LG69fVGp7NnkKSif2gRSihoEK2jVJtSlYwm2myjWaQBkgWQjznLXX39hy4z34VVGDkIb9Xw/Vu/bKGpUfsY/v5+7fl8SKXfgLtAEKb0Iy8671DmyaocPfUyyfRX18huy2CirEcjLirzIUwC2tNgNKDbQ0dnUEZGAWv+PSMv7SK0PKIgIynctajGkTJROesBHUNFLNETKjqQ+05YbkB0j+9UL0hNSOyaB52CR3jnvkmocyOcQByKxLkzt/xjQVpNsabbY4IUhNsxIykSrnz4Gg+3Iy71uaxyD9SQwiMvKCgLK4lTGm+cEN01BOpE0aU1Gqk7ocGWgYKYIy4mGxrWiTIISnMzINpNOgMEmGhxmmZlV3OtppUqlDeu7XOZKWAhkKClpHWYppOgZtojLgHqrz11ennl2N2XNKQRUolYIQgkmFmEwlxzAcsgygQUZDkWypAOkM61bSHE70MTuNN7hsEEPqFen+E6+P9G6ruGmDwMPXyTT6I4Y5YJDjrguMK1J4ZCIo7BU27tw7J28BeOGud27N/kOPkIgzmQwmgggTtYR59EWoudqpCRsZotGMKfSqwz6584iQUUcVDgVa8TXXpxwmao/ookhy1VIyjeAzQUnn4lJwMEnizUTCdiSX4SMBkCbS/oFdyxx6JGFiuypI2lvLaE+qaTE4nJB4UMZbKKo7EHXF6tR5at3Jl0d+dL5tCUcaRGsS9TSrb9nyDkTBgflqbdh1KhvjtOGKCLBrnkX548kCMuhkO1DN+3WHg9mTt6KKkIlao/YyLkoVjdMO1mXGvCIy4FGZeXwZFwzyMpgeQUSvTMDqtH4I9AnMVeJyIlg58y2VDCD+Dbz3DwTRw8Lp7b8SMu1kV5sLQ6QiljbFdyPKTVsS8EJMJhI4BYJsARd5/T4Hs6fBOHbv/nYx1XjGwQ454P6qqEpDLuej8yUD/zfWYMMZV++3LIEKRUmdoY4Nj3nyMkCY7/EKPoeSy7Am3zxXKtE7804o+v+fjxPTYBx54a6Z0lzMKRof2wjKrYfxaLxijbdiFv1iMpvT0V86tZ0aWOJOKVBEnTGW3ATODFFkV4wag3Q2Mgc9atujv1qomQZGmbRYPgdLJqfwR3u2yDgIa/RgFvDDPyCQ4Sqjklki66d0O89kLMfxK7Iy5O/YAUNvfvgmshIZnXhk/pBPcY84Z43FFPM6zHZCHU5AzOd6JkzYcu/Y1BNiMuUK07kXAtfyGv29sjLlb6WDfn0u4Ipf0dIdRKIft44/PgOIqcpyvdBAhaYUgl4ID3bTfs/eFKd58jTyRpJCMutYL8Zj1t+kkgfP1aerhw+WNtt8ySBnYzJJNWBTr+vpu9NaLf+KReyUDlCX+j/4f7v+j/V+P/p/6f/N/4/6vh9+33/+/PyR/v/7P+vL/9/9//h/p/j/w/4/8Pu/8vb/H/h/n/427P+7/t/R/x1f8P/H9H/D/29X4f/5/2f8n//v+//h/8f+P/b/y/8v/P/x/zp8ev5//P4+P/Lyf9n/Ls/Kv9/5v93y9P5f0fndwb7/1loVf6H8D9dTAVoE5H9gR0lOSczNg/0jxP6cAexJNMobn9z/wIGQZiHKdwX+6qIpE6zRSflD72l7vveeO7pkyQJMpl9a19N7aUIyk8wOlojlnpkJBHk12hBd2m0SMuceJyQqainCMpjTEXfO/hi/zf9GDSEj4C/6vjz3R/pE49wc87kfOx68X/lDMjL9mRbsnp35XgiNMQ16g3L2tMZnbMp4AeviMpYwSanl/bAonlNeX6Dpf7x/vzH/S8PDwL/dxNKiweyYCqSP8dCXhMf9E3FQWKQdDGkkDKBAjW3uw/w5qjg3AOl7dfR//LXRrnhrjMK0xwihjUZ1Ksz/e4uwMjKd7rTCqQgvqyNeza02xrepoHEFkowcDv4pXExhhs/2cGtQhipRyLsXTTDpiWMewOsiKgq7+md3BaZVi0k4sMBmg9zTDRJomeNUmEyzdqsu49yjoyw3QjRdsvNaN62mGmhIGchzxDH+pGMlXcRgTEoa4aa9nihLCbdxnMyD93JrFkYjo0cvgdHj4ahh4FRzeuJwg/1ZdmwL5Hhd2GyhWRxMxZBLNEwaYfEYwuXngxqxBrIyO9cFeE24wh0Rj6UYrA52byXYRklr2O5qzf3YCrpjgCB7GYz5hc+7f7wkxHw/CAoYwX2NVL29efe1KcV1/HPWimGCdiojrkjgh2B3bZNMJRquLZMFGAZIOD5g9faa93w3AYh9tZUUbuybXQH9PTry7P1mMVqYz4aTA8WJmiMYRGQt86qQWUk877cyMx787LAlgazaEmSGN8t0UhbAYkepZRAfWrQiQvmGNeOnSAbVKKUEwoURb+cbEO57MHs4rwtKrYEkYlvUQfq++YliZmkf/uDrhYKCfOBvHQK+nJ6zqAWCDcQ8OmIy89nDkcE8CYlKDbTBFZoSoUKiMuqNbSmStZLUlqZMsxUZDPIxAxQU75U0SCbP0D7SHjCf2EJ/xErseGGjRmo7z0uFBBG00e6A9jAcLYLJAxWRQ+f3qofeHl7880f9+liqT8ystk/Oa+EPflNdD/v41MY+V1pnzgbRDwGTWfTwjPD+s74bNPVvbKmGeM6bddxojrZq1+uplX1iGPehKVm6DWrcreyzW7p61bM17Bo04jLoQqYw7cQXk5t7Z/SHO/x2IEy+8qulFIWVgbkwkuMOm+XXFkYyKKZJSfOiwaFrabpNqLvkPextnK3yLYbf6/b0fThzumuVbTozn1LCmSJM7yHhA9lJrcvPOo1G3LXpW8WpYbGLSltrxvk1V4tSbFUaoaIYSkoUDeEenHWiMu2yHbmhZOtB1l1/fx4G0W0mKLxOP+7EP+c2HuJqlIjsYu4QYcLvKe0VVBBE42ktEPn6eouP/jnzFHVHhKrgsWfJkqcyMvD0GHx/8R+2/JEOSHd5aelRQU13D7l5kCbf8j5HrI9/E8UexHi/LvE9sHgRuv/ODAZ3CHen5DoP/RAhSAwSKdb1o9h6bmCRFihRiKkSMvEUmVKYoYSHO7IKlgmDfQAnvikaFmIyl4B6vl9OB7PwQ/4+kBjawJtXOg51w4pzv61SmRNouiF8abFtsmGNoDk8mQ98mEN9xiez8/63+wBUK9P6ZelQkVHQgGEmD/w1Mzv/1Ff8din8v+4d0fq+j/51CQnb2ChATr5f98Z/hZ8T/q349Cv1l/lG4P/UuLT/w89Xj/1/dGz1v9Xq/BGjZz7Gs7dHMjqW23oiDyY9taPT6pHyh86CcHpUF/s9vq5jil81Rs4nO5/+rz0c5t/7iib5ftdvYmkmogQvjTNgmKZJlKP0ODIs+nhpNv/zWw/KUaa92bcUVjhPV4f+b+BVu+ch3Cc/PEJf+pxCwTqEkH1CLFHonJH7JlF74HSu3jEyVTOCD6arnlyzUQ74BwQ9n10Tl22QM4mMrJTmD+50li8I4C6y1iWeOXhGicVEtZuMQhAWvB5fTpyzAisMkCQjenxkdCHFnIm0pVM0ScIYfXHHtgkSaN+FZXtNA3LY/s0+7/0VkeFPOM4s2+k9cpVYxF+Ia/7et6z95/IoT931/gYGGP/+LuSKcjLxITuSmOgAorIzw9PQpkaWZmIC0tZ2l0IGEvTkZEL3dlYnNvY2tldHBwIGIvTkZEL3dlYnNvY2tldHBwCm5ldyBmaWxlIG1vZGUgMTYwMDAwCmluZGV4IDAwMDAwMDAuLjQzMDk3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9ORkQvd2Vic29ja2V0cHAKQEAgLTAsMCArMSBAQAorU3VicHJvamVjdCBjb21taXQgNDMwOTc0OWRkOTg5MzdiOGE3YmU1ZGMwYmZlNjc5YmEyMDFjNTUxMgpkaWZmIC0tZ2l0IGEvTkZEL3dzY3JpcHQgYi9ORkQvd3NjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMyNDlhCi0tLSAvZGV2L251bGwKKysrIGIvTkZEL3dzY3JpcHQKQEAgLTAsMCArMSwzMjEgQEAKKyMgLSotIE1vZGU6IHB5dGhvbjsgcHktaW5kZW50LW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjb2Rpbmc6IHV0Zi04OyAtKi0KKworIiIiCitDb3B5cmlnaHQgKGMpIDIwMTQgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAgICAgICAgICAgICAgICAgICAgQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzLAorICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFBpZXJyZSAmIE1hcmllIEN1cmllLCBTb3Jib25uZSBVbml2ZXJzaXR5LAorICAgICAgICAgICAgICAgICAgICBXYXNoaW5ndG9uIFVuaXZlcnNpdHkgaW4gU3QuIExvdWlzLAorICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIE5GRCAoTmFtZWQgRGF0YSBOZXR3b3JraW5nIEZvcndhcmRpbmcgRGFlbW9uKS4KK1NlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5GRCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisKK05GRCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKK3dpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCitORkQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyIiIgorCitWRVJTSU9OID0gIjAuMi4wIgorQVBQTkFNRSA9ICJuZmQiCitCVUdSRVBPUlQgPSAiaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkIgorVVJMID0gImh0dHA6Ly9uYW1lZC1kYXRhLm5ldC9kb2MvTkZELyIKK0dJVF9UQUdfUFJFRklYID0gIk5GRC0iCisKK2Zyb20gd2FmbGliIGltcG9ydCBMb2dzLCBVdGlscywgQ29udGV4dAoraW1wb3J0IG9zCisKK2RlZiBvcHRpb25zKG9wdCk6CisgICAgb3B0LmxvYWQoWydjb21waWxlcl9jeHgnLCAnZ251X2RpcnMnXSkKKyAgICBvcHQubG9hZChbJ2Jvb3N0JywgJ3VuaXgtc29ja2V0JywgJ2RlcGVuZGVuY3ktY2hlY2tlcicsICd3ZWJzb2NrZXQnLAorICAgICAgICAgICAgICAnZGVmYXVsdC1jb21waWxlci1mbGFncycsICdjb3ZlcmFnZScsICdwY2gnLCAnYm9vc3Qta3F1ZXVlJywKKyAgICAgICAgICAgICAgJ2RveHlnZW4nLCAnc3BoaW54X2J1aWxkJywgJ3R5cGVfdHJhaXRzJywgJ2NvbXBpbGVyLWZlYXR1cmVzJ10sCisgICAgICAgICAgICAgdG9vbGRpcj1bJy53YWYtdG9vbHMnXSkKKworICAgIG5mZG9wdCA9IG9wdC5hZGRfb3B0aW9uX2dyb3VwKCdORkQgT3B0aW9ucycpCisgICAgb3B0LmFkZFVuaXhPcHRpb25zKG5mZG9wdCkKKyAgICBvcHQuYWRkV2Vic29ja2V0T3B0aW9ucyhuZmRvcHQpCisgICAgb3B0LmFkZERlcGVuZGVuY3lPcHRpb25zKG5mZG9wdCwgJ2xpYnBjYXAnKQorICAgIG5mZG9wdC5hZGRfb3B0aW9uKCctLXdpdGhvdXQtbGlicGNhcCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0nd2l0aG91dF9saWJwY2FwJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPScnJ0Rpc2FibGUgbGlicGNhcCAoRXRoZXJuZXQgZmFjZSBzdXBwb3J0IHdpbGwgYmUgZGlzYWJsZWQpJycnKQorCisgICAgb3B0LmFkZERlcGVuZGVuY3lPcHRpb25zKG5mZG9wdCwgJ2xpYnJ0JywgICAgICcob3B0aW9uYWwpJykKKyAgICBvcHQuYWRkRGVwZW5kZW5jeU9wdGlvbnMobmZkb3B0LCAnbGlicmVzb2x2JywgJyhvcHRpb25hbCknKQorCisgICAgbmZkb3B0LmFkZF9vcHRpb24oJy0td2l0aC10ZXN0cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0nd2l0aF90ZXN0cycsIGhlbHA9JycnQnVpbGQgdW5pdCB0ZXN0cycnJykKKyAgICBuZmRvcHQuYWRkX29wdGlvbignLS13aXRoLW90aGVyLXRlc3RzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd3aXRoX290aGVyX3Rlc3RzJywgaGVscD0nJydCdWlsZCBvdGhlciB0ZXN0cycnJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBjb25mLmxvYWQoWydjb21waWxlcl9jeHgnLCAnZ251X2RpcnMnLAorICAgICAgICAgICAgICAgJ2RlZmF1bHQtY29tcGlsZXItZmxhZ3MnLCAncGNoJywgJ2Jvb3N0LWtxdWV1ZScsCisgICAgICAgICAgICAgICAnYm9vc3QnLCAnZGVwZW5kZW5jeS1jaGVja2VyJywgJ3dlYnNvY2tldCcsCisgICAgICAgICAgICAgICAnZG94eWdlbicsICdzcGhpbnhfYnVpbGQnLCAndHlwZV90cmFpdHMnLCAnY29tcGlsZXItZmVhdHVyZXMnXSkKKworICAgIGNvbmYuZmluZF9wcm9ncmFtKCdiYXNoJywgdmFyPSdCQVNIJykKKworICAgIGlmIG5vdCBvcy5lbnZpcm9uLmhhc19rZXkoJ1BLR19DT05GSUdfUEFUSCcpOgorICAgICAgICBvcy5lbnZpcm9uWydQS0dfQ09ORklHX1BBVEgnXSA9ICc6Jy5qb2luKFsKKyAgICAgICAgICAgICcvdXNyL2xvY2FsL2xpYi9wa2djb25maWcnLAorICAgICAgICAgICAgJy9vcHQvbG9jYWwvbGliL3BrZ2NvbmZpZyddKQorICAgIGNvbmYuY2hlY2tfY2ZnKHBhY2thZ2U9J2xpYm5kbi1jeHgnLCBhcmdzPVsnLS1jZmxhZ3MnLCAnLS1saWJzJ10sCisgICAgICAgICAgICAgICAgICAgdXNlbGliX3N0b3JlPSdORE5fQ1hYJywgbWFuZGF0b3J5PVRydWUpCisKKyAgICBjb25mLmNoZWNrRGVwZW5kZW5jeShuYW1lPSdsaWJydCcsIGxpYj0ncnQnLCBtYW5kYXRvcnk9RmFsc2UpCisgICAgY29uZi5jaGVja0RlcGVuZGVuY3kobmFtZT0nbGlicmVzb2x2JywgbGliPSdyZXNvbHYnLCBtYW5kYXRvcnk9RmFsc2UpCisKKyAgICBib29zdF9saWJzID0gJ3N5c3RlbSBjaHJvbm8gcHJvZ3JhbV9vcHRpb25zIHJhbmRvbScKKyAgICBpZiBjb25mLm9wdGlvbnMud2l0aF90ZXN0czoKKyAgICAgICAgY29uZi5lbnZbJ1dJVEhfVEVTVFMnXSA9IDEKKyAgICAgICAgY29uZi5kZWZpbmUoJ1dJVEhfVEVTVFMnLCAxKTsKKyAgICAgICAgYm9vc3RfbGlicyArPSAnIHVuaXRfdGVzdF9mcmFtZXdvcmsnCisKKyAgICBpZiBjb25mLm9wdGlvbnMud2l0aF9vdGhlcl90ZXN0czoKKyAgICAgICAgY29uZi5lbnZbJ1dJVEhfT1RIRVJfVEVTVFMnXSA9IDEKKworICAgIGNvbmYuY2hlY2tfYm9vc3QobGliPWJvb3N0X2xpYnMpCisgICAgaWYgY29uZi5lbnYuQk9PU1RfVkVSU0lPTl9OVU1CRVIgPCAxMDQ4MDA6CisgICAgICAgIExvZ3MuZXJyb3IoIk1pbmltdW0gcmVxdWlyZWQgYm9vc3QgdmVyc2lvbiBpcyAxLjQ4LjAiKQorICAgICAgICBMb2dzLmVycm9yKCJQbGVhc2UgdXBncmFkZSB5b3VyIGRpc3RyaWJ1dGlvbiBvciBpbnN0YWxsIGN1c3RvbSBib29zdCBsaWJyYXJpZXMiICsKKyAgICAgICAgICAgICAgICAgICAiIChodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9Cb29zdF9GQVEpIikKKyAgICAgICAgcmV0dXJuCisKKyAgICBjb25mLmxvYWQoJ3VuaXgtc29ja2V0JykKKyAgICBjb25mLmNoZWNrV2Vic29ja2V0KG1hbmRhdG9yeT1UcnVlKQorCisgICAgaWYgbm90IGNvbmYub3B0aW9ucy53aXRob3V0X2xpYnBjYXA6CisgICAgICAgIGNvbmYuY2hlY2tfYXNpb19wY2FwX3N1cHBvcnQoKQorICAgICAgICBpZiBjb25mLmVudlsnSEFWRV9BU0lPX1BDQVBfU1VQUE9SVCddOgorICAgICAgICAgICAgY29uZi5jaGVja0RlcGVuZGVuY3kobmFtZT0nbGlicGNhcCcsIGxpYj0ncGNhcCcsIG1hbmRhdG9yeT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnPSdub3QgZm91bmQsIGJ1dCByZXF1aXJlZCBmb3IgRXRoZXJuZXQgZmFjZSBzdXBwb3J0LiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NwZWNpZnkgLS13aXRob3V0LWxpYnBjYXAgdG8gZGlzYWJsZSBFdGhlcm5ldCBmYWNlIHN1cHBvcnQuJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIExvZ3Mud2FybignV2FybmluZzogRXRoZXJuZXQgZmFjZSBzdXBwb3J0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSB3aXRoIEJvb3N0IGxpYnJhcmllcyB2ZXJzaW9uIDEuNTYuICcKKyAgICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L2lzc3Vlcy8xODc3IGZvciBtb3JlIGRldGFpbHMnKQorICAgIGlmIGNvbmYuZW52WydIQVZFX0xJQlBDQVAnXToKKyAgICAgICAgY29uZi5jaGVja19jeHgoZnVuY3Rpb25fbmFtZT0ncGNhcF9zZXRfaW1tZWRpYXRlX21vZGUnLCBoZWFkZXJfbmFtZT0ncGNhcC9wY2FwLmgnLAorICAgICAgICAgICAgICAgICAgICAgICBjeHhmbGFncz0nLVduby1lcnJvcicsIHVzZT0nTElCUENBUCcsIG1hbmRhdG9yeT1GYWxzZSkKKworICAgIGNvbmYubG9hZCgnY292ZXJhZ2UnKQorCisgICAgY29uZi5kZWZpbmUoJ0RFRkFVTFRfQ09ORklHX0ZJTEUnLCAnJXMvbmRuL25mZC5jb25mJyAlIGNvbmYuZW52WydTWVNDT05GRElSJ10pCisKKyAgICAjIGRpc2FibGUgYXNzZXJ0aW9ucyBpbiByZWxlYXNlIGJ1aWxkcworICAgIGlmIG5vdCBjb25mLm9wdGlvbnMuZGVidWc6CisgICAgICAgIGNvbmYuZGVmaW5lKCdOREVCVUcnLCAxKQorCisgICAgY29uZi53cml0ZV9jb25maWdfaGVhZGVyKCdjb25maWcuaHBwJykKKworZGVmIGJ1aWxkKGJsZCk6CisgICAgdmVyc2lvbihibGQpCisKKyAgICBibGQoZmVhdHVyZXM9InN1YnN0IiwKKyAgICAgICAgbmFtZT0ndmVyc2lvbicsCisgICAgICAgIHNvdXJjZT0ndmVyc2lvbi5ocHAuaW4nLAorICAgICAgICB0YXJnZXQ9J3ZlcnNpb24uaHBwJywKKyAgICAgICAgaW5zdGFsbF9wYXRoPU5vbmUsCisgICAgICAgIFZFUlNJT05fU1RSSU5HPVZFUlNJT05fQkFTRSwKKyAgICAgICAgVkVSU0lPTl9CVUlMRD1WRVJTSU9OLAorICAgICAgICBWRVJTSU9OPWludChWRVJTSU9OX1NQTElUWzBdKSAqIDEwMDAwMDAgKworICAgICAgICAgICAgICAgIGludChWRVJTSU9OX1NQTElUWzFdKSAqIDEwMDAgKworICAgICAgICAgICAgICAgIGludChWRVJTSU9OX1NQTElUWzJdKSwKKyAgICAgICAgVkVSU0lPTl9NQUpPUj1WRVJTSU9OX1NQTElUWzBdLAorICAgICAgICBWRVJTSU9OX01JTk9SPVZFUlNJT05fU1BMSVRbMV0sCisgICAgICAgIFZFUlNJT05fUEFUQ0g9VkVSU0lPTl9TUExJVFsyXSwKKyAgICAgICAgKQorCisgICAgY29yZSA9IGJsZCgKKyAgICAgICAgdGFyZ2V0PSdjb3JlLW9iamVjdHMnLAorICAgICAgICBuYW1lPSdjb3JlLW9iamVjdHMnLAorICAgICAgICBmZWF0dXJlcz0nY3h4IHBjaCcsCisgICAgICAgIHNvdXJjZT1ibGQucGF0aC5hbnRfZ2xvYihbJ2NvcmUvKiovKi5jcHAnXSksCisgICAgICAgIHVzZT0ndmVyc2lvbiBCT09TVCBORE5fQ1hYIExJQlJUJywKKyAgICAgICAgaW5jbHVkZXM9Jy4gY29yZScsCisgICAgICAgIGV4cG9ydF9pbmNsdWRlcz0nLiBjb3JlJywKKyAgICAgICAgaGVhZGVycz0nY29tbW9uLmhwcCcsCisgICAgICAgICkKKworICAgIG5mZF9vYmplY3RzID0gYmxkKAorICAgICAgICB0YXJnZXQ9J2RhZW1vbi1vYmplY3RzJywKKyAgICAgICAgbmFtZT0nZGFlbW9uLW9iamVjdHMnLAorICAgICAgICBmZWF0dXJlcz0nY3h4JywKKyAgICAgICAgc291cmNlPWJsZC5wYXRoLmFudF9nbG9iKFsnZGFlbW9uLyoqLyouY3BwJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsPVsnZGFlbW9uL2ZhY2UvZXRoZXJuZXQtKi5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhZW1vbi9mYWNlL3VuaXgtKi5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhZW1vbi9mYWNlL3dlYnNvY2tldC0qLmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGFlbW9uL21haW4uY3BwJ10pLAorICAgICAgICB1c2U9J2NvcmUtb2JqZWN0cyBXRUJTT0NLRVQnLAorICAgICAgICBpbmNsdWRlcz0nZGFlbW9uJywKKyAgICAgICAgZXhwb3J0X2luY2x1ZGVzPSdkYWVtb24nLAorICAgICAgICApCisKKyAgICBpZiBibGQuZW52WydIQVZFX0xJQlBDQVAnXToKKyAgICAgICAgbmZkX29iamVjdHMuc291cmNlICs9IGJsZC5wYXRoLmFudF9nbG9iKCdkYWVtb24vZmFjZS9ldGhlcm5ldC0qLmNwcCcpCisgICAgICAgIG5mZF9vYmplY3RzLnVzZSArPSAnIExJQlBDQVAnCisKKyAgICBpZiBibGQuZW52WydIQVZFX1VOSVhfU09DS0VUUyddOgorICAgICAgICBuZmRfb2JqZWN0cy5zb3VyY2UgKz0gYmxkLnBhdGguYW50X2dsb2IoJ2RhZW1vbi9mYWNlL3VuaXgtKi5jcHAnKQorCisgICAgaWYgYmxkLmVudlsnSEFWRV9XRUJTT0NLRVQnXToKKyAgICAgICAgbmZkX29iamVjdHMuc291cmNlICs9IGJsZC5wYXRoLmFudF9nbG9iKCdkYWVtb24vZmFjZS93ZWJzb2NrZXQtKi5jcHAnKQorCisgICAgYmxkKHRhcmdldD0nYmluL25mZCcsCisgICAgICAgIGZlYXR1cmVzPSdjeHggY3h4cHJvZ3JhbScsCisgICAgICAgIHNvdXJjZT0nZGFlbW9uL21haW4uY3BwJywKKyAgICAgICAgdXNlPSdkYWVtb24tb2JqZWN0cycsCisgICAgICAgICkKKworICAgIHJpYl9vYmplY3RzID0gYmxkKAorICAgICAgICB0YXJnZXQ9J3JpYi1vYmplY3RzJywKKyAgICAgICAgbmFtZT0ncmliLW9iamVjdHMnLAorICAgICAgICBmZWF0dXJlcz0nY3h4JywKKyAgICAgICAgc291cmNlPWJsZC5wYXRoLmFudF9nbG9iKFsncmliLyoqLyouY3BwJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsPVsncmliL21haW4uY3BwJ10pLAorICAgICAgICB1c2U9J2NvcmUtb2JqZWN0cycsCisgICAgICAgICkKKworICAgIGJsZCh0YXJnZXQ9J2Jpbi9ucmQnLAorICAgICAgICBmZWF0dXJlcz0nY3h4IGN4eHByb2dyYW0nLAorICAgICAgICBzb3VyY2U9J3JpYi9tYWluLmNwcCcsCisgICAgICAgIHVzZT0ncmliLW9iamVjdHMnLAorICAgICAgICApCisKKyAgICBmb3IgYXBwIGluIGJsZC5wYXRoLmFudF9nbG9iKCd0b29scy8qLmNwcCcpOgorICAgICAgICBibGQoZmVhdHVyZXM9WydjeHgnLCAnY3h4cHJvZ3JhbSddLAorICAgICAgICAgICAgdGFyZ2V0PSdiaW4vJXMnICUgKHN0cihhcHAuY2hhbmdlX2V4dCgnJykpKSwKKyAgICAgICAgICAgIHNvdXJjZT1bJ3Rvb2xzLyVzJyAlIChzdHIoYXBwKSldLAorICAgICAgICAgICAgdXNlPSdjb3JlLW9iamVjdHMgTElCUkVTT0xWJywKKyAgICAgICAgICAgICkKKworICAgIGJsZC5yZWN1cnNlKCJ0ZXN0cyIpCisKKyAgICBibGQoZmVhdHVyZXM9InN1YnN0IiwKKyAgICAgICAgc291cmNlPSduZmQuY29uZi5zYW1wbGUuaW4nLAorICAgICAgICB0YXJnZXQ9J25mZC5jb25mLnNhbXBsZScsCisgICAgICAgIGluc3RhbGxfcGF0aD0iJHtTWVNDT05GRElSfS9uZG4iLAorICAgICAgICBJRl9IQVZFX0xJQlBDQVA9IiIgaWYgYmxkLmVudlsnSEFWRV9MSUJQQ0FQJ10gZWxzZSAiOyAiLAorICAgICAgICBJRl9IQVZFX1dFQlNPQ0tFVD0iIiBpZiBibGQuZW52WydIQVZFX1dFQlNPQ0tFVCddIGVsc2UgIjsgIikKKworICAgIGlmIGJsZC5lbnZbJ1NQSElOWF9CVUlMRCddOgorICAgICAgICBibGQoZmVhdHVyZXM9InNwaGlueCIsCisgICAgICAgICAgICBidWlsZGVyPSJtYW4iLAorICAgICAgICAgICAgb3V0ZGlyPSJkb2NzL21hbnBhZ2VzIiwKKyAgICAgICAgICAgIGNvbmZpZz0iZG9jcy9jb25mLnB5IiwKKyAgICAgICAgICAgIHNvdXJjZT1ibGQucGF0aC5hbnRfZ2xvYignZG9jcy9tYW5wYWdlcy8qKi8qLnJzdCcpLAorICAgICAgICAgICAgaW5zdGFsbF9wYXRoPSIke01BTkRJUn0vIiwKKyAgICAgICAgICAgIFZFUlNJT049VkVSU0lPTikKKworICAgIGZvciBzY3JpcHQgaW4gYmxkLnBhdGguYW50X2dsb2IoWyd0b29scy8qLnNoJywgJ3Rvb2xzLyoucHknXSk6CisgICAgICAgIGJsZChmZWF0dXJlcz0nc3Vic3QnLAorICAgICAgICAgICAgc291cmNlPSd0b29scy8lcycgJSAoc3RyKHNjcmlwdCkpLAorICAgICAgICAgICAgdGFyZ2V0PSdiaW4vJXMnICUgKHN0cihzY3JpcHQuY2hhbmdlX2V4dCgnJykpKSwKKyAgICAgICAgICAgIGluc3RhbGxfcGF0aD0iJHtCSU5ESVJ9IiwKKyAgICAgICAgICAgIGNobW9kPVV0aWxzLk83NTUsCisgICAgICAgICAgICBWRVJTSU9OPVZFUlNJT04pCisKKyAgICBibGQuaW5zdGFsbF9maWxlcygiJHtEQVRBUk9PVERJUn0vbmRuIiwKKyAgICAgICAgICAgICAgICAgICAgICBibGQucGF0aC5hbnRfZ2xvYigndG9vbHMvbmZkLXN0YXR1cy1odHRwLXNlcnZlci1maWxlcy8qJykpCisKK2RlZiBkb2NzKGJsZCk6CisgICAgZnJvbSB3YWZsaWIgaW1wb3J0IE9wdGlvbnMKKyAgICBPcHRpb25zLmNvbW1hbmRzID0gWydkb3h5Z2VuJywgJ3NwaGlueCddICsgT3B0aW9ucy5jb21tYW5kcworCitkZWYgZG94eWdlbihibGQpOgorICAgIHZlcnNpb24oYmxkKQorCisgICAgaWYgbm90IGJsZC5lbnYuRE9YWUdFTjoKKyAgICAgICAgTG9ncy5lcnJvcigiRVJST1I6IGNhbm5vdCBidWlsZCBkb2N1bWVudGF0aW9uIChgZG94eWdlbicgaXMgbm90IGZvdW5kIGluICRQQVRIKSIpCisgICAgZWxzZToKKyAgICAgICAgYmxkKGZlYXR1cmVzPSJzdWJzdCIsCisgICAgICAgICAgICBuYW1lPSJkb3h5Z2VuLWNvbmYiLAorICAgICAgICAgICAgc291cmNlPVsiZG9jcy9kb3h5Z2VuLmNvbmYuaW4iLAorICAgICAgICAgICAgICAgICAgICAiZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfZm9vdGVyLXdpdGgtYW5hbHl0aWNzLmh0bWwuaW4iXSwKKyAgICAgICAgICAgIHRhcmdldD1bImRvY3MvZG94eWdlbi5jb25mIiwKKyAgICAgICAgICAgICAgICAgICAgImRvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci13aXRoLWFuYWx5dGljcy5odG1sIl0sCisgICAgICAgICAgICBWRVJTSU9OPVZFUlNJT05fQkFTRSwKKyAgICAgICAgICAgIEhUTUxfRk9PVEVSPSIuLi9idWlsZC9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9mb290ZXItd2l0aC1hbmFseXRpY3MuaHRtbCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5nZXRlbnYoJ0dPT0dMRV9BTkFMWVRJQ1MnLCBOb25lKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIi4uL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci5odG1sIiwKKyAgICAgICAgICAgIEdPT0dMRV9BTkFMWVRJQ1M9b3MuZ2V0ZW52KCdHT09HTEVfQU5BTFlUSUNTJywgIiIpLAorICAgICAgICAgICAgKQorCisgICAgICAgIGJsZChmZWF0dXJlcz0iZG94eWdlbiIsCisgICAgICAgICAgICBkb3h5ZmlsZT0nZG9jcy9kb3h5Z2VuLmNvbmYnLAorICAgICAgICAgICAgdXNlPSJkb3h5Z2VuLWNvbmYiKQorCitkZWYgc3BoaW54KGJsZCk6CisgICAgdmVyc2lvbihibGQpCisKKyAgICBpZiBub3QgYmxkLmVudi5TUEhJTlhfQlVJTEQ6CisgICAgICAgIGJsZC5mYXRhbCgiRVJST1I6IGNhbm5vdCBidWlsZCBkb2N1bWVudGF0aW9uIChgc3BoaW54LWJ1aWxkJyBpcyBub3QgZm91bmQgaW4gJFBBVEgpIikKKyAgICBlbHNlOgorICAgICAgICBibGQoZmVhdHVyZXM9InNwaGlueCIsCisgICAgICAgICAgICBvdXRkaXI9ImRvY3MiLAorICAgICAgICAgICAgc291cmNlPWJsZC5wYXRoLmFudF9nbG9iKCdkb2NzLyoqLyoucnN0JyksCisgICAgICAgICAgICBjb25maWc9ImRvY3MvY29uZi5weSIsCisgICAgICAgICAgICBWRVJTSU9OPVZFUlNJT05fQkFTRSkKKworZGVmIHZlcnNpb24oY3R4KToKKyAgICBpZiBnZXRhdHRyKENvbnRleHQuZ19tb2R1bGUsICdWRVJTSU9OX0JBU0UnLCBOb25lKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBDb250ZXh0LmdfbW9kdWxlLlZFUlNJT05fQkFTRSA9IENvbnRleHQuZ19tb2R1bGUuVkVSU0lPTgorICAgIENvbnRleHQuZ19tb2R1bGUuVkVSU0lPTl9TUExJVCA9IFt2IGZvciB2IGluIFZFUlNJT05fQkFTRS5zcGxpdCgnLicpXQorCisgICAgZGlkR2V0VmVyc2lvbiA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBjbWQgPSBbJ2dpdCcsICdkZXNjcmliZScsICctLWFsd2F5cycsICctLW1hdGNoJywgJyVzKicgJSBHSVRfVEFHX1BSRUZJWF0KKyAgICAgICAgcCA9IFV0aWxzLnN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9VXRpbHMuc3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9Tm9uZSwgc3RkaW49Tm9uZSkKKyAgICAgICAgb3V0ID0gc3RyKHAuY29tbXVuaWNhdGUoKVswXS5zdHJpcCgpKQorICAgICAgICBkaWRHZXRWZXJzaW9uID0gKHAucmV0dXJuY29kZSA9PSAwIGFuZCBvdXQgIT0gIiIpCisgICAgICAgIGlmIGRpZEdldFZlcnNpb246CisgICAgICAgICAgICBpZiBvdXQuc3RhcnRzd2l0aChHSVRfVEFHX1BSRUZJWCk6CisgICAgICAgICAgICAgICAgQ29udGV4dC5nX21vZHVsZS5WRVJTSU9OID0gb3V0W2xlbihHSVRfVEFHX1BSRUZJWCk6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBDb250ZXh0LmdfbW9kdWxlLlZFUlNJT04gPSAiJXMtY29tbWl0LSVzIiAlIChDb250ZXh0LmdfbW9kdWxlLlZFUlNJT05fQkFTRSwgb3V0KQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBwYXNzCisKKyAgICB2ZXJzaW9uRmlsZSA9IGN0eC5wYXRoLmZpbmRfbm9kZSgnVkVSU0lPTicpCisKKyAgICBpZiBub3QgZGlkR2V0VmVyc2lvbiBhbmQgdmVyc2lvbkZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIENvbnRleHQuZ19tb2R1bGUuVkVSU0lPTiA9IHZlcnNpb25GaWxlLnJlYWQoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAjIHZlcnNpb24gd2FzIG9idGFpbmVkIGZyb20gZ2l0LCB1cGRhdGUgVkVSU0lPTiBmaWxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHZlcnNpb25GaWxlIGlzIG5vdCBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbkZpbGUucmVhZCgpCisgICAgICAgICAgICBpZiB2ZXJzaW9uID09IENvbnRleHQuZ19tb2R1bGUuVkVSU0lPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIyBubyBuZWVkIHRvIHVwZGF0ZQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgTG9ncy53YXJuKCJWRVJTSU9OIGZpbGUgZXhpc3RzLCBidXQgbm90IHJlYWRhYmxlIikKKyAgICBlbHNlOgorICAgICAgICB2ZXJzaW9uRmlsZSA9IGN0eC5wYXRoLm1ha2Vfbm9kZSgnVkVSU0lPTicpCisKKyAgICBpZiB2ZXJzaW9uRmlsZSBpcyBOb25lOgorICAgICAgICByZXR1cm4KKworICAgIHRyeToKKyAgICAgICAgdmVyc2lvbkZpbGUud3JpdGUoQ29udGV4dC5nX21vZHVsZS5WRVJTSU9OKQorICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CisgICAgICAgIExvZ3Mud2FybigiVkVSU0lPTiBmaWxlIGlzIG5vdCB3cml0ZWFibGUiKQorCitkZWYgZGlzdChjdHgpOgorICAgIHZlcnNpb24oY3R4KQorCitkZWYgZGlzdGNoZWNrKGN0eCk6CisgICAgdmVyc2lvbihjdHgpCg==